icza уже правильно ответила на вашу конкретную проблему, но стоит добавить дополнительное объяснение того, что вы делаете неправильно, поэтому понимаете, как не совершить ошибку в будущем. В Go синтаксис :=
для присваивания создает новые переменные с именами слева от :=
, возможно, затенением пакета или даже с параметрами функции / метода родительской области. В качестве примера:
package main
import "fmt"
var foo string = "global"
func main() {
fmt.Println(foo) // prints "global"
// using := creates a new function scope variable
// named foo that shadows the package scope foo
foo := "function scope"
fmt.Println(foo) // prints "function scope"
printGlobalFoo() // prints "global"
if true {
foo := "nested scope"
fmt.Println(foo) // prints "nested scope"
printGlobalFoo() // prints "global"
}
// the foo created inside the if goes out of scope when
// the code block is exited
fmt.Println(foo) // prints "function scope"
printGlobalFoo() // prints "global"
if true {
foo = "nested scope" // note just = not :=
}
fmt.Println(foo) // prints "nested scope"
printGlobalFoo() // prints "global"
setGlobalFoo()
printGlobalFoo() // prints "new value"
}
func printGlobalFoo() {
fmt.Println(foo)
}
func setGlobalFoo() {
foo = "new value" // note just = not :=
}
Примечание. Go не имеет возможности удалить или отключить переменную, поэтому, как только вы затеняете более широкие переменные области видимости (например, создав переменную области видимости функции с тем же именем, что и переменная области пакета), нет способа получить доступ к более высокой переменной области видимости в этом блоке кода.
Также имейте в виду, что :=
является сокращением для var foo =
. Оба действуют точно так же, однако :=
является допустимым синтаксисом внутри функции или метода, тогда как синтаксис var
действителен всюду.