为什么结构的字段是"非名字" (golang)

时间:2017-11-29 18:55:15

标签: go

此代码不起作用。它抱怨j.Bar是一个非名字":

package main

import "fmt"
import "os"

type foo struct {
    Bar string
    Baz int
}

func main() {
    var j foo

    // this next line fails with "non-name j.Bar on left side of :="
    j.Bar, ok := os.LookupEnv("SOME VAR")
    if ( ! ok ) {
        panic("lookup failed!")
    }
    fmt.Printf("j.Bar is now %s\n",j.Bar)
}

现在我可以轻松改变它了:

package main

import "fmt"
import "os"

type foo struct {
    Bar string
    Baz int
}

func main() {
    var j foo

    val, ok := os.LookupEnv("SOME VAR")
    if ( ! ok ) {
        panic("lookup failed!")
    }
    j.Bar = val
    fmt.Printf("j.Bar is now %s\n",j.Bar)
}

我对#34;非名字"真的感到困惑。错误。 j.Bar是一个字符串。 os.LookupEnv() returns a string为第一个值。那么获取字符串并将其放入字符串变量有什么问题呢?

1 个答案:

答案 0 :(得分:4)

:=运算符同时声明一个新变量,并为其赋值。 j.Bar不是Go中的合法变量名称;变量名称不能包含句点。现在,显然你正在尝试为结构字段赋值,而不是在名称中带有句点的变量(编译器只是不知道它)。你可以这样做,只使用没有声明的作业:

var ok bool
j.Bar, ok = os.LookupEnv("SOME VAR")

或者这样,一次声明两个变量:

bar,ok := os.LookupEnv("SOME VAR")
if ok {
    j.Bar = bar
}

另请参阅:Go tour on short variable declarationsthe spec on short variable declarations