कष्टप्रद त्रुटि से बचने के लिए "घोषित और उपयोग नहीं"


238

मैं सीख रहा हूं लेकिन मुझे लगता है कि यह थोड़ा कष्टप्रद है कि संकलन करते समय, मुझे अप्रयुक्त किसी भी चर या पैकेज को नहीं छोड़ना चाहिए।

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

क्या गो में इस तरह की जाँच से बचने का कोई तरीका है?


1
आप स्वचालित रूप से आपके लिए आयात जोड़ने / हटाने के लिए goimports ( godoc.org/code.google.com/p/go.tools/cmd/goimports ) का भी उपयोग कर सकते हैं।
एलिथर


3
मुझे अभी भी लगता है कि एक कंपाइलर विकल्प "मैं डिबगिंग में सहायता के लिए कुछ टिप्पणी करना चाहता हूं" वर्कफ़्लो के लिए उपयोगी होगा।
RJFalconer

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

यह 2020 है और मुझे विश्वास नहीं हो रहा है कि उन्होंने अभी भी इसे तय नहीं किया है (कंपाइलर फ्लैग के साथ भी नहीं)। मैंने लगभग 5 साल पहले गो में एक प्रोजेक्ट किया था और कुल मिलाकर भाषा को पसंद किया था लेकिन यह मेरे लिए पूरी तरह से अनुपयोगी था। जिस तरह से मैं कोड कर रहा हूं मैं लगातार टिप्पणी कर रहा हूं / सामान को परेशान कर रहा हूं, इसलिए गो में यह "सुविधा" चीजों को मेरे लिए दोगुना समय देता है ... मैं तब से हर कुछ महीनों में वापस देख रहा हूं, यह देखने के लिए कि क्या कारण की भावना खत्म हो गई है जाओ टीम, और अब तक कोई भाग्य नहीं है ... बेकार है। यह एक महान भाषा है अन्यथा मैं इसे और अधिक उपयोग करना पसंद करूंगा, लेकिन वर्तमान में यह मेरे लिए उपयोग करने योग्य नहीं है।
रुसलान

जवाबों:


234

यह त्रुटि यहां आपको बेहतर कोड लिखने के लिए मजबूर करने के लिए है, और आपके द्वारा घोषित या आयात की जाने वाली सभी चीजों का उपयोग करना सुनिश्चित करें। अन्य लोगों द्वारा लिखे गए कोड को पढ़ना आसान बनाता है (आप हमेशा सुनिश्चित हैं कि सभी घोषित चर का उपयोग किया जाएगा), और कुछ संभावित मृत कोड से बचें।

लेकिन, यदि आप वास्तव में इस त्रुटि को छोड़ना चाहते हैं, तो आप रिक्त पहचानकर्ता ( _) का उपयोग कर सकते हैं :

package main

import (
    "fmt" // imported and not used: "fmt"
)

func main() {
    i := 1 // i declared and not used
}

हो जाता है

package main

import (
    _ "fmt" // no more error
)

func main() {
    i := 1 // no more error
    _ = i
}

जैसा कि नीचे टिप्पणियों में कोस्टिक्स द्वारा कहा गया है, आप FAQ में गो टीम की आधिकारिक स्थिति पा सकते हैं :

अप्रयुक्त चर की उपस्थिति बग का संकेत दे सकती है, जबकि अप्रयुक्त आयात संकलन को धीमा कर देता है। अपने कोड ट्री में पर्याप्त अप्रयुक्त आयात मान लें और चीजें बहुत धीमी हो सकती हैं। इन कारणों से, गो न तो अनुमति देता है।


90
फिर भी, यह टिप्पणी करने से अलग नहीं है। और, मैं समझता हूं कि यह बेहतर कोड के लिए है, लेकिन क्या यह बेहतर होगा कि हम चेक को बंद कर सकते हैं कि हमारे कोड पर परीक्षण क्यों कर रहे हैं और फिर कोड को समाप्त करने और इसे साफ करने के लिए इस चेक को फिर से खोलें?
ए-लेटबी

21
@kostix वेल .. यह आपको धीमा नहीं कर सकता क्योंकि आप एक विशेषज्ञ हो सकते हैं लेकिन यह मेरे लिए है और जिस तरह से मैं कोडिंग कर रहा हूं। अगर बेहतर तरीका है तो मैं सोच रहा हूं। लेकिन वैसे भी, अक्सर पूछे जाने वाले प्रश्न के लिए धन्यवाद! इसे पढ़कर, मैं पूरी तरह से समझ सकता हूं कि गोलंग इस तरह से क्या कर रहे हैं।
ए-लेटबी

20
क्या इसे बंद करने के लिए कमांड-लाइन तर्क है? या यह एक संयुक्त राष्ट्र की विशेषता है?
एथन बिएरेलिन

26
एफडब्ल्यूआईडब्ल्यू, मेरे पास दूसरों के कोड पढ़ने का बुरा समय है, लेकिन निश्चित रूप से अप्रयुक्त प्रतीकों के कारण नहीं। OTOH, मैंने आज * *% $ golang "सुविधा" से निपटने के लिए जाँच के तरीकों में एक घंटा खो दिया।
टॉरस्ट ब्रोंगर

24
अफसोस की बात है कि यह उत्तर सही है - लेकिन यह उचित नहीं है। कोड में जाँच और बस इसे निष्पादित करने के बीच अंतर की दुनिया है। जब हम कोड में जांच करते हैं, तो हम इस तरह की त्रुटि को पकड़ने के लिए लिंटर का उपयोग करते हैं। जब हम तेजी से विकास के दौरान निष्पादित करते हैं, तो हमारे पास समान मानक नहीं होते हैं। लिंटर से कंपाइलर को भ्रमित करना अक्षम्य है। यहां तक ​​कि Google के अंदर की स्टाइल पुलिस भी वह गलती नहीं करती है।
ट्रैविस विल्सन

29

आप इसके लिए एक सरल "अशक्त कार्य" का उपयोग कर सकते हैं, उदाहरण के लिए:

func Use(vals ...interface{}) {
    for _, val := range vals {
        _ = val
    }
}

जिसका आप उपयोग कर सकते हैं:

package main

func main() {
    a := "declared and not used"
    b := "another declared and not used"
    c := 123

    Use(a, b, c)
}

है भी इस के लिए एक पैकेज ताकि आप को परिभाषित करने की जरूरत नहीं है Useसमारोह हर बार:

import (
  "github.com/lunux2008/xulu"
)

func main() {
  // [..]

  xulu.Use(a, b, c)
}

29

एफएक्यू के अनुसार :

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

कोई चेतावनी नहीं होने के दो कारण हैं। पहले, अगर यह शिकायत करने लायक है, तो यह कोड में फिक्सिंग के लायक है। (और अगर यह तय करने लायक नहीं है, तो यह ध्यान देने योग्य नहीं है।) दूसरा, संकलक चेतावनी उत्पन्न करने से कमजोर मामलों के बारे में चेतावनी देने के लिए कार्यान्वयन को प्रोत्साहित करता है जो संकलन शोर कर सकते हैं, जो वास्तविक त्रुटियों को ठीक करना चाहिए।

जरूरी नहीं कि विभिन्न कारणों से मैं इससे सहमत हूं। यह वही है जो निकट भविष्य में बदलने की संभावना है।

पैकेज के लिए, वहाँ goimportsउपकरण है जो स्वचालित रूप से लापता पैकेज जोड़ता है और अप्रयुक्त को हटा देता है। उदाहरण के लिए:

# Install it
$ go get golang.org/x/tools/cmd/goimports

# -w to write the source file instead of stdout
$ goimports -w my_file.go

आपको इसे किसी भी आधे-अधूरे सभ्य संपादक से चलाने में सक्षम होना चाहिए - उदाहरण के लिए विम:

:!goimports -w %

goimportsपेज सूचियों अन्य संपादकों के लिए कुछ आदेश, और आप आम तौर पर यह सेट स्वचालित रूप से डिस्क के लिए बफर बचाने के लिए जब आप चलाने के लिए।

ध्यान दें कि goimportsयह भी चलेगा gofmt


जैसा कि पहले ही उल्लेख किया गया था, चर के लिए सबसे आसान तरीका है (अस्थायी रूप से) उन्हें असाइन करें _:

// No errors
tasty := "ice cream"
horrible := "marmite"

// Commented out for debugging
//eat(tasty, horrible)

_, _ = tasty, horrible

9

अब तक उल्लेखित एक कोण कोड को संपादित करने के लिए इस्तेमाल किया जाने वाला उपकरण सेट है।

कहा जाता है कि lukehoban से एक्सटेंशन के साथ विजुअल स्टूडियो कोड का उपयोग करना आपके लिए कुछ ऑटो-मैजिक करेगा। गो एक्सटेंशन स्वचालित रूप से चलाता है , आदि, और प्रविष्टियों को हटाता है और जोड़ता हैGogofmtgolintimport । तो कम से कम वह हिस्सा अब स्वचालित है।

मैं इसके 100% प्रश्न का हल नहीं मानूंगा, लेकिन फिर भी यह काफी उपयोगी है।


8

यदि दूसरों को इस बारे में समझने में कठिन समय लगता है, तो मुझे लगता है कि इसे बहुत ही सरल शब्दों में समझाने में मदद मिल सकती है। यदि आपके पास एक चर है जिसका आप उपयोग नहीं करते हैं, उदाहरण के लिए एक फ़ंक्शन जिसके लिए आपने मंगलाचरण (एक सामान्य उपयोग-मामला) टिप्पणी की है:

myFn := func () { }
// myFn()

आप फ़ंक्शन को एक बेकार / रिक्त चर असाइन कर सकते हैं ताकि यह अब अप्रयुक्त न हो :

myFn := func () { }
_ = myFn
// myFn()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.