गोलंग अप्रयुक्त आयात त्रुटि को कैसे निष्क्रिय करें


98

डिफ़ॉल्ट रूप से, Go अप्रयुक्त आयात को त्रुटि के रूप में मानता है, जिससे आप आयात को हटा सकते हैं। मैं यह जानना चाहता हूं कि क्या इस व्यवहार में बदलाव की कोई आशा है, जैसे कि इसे चेतावनी को कम करना।

मुझे यह समस्या बेहद कष्टप्रद लगती है, मुझे गो में कोडिंग का आनंद लेने से रोकती है।

उदाहरण के लिए, मैं कुछ कोड का परीक्षण कर रहा था, जो एक खंड / कार्य को अक्षम कर रहा था। एक परिवाद से कुछ कार्यों का अब उपयोग नहीं किया जाता है (उदाहरण के लिए fmt, त्रुटियां, जो भी हो), लेकिन मुझे थोड़े परीक्षण के बाद फ़ंक्शन को फिर से सक्षम करना होगा। जब तक मैं उन आयातों को नहीं हटाता, तब तक यह कार्यक्रम संकलित नहीं होगा, और कुछ मिनटों के बाद मुझे फिर से आयात करने की आवश्यकता है।

जीएई कार्यक्रम विकसित करते समय मैं बार-बार इस प्रक्रिया को कर रहा था।


1
अपने कोड में अप्रयुक्त आयात को छोड़ना एक अच्छा विचार नहीं है, लेकिन आप उन्हें अस्थायी रूप से टिप्पणी कर सकते हैं।
एलीथ्रार

72
मैं मानता हूं कि अप्रयुक्त आयात को छोड़ना अच्छा नहीं है, लेकिन प्रोग्रामर के अनावश्यक रूप से इस तरह के कामों को करने की कोशिश को बेकार करना एक बुरा विचार है। उन डाउन प्रशंसकों को मेरे वोट टू गो के प्रति मेरे दृष्टिकोण के लिए होना चाहिए।
निक

6
यह एक विशेषता है, बग नहीं
बीटगैमिट

1
अप्रयुक्त आयात को हटाना एक अच्छी बात है। कई स्टाइल गाइड हैं जिन्हें सभी चेतावनियों को त्रुटियों के रूप में माना जाता है, इसलिए एक नई चेतावनी जोड़ना आम तौर पर एक बुरा विचार है। शायद एक -देव ध्वज संभव समझौता हो सकता है, लेकिन var _ = <module>.Functionयह ठीक काम करता है और इसे सामान्य व्यवहार से रोकने के लिए पर्याप्त है।
deft_code

1
जैसा कि नीचे दिए गए उत्तर में कोई व्यक्ति छू रहा है, मैं या तो एक आईडीई का उपयोग करने की सलाह देता हूं जो आयात करता है (गोगलैंड, लाइटाइड, आदि - कई हैं), या goimportsआपकी निर्माण प्रक्रिया में एक कदम के रूप में है। उन दोनों के बिना यह वास्तव में तेजी से पुराना हो जाता है।
जोसेफ ग्राहन

जवाबों:


37

_पैकेज नाम से पहले एक अंडरस्कोर ( ) जोड़ना अप्रयुक्त आयात त्रुटि को अनदेखा करेगा।

यहाँ एक उदाहरण है कि आप इसका उपयोग कैसे कर सकते हैं:

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

केवल इसके साइड-इफेक्ट्स (इनिशियलाइज़ेशन) के लिए किसी पैकेज को आयात करने के लिए, खाली पैकेज नाम के रूप में रिक्त पहचानकर्ता का उपयोग करें।

Https://golang.org/ref/spec#Import_declarations पर अधिक देखें


यह सही जवाब है। GoLang विनिर्देशन Doc के आधार पर, इसका उपयोग केवल साइड-इफेक्ट्स (आरंभीकरण) के लिए एक पैकेज को आयात करने के लिए किया जाना है। GoLang युक्ति डॉक्टर यहाँ: golang.org/ref/spec#Import_declarations
विल

बस शानदार। यह शीर्ष दस चीजों की सूची में होना चाहिए जो गोलंग के नए देवों को जानना चाहिए। धन्यवाद!
जेएम जेनजन

11
बहुत उपयोगी नहीं है। इसके साथ समस्या यह है कि यदि आप बाद में फिर से आयात का उपयोग करना चाहते हैं, तो आपको इसे हटा देना चाहिए _(अन्यथा पैकेज को संदर्भित नहीं किया जा सकता है, क्योंकि इसका कोई नाम नहीं है)। यदि आप ऐसा करने जा रहे हैं, तो आप इसे केवल टिप्पणी / असहज कर सकते हैं। var _ = ...चाल इस समस्या नहीं है।
EM0

यदि आप "fmt"गोगलैंड में अंडरस्कोर जोड़ते हैं , तो यह स्वचालित रूप से जोड़ता है "fmt"ताकि आपके पास दोनों _"fmt"और "fmt", जो इस आईडीई में बेकार हो जाए
kramer65

26

var _ = fmt.Printfचाल यहाँ उपयोगी है।


मुझे यह समाधान पसंद है। यह अवांछनीय बनाने के लिए बदसूरत पर्याप्त है, लेकिन यह काम करता है इसलिए यदि आपको वास्तव में इसकी आवश्यकता है तो यह वहां है।
deft_code

3
अधिक जानकारी के लिए कृपया इस लिंक को देखें। golang.org/doc/effective_go.html#blank_unused
दीपक सिंह रावत

3
यह इस समय मददगार है, लेकिन जब मैंने इस तकनीक का उपयोग किया तो मैं वापस नहीं जाने के लिए और अप्रयुक्त रिक्त पहचानकर्ता को बाद में हटाने का प्रयास किया, जिससे जब मैं वास्तव में लंबे समय में उनका उपयोग करने का इरादा नहीं करता था, तो इधर-उधर आयात करना पड़ा। Goimports जैसे टूल का उपयोग करने से वास्तविक समस्या हल हो गई है और यह सुनिश्चित करता है कि मेरे आयात हमेशा न्यूनतम और स्वच्छ हों।
mdwhatcott

फिर भी मेरी राय में एक बेवकूफ हैक, हालांकि शायद करने के लिए सबसे कुशल बात।
एन्थोनी

+1 क्योंकि यह फ़ाइल में कहीं भी किया जा सकता है , जो आम तौर पर एक भयानक विचार होगा, लेकिन importजब आप सिर्फ संकलन या परीक्षण करने की कोशिश कर रहे हों, तो कथन और विवरण के लिए फाइल के चारों ओर कूदने से बचाने के लिए वास्तव में उपयोगी है। कुछ कोड फ़ाइल जिसे आप पुनरावृत्त कर रहे हैं ।
mtraceur

22

मेरी भी यही समस्या है। मैं इसका तर्क समझता हूं कि उन्होंने अप्रयुक्त आयातों और चर को अस्वीकार करने के लिए भाषा को क्यों लागू किया, लेकिन मुझे यह सुविधा व्यक्तिगत रूप से इस कोड को लिखते समय कष्टप्रद लगती है। इसके चारों ओर पाने के लिए, मैंने अपने संकलक के चारों ओर अपने कोड में अप्रयुक्त चर और आयात की अनुमति के लिए वैकल्पिक झंडे लगाने की अनुमति दी।

यदि आप रुचि रखते हैं, तो आप इसे https://github.com/dtnewman/modified_golang_compiler पर देख सकते हैं ।

अब, मैं केवल एक कमांड के साथ कोड चला सकता हूं जैसे कि go run -gcflags '-unused_pkgs' test.go। और यह इन "अप्रयुक्त आयात" त्रुटियों को नहीं फेंक देगा। अगर मैं इन झंडों को छोड़ देता हूं, तो यह अप्रयुक्त आयातों की अनुमति नहीं देने के डिफ़ॉल्ट पर लौटता है।

ऐसा करने के लिए केवल कुछ सरल परिवर्तनों की आवश्यकता थी। गो शुद्धतावादी शायद इन परिवर्तनों से खुश नहीं होंगे क्योंकि अप्रयुक्त चर / आयात की अनुमति नहीं देने का अच्छा कारण है, लेकिन मैं व्यक्तिगत रूप से आपसे सहमत हूं कि यह मुद्दा गो में कोड करने के लिए बहुत कम सुखद बनाता है यही कारण है कि मैंने इन परिवर्तनों को अपने लिए बदल दिया है संकलक।


2
मैंने 1.6 रिलीज़ के साथ भी ऐसा ही किया है, अगर दिलचस्पी है तो यहाँ देखें: github.com/ronelliott/go/tree/release-branch.go1.6 नोट: कुछ परीक्षण विफल होंगे
Ron E

2
मुझे इसके पीछे के विचार से प्यार है। मैं देख रहा हूं कि आप कांटे अभी भी संस्करण 1.2 पर हैं, जो इसे बेकार बनाता है। इसे मानक गो संकलक में शामिल किया जाना चाहिए, कम से कम इतना है कि go run main.goत्रुटियों को डिफ़ॉल्ट रूप से अक्षम करता है, जबकि go buildत्रुटियों को सक्षम करता है। इस तरह से इसका उपयोग करना विकसित करना आसान है go runऔर जब उत्पादन के लिए निर्माण का समय होता है, तो आप अभी भी अपने कोड को साफ करने के लिए मजबूर होते हैं।
kramer65

17

गोइमपोर्ट का उपयोग करें । यह मूल रूप से एक कांटा है gofmt, जो ब्रैड फिट्ज़पैट्रिक द्वारा लिखा गया है और अब गो टूल्स पैकेज में शामिल है। जब भी आप किसी फ़ाइल को सहेजते हैं, तो उसे चलाने के लिए आप अपने संपादक को कॉन्फ़िगर कर सकते हैं। आपको इस समस्या के बारे में फिर से चिंता करने की आवश्यकता नहीं है।


5

यदि आप fmtविकसित और परीक्षण करते समय कंसोल के लिए सामान्य मुद्रण के लिए पैकेज का उपयोग कर रहे हैं तो आपको लॉग पैकेज में बेहतर समाधान मिल सकता है ।


5
या बिल्टिन फ़ंक्शन printlnजिसे लोग हमेशा भूल जाते हैं।
MatrixFrog

2
@ मेट्रिक्सफ्रॉग लंबे समय में, इन कार्यों को बनाने के लिए एक अच्छा विचार नहीं है क्योंकि वे समय के साथ गायब हो सकते हैं। लॉग का उपयोग करना एक अच्छा विचार है क्योंकि आप इन्हें रख सकते हैं और यह मानक पुस्तकालय का हिस्सा है और इसे हटाए जाने की संभावना नहीं है। देखें कल्पना जानकारी के लिए।
नीमो

1
बिलिन println?? यह मेरे लिए समाचार है। क्या यह अनिर्दिष्ट है? मेरे द्वारा इसे कहीं भी ढूंढा जा सकता है।
मैट

1
@ नीमो अच्छी बात। जब आप किसी चीज़ को त्वरित एक-बंद के रूप में प्रिंट करना चाहते हैं, तो वे एकदम सही हैं, लेकिन आप वास्तव में इसे जांचने का इरादा नहीं रखते हैं। संभवतः किसी अन्य मामले में उनका उपयोग करने के लिए अच्छा नहीं है।
MatrixFrog

1
@MartinTournoij - मैं असहमत हूं। यह वह समाधान था जो मैंने अंततः पाया जब मेरे पास यह मुद्दा 5 साल पहले था और 5+ अपवोट्स के साथ यह स्पष्ट रूप से दूसरों की मदद करता था। मैं fmtलॉगिंग के लिए पैकेज का उपयोग करके एक नौसिखिया था , इस बात से अनजान कि एक तैयार लॉगिंग पैकेज था।
OldCurmudgeon

5

कुछ कोड टिप्पणीif false { ... } करने के लिए उपयोग करें । ब्रेसिज़ के अंदर का कोड वाक्यविन्यास रूप से सही होना चाहिए, लेकिन अन्यथा बकवास कोड हो सकता है।


3
वाक्य-रचना से अधिक सही, किसी भी संदर्भित चर (जैसे foo.Bar) का अस्तित्व होना चाहिए, इत्यादि
ड्रैगन

यह बहुत साफ या मुहावरेदार नहीं है। एक कारण है कि गो को जिस तरह से डिजाइन किया गया था
एसिडिक

1
यह एक अच्छी तकनीक है जब कोई व्यक्ति केवल स्क्रिप्ट विकसित करने या गोलंग में एपीआई की खोज करते समय चीजों को आज़मा रहा है। शुक्रिया टॉपस्किप!
जे टेलर ११

2

बहुत से लोग पहले से ही वैध औचित्य के साथ टिप्पणी कर चुके हैं और मैं मूल लेखक के इरादे को भी स्वीकार करता हूं। हालांकि, रॉब पाइक ने विभिन्न मंचों में उल्लेख किया है कि गो उन प्रक्रियाओं के सरलीकरण का परिणाम है जो मुख्यधारा की कुछ अन्य प्रोग्रामिंग भाषाओं में या तो कमी है या हासिल करना आसान नहीं है। यह गो की भाषा शब्दार्थ है और साथ ही संकलन को तेज करने के लिए, बहुत सी चीजें हैं जो अपनाई जाती हैं जो शुरू में अक्षम लगती हैं।

इसे छोटा करने के लिए, अप्रयुक्त आयातों को गो में त्रुटियों के रूप में माना जाता है क्योंकि यह कार्यक्रम को धता बताता है और संकलन को धीमा कर देता है। साइड इफेक्ट के लिए आयात (_) का उपयोग करना एक वर्कअराउंड है, हालांकि, मुझे यह भ्रमित समय लगता है जब साइड इफेक्ट्स के साथ वैध आयातों का मिश्रण होता है, विशेष रूप से डिबगिंग / परीक्षण के उद्देश्य के लिए विशुद्ध रूप से आयात किए गए साइड कोड के साथ। बड़े और अनजाने में भूलने और न हटाने का एक मौका है जो बाद में अन्य इंजीनियरों / समीक्षकों को भ्रमित कर सकता है। मैं अप्रयुक्त लोगों पर टिप्पणी करता था, हालांकि, वीएस कोड और गोलैंड जैसे लोकप्रिय आईडीई goimportsआसानी से उपयोग कर सकते हैं जो आयातों का सम्मिलन और विलोपन करता है। कृपया अधिक जानकारी के लिए लिंक देखें, https://golang.org/doc/effective_go.html#blank_import


इसके लिए धन्यवाद! मैं स्पष्ट रूप से साइड-इफ़ेक्ट के लिए आयात करने के एक ठोस उदाहरण के रूप में आपकी प्रतिक्रिया में पोस्ट किए गए URL से कोड की लाइन को स्पष्ट रूप से कॉपी-पेस्ट करने का सुझाव दूंगा: import _ "net/http/pprof"
ड्रैगन

1
आपके सुझाव के लिए धन्यवाद @Dragon! चूंकि मैं एक नया योगदानकर्ता हूं, आप जैसे लोगों की मदद से, मैं अपने पदों के साथ जल्दी से बेहतर हो जाऊंगा।
sbcharr

-1

इसे अपने दस्तावेज़ के शीर्ष पर रखें और अप्रयुक्त आयातों के बारे में भूल जाएँ:

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs

1
संकलक बनाने के बजाय यदि आप वास्तव में ऐसा करना चाहते हैं तो डेड कोड जनरेट करें, _इसके बजाय वैश्विक चर का उपयोग करें (जैसे या तो प्रति पंक्ति एक पैकेज या यदि आप जोर देते हैं, सभी एक साथ जैसे:) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs। लेकिन यह मत करो, बस का उपयोग करें goimports
डेव सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.