【问题标题】:Why is a struct's field a "non-name" [duplicate]为什么结构的字段是“非名称”[重复]
【发布时间】:2019-10-03 04:03:26
【问题描述】:

此代码不起作用。它抱怨 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)
}

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

【问题讨论】:

标签: go


【解决方案1】:

:= 运算符同时声明一个新变量,并为其赋值。 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

【讨论】:

  • 太棒了,完美的解释:)
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2020-12-09
  • 2021-04-30
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多