के बाईं ओर कोई नया चर नहीं: =


104

यहाँ क्या हो रहा है?

package main

import "fmt"

func main() {

    myArray  :=[...]int{12,14,26}  ;     
    fmt.Println(myArray)

    myArray  :=[...]int{11,12,14} //error pointing on this line 

    fmt.Println(myArray) ;

}

यह कहते हैं कि एक त्रुटि फेंकता है

no new variables on left side of :=

मैं जो कर रहा था वह पहले से घोषित चर पर फिर से मान असाइन कर रहा था।


कोशिशmyArray,x = [...]int{11,12,14},3
श्री लू

जवाबों:


138

colon :दूसरे स्टेटमेंट से हटाएं क्योंकि आप मौजूदा वैरिएबल को नया मान दे रहे हैं।

myArray = [...]int{11,12,14}

colon :का उपयोग तब किया जाता है जब आप पहली बार लघु घोषणा और असाइनमेंट करते हैं जैसा कि आप अपने पहले कथन में कर रहे हैं myArray :=[...]int{12,14,26}


26

वहाँ बार में काम ऑपरेटरों के दो प्रकार हैं :=और =। वे शब्दशः समतुल्य हैं (असाइनमेंट के संबंध में) लेकिन पहला भी एक "शॉर्ट वैरिएबल डिक्लेरेशन" है ( http://golang.org/ref/spec#Short_variable_declarations ) जिसका अर्थ है कि बाएं में कम से कम एक होने की आवश्यकता है सही होने के लिए नई चर घोषणा।

आप दूसरे को एक साधारण असाइनमेंट स्टेटमेंट में बदल सकते हैं :=-> =या यदि आप अपने एल्गोरिथ्म के साथ ठीक हैं तो आप एक नए वेरिएबल का उपयोग कर सकते हैं।


और के :=साथ इस्तेमाल नहीं किया जा सकता है _? जैसे_ := someFunc()
stt106

7

एक साइड नोट के रूप में, पुनर्वितरण केवल एक बहु-चर लघु घोषणा में दिखाई दे सकता है

भाषा विनिर्देश से उद्धरण:

नियमित रूप से परिवर्तनीय घोषणाओं के विपरीत, एक लघु चर घोषणाएं वैरिएबल को फिर से विभाजित कर सकती हैं बशर्ते कि वे मूल रूप से एक ही ब्लॉक में पहले एक ही प्रकार के साथ घोषित किए गए हों, और कम से कम गैर-रिक्त चर में से एक नया हो। परिणामस्वरूप, पुनर्वितरण केवल एक बहु-चर लघु घोषणा में दिखाई दे सकता है। Redeclaration एक नए चर का परिचय नहीं देता है; यह सिर्फ मूल को एक नया मान प्रदान करता है।

package main

import "fmt"


func main() {
    a, b := 1, 2
    c, b := 3, 4

    fmt.Println(a, b, c)
}

यहाँ गोलांग में चर के पुनर्वितरण के बारे में एक बहुत अच्छा उदाहरण है: https://stackoverflow.com/a/27919847/4418897


नोट के लिए धन्यवाद। मैंने एक बहु-चर लघु घोषणा से भ्रमित किया है, यह बताता है कि क्यों।
ली जिनोय डिक

7
myArray  :=[...]int{12,14,26}

जैसा कि पिछले टिप्पणीकारों ने कहा है, :=एक प्रकार का शॉर्ट-हैंड और / या वैरिएबल डिक्लेरेशन का शॉर्ट-फॉर्म है ।

तो ऊपर के स्टेटमेंट में आप दो काम कर रहे हैं।

  1. आप अपने चर को myArray घोषित कर रहे हैं ।
  2. आप कर रहे हैं बताए करने के लिए पूर्णांकों की एक सरणी myArray चर।

आपके कोड का दूसरा भाग विफल हो जाता है, क्योंकि आप यहां क्या कर रहे हैं:

myArray  :=[...]int{11,12,14} //error pointing on this line 

मौजूदा चर myArray को RE- घोषित कर रहा है , जिसमें पहले से ही पूर्णांक मान हैं।

यह काम:

myArray = [...]int{11,12,14} // NO error will be produced by this line

यह किया गया है, बताए मौजूदा (पूर्व घोषित / प्रारंभ) अलग-अलग करने के लिए पूर्णांक सरणी।

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