2014-05-08 14 views
11

Questo programma Go non verrà compilato. Si getta l'errore global_var declared and not usedAssegnazione inline variabile globale con operatore di dichiarazione/assegnazione combinato e un'altra variabile non dichiarata che perde l'ambito?

package main 

import "log" 

var global_var int 

func main() { 

    global_var, new_string := returnTwoVars() 

    log.Println("new_string: " + new_string) 
} 

func returnTwoVars() (int, string) { 
    return 1234, "woohoo" 
} 

func usesGlobalVar() int { 
    return global_var * 2 
} 

Tuttavia, quando rimuovo la necessità di utilizzare l'operatore := dichiarando new_string nella funzione principale e semplicemente utilizzando =, il compilatore non ha un problema con visto che global_var viene dichiarata a livello globale e utilizzato altrove nel programma. La mia intuizione mi dice che dovrebbe sapere che global_var è già dichiarato

risposta

13

Il compilatore non si lamenta del global_var esterno principale. Lo si lamenta solo del nuovo global_var nel numero principale che non si utilizza. Che è possibile controllare guardando il numero di riga che riporta go.

È possibile provare un programma vuoto con un global_var all'esterno di qualsiasi funzione che non fa riferimento a nessuno: non ci sono problemi lì. E, naturalmente, la funzione usesGlobalVar che fa riferimento al simbolo globale effettivo non ha nulla a che fare con quella creata in main.

+4

Cerca "golang shadowing". Se si dichiara nuovamente un nome da un ambito esterno in uno interno, si ha una nuova variabile. Spesso, come qui, è confuso. – twotwotwo

+3

Suppongo che: = dichiarerà qualsiasi variabile che non è dichiarata nell'ambito locale. Sembra ambiguo ma immagino che sia proprio come stanno le cose. – BlinkyTop