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

This code does not work. It complains that j.Bar is a "non-name":

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
",j.Bar)
}

Now I can change it easily to work:

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
",j.Bar)
}

I'm really puzzled by the "non-name" error. j.Bar is a string. os.LookupEnv() returns a string as its first value. So what is the problem with taking a string and putting it into a string variable?

The := operator simultaneously declares a new variable, and assigns a value to it. j.Bar is not a legal variable name in Go; variable names cannot contain periods. Now, obviously you're trying to assign a value to a struct field, not a variable with a period in its name (the compiler just doesn't know it). You can do this, using just assignment without declaration:

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

Or this, declaring two variables at once:

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

See also: Go tour on short variable declarations and the spec on short variable declarations.