为什么结构的字段是“非名称”

rai*_*308 1 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)
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以轻松更改它以使其正常工作:

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)
}
Run Code Online (Sandbox Code Playgroud)

我真的对“非名称”错误感到困惑。j.Bar是一个字符串。 os.LookupEnv()返回一个字符串作为其第一个值。那么采用字符串并将其放入字符串变量有什么问题呢?

Adr*_*ian 5

:=运营商同时宣布了新的变量和值分配给它。j.Bar在Go中不是合法的变量名;变量名称不能包含句点。现在,显然,您正在尝试将一个值分配给struct字段,而不是为其名称加上句号的变量(编译器只是不知道)。您可以只使用赋值而无需声明:

var ok bool
j.Bar, ok = os.LookupEnv("SOME VAR")
Run Code Online (Sandbox Code Playgroud)

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

bar,ok := os.LookupEnv("SOME VAR")
if ok {
    j.Bar = bar
}
Run Code Online (Sandbox Code Playgroud)

另请参见:简短变量声明简短变量声明的规范