2013-06-14 8 views
10

Non riesco a trovare la risposta da nessuna parte, quindi questa è la situazione:Vai: dichiara una nuova variabile e sovrascrive una variabile da un ambito superiore, come?

// err has not yet been declared here 
globalVar := "string" 
if globalVar == "string" { 
    globalVar, err := doSomethingWithString() 
    if err != nil { 
     // error handling 
    } 
} 

Quella seconda dichiarazione globalVar dà un errore sia poi := e quando '=' viene usato:

  • Con := si dice globalVar declared and not used perché ora globalVar è una nuova variabile nell'ambito interno.
  • con = dice undefined err perché non è stato ancora dichiarato.

Quindi, fondamentalmente, ci dovrebbe essere un modo per definire la differenza tra = e := per ciascuna variabile sul lato sinistro della dichiarazione.

vedo due possibili soluzioni, che sono entrambi ugualmente brutto a mio parere:

// err has not yet been declared here 
globalVar := "string" 
if globalVar == "string" { 
    globalVar2, err := doSomethingWithString() 
    if err != nil { 
     // error handling 
    } 
    globalVar = globalVar2 
} 

o

globalVar := "string" 
var err error 
if globalVar == "string" { 
    globalVar, err = doSomethingWithString() 
    if err != nil { 
     // error handling 
    } 
} 

Devo usare uno di questi work-around o c'è una corretta modo di ottenere ciò di cui ho bisogno?

La seconda soluzione sembra la meno brutta, ma se ci sono molte variabili necessarie solo in ambito if, queste variabili non verranno rimosse dopo l'ambito e persistono per l'intero ambito esterno. Quindi la prima soluzione sembra la migliore secondo me.

Ma mi piacerebbe sentire come gli altri risolvono questa situazione ...

+3

Nella tua seconda soluzione (che in realtà è corretta), devi sostituire 'err: = errors.New (" ")' con 'var err error'. Non c'è bisogno di creare un nuovo errore vuoto, lascia che sia zero. – ANisus

+0

Grazie, lo rende già un po 'più pulito. Ma è il metodo più "corretto" per farlo? –

+0

: = fa ciò che dice, che è dichiarare e assegnare a nuove variabili. Si desidera che funzioni come: = per parte dei valori di ritorno e = per l'altro, in base a quanto dichiarato in precedenza. Quindi, ciascuno: = sarebbe soggetto ad analisi: dichiara e assegna o assegna solo? Sarebbe incoerente, imho. – JimPaek

risposta

10

Basta non utilizzare: = in questo caso e predichiarare sia globalVar e err.

var (
    globalVar string 
    err error 
) 

globalVar = "string" 
if globalVar == "string" { 
    globalVar, err = doSomethingWithString() 
    if err != nil { 
     // error handling 
    } 
} 

o in alternativa se si vuole limitare l'ambito di err:

globalVar := "string" 
if globalVar == "string" { 
    var err error 
    globalVar, err = doSomethingWithString() 
    if err != nil { 
     // error handling 
    } 
} 

http://play.golang.org/p/73bF_tHYsC per un esempio simile alla risposta precedente.

: = è inteso come comodità quando si desidera dichiarare e assegnare in una dichiarazione. Se si intromette semplicemente non usarlo.

+0

Quest'ultima soluzione è una che non ho pensato. Sembra essere il migliore per me ora. Grazie! –

+0

Mi ha salvato da strappare i capelli con quella che doveva essere una connessione TCP riutilizzabile! Grazie! – kouton