【问题标题】:When to use var or := in Go? [duplicate]何时在 Go 中使用 var 或 :=? [复制]
【发布时间】:2019-04-23 13:32:43
【问题描述】:

下面两个例子有区别吗?

type Example struct {}

func main() {
  e := Example{}
}

对比

type Example struct {}

func main() {
  var e Example
}

有更好的吗?

谢谢!

【问题讨论】:

  • 在您的示例中,这两种情况同样有效,因为两者都导致Example 类型的默认值。我更喜欢使用 := 语法,因为大多数情况下您不会使用默认值初始化变量。
  • 它们是相同的。这是一个风格的事情。如果我不打算初始化变量,我使用var,如果我要初始化它(即,零值以外的值),我使用:=

标签: go


【解决方案1】:

var 主要用于在共享范围内定义变量。例如,

var something string

func init() {
    something = "Hello world!"
}

func main() {
    fmt.Println(something)
}

【讨论】:

  • @ThunderCat 您也可以在 for 或 if 语句之外使用它,因此它不一定是包范围
【解决方案2】:

在这里没有什么不同,只是一种习惯。我经常使用var e Example
:=不能使用外部功能,而var可以。

【讨论】:

  • 这两个有不同的行为,var 帮助我们在没有初始化的情况下指定,我们可以指定许多相同类型的 var 但:= 是相反的,我们可以得到定义的值它
【解决方案3】:

可能值得注意:

当您需要创建一个带有特定值(不是零值)的变量时,请使用:=

number := 12
obj := SomeStruct{name: "user"}
slice := []string{"a", "b", "c"}
someNilPointerData := (*SomeStruct)(nil)

当你需要定义一个没有任何初始化的变量时,使用var关键字,这样会使用零值。

var a int // zero value of int is 0
var mut sync.Mutex
var result []map[string]interface{}

使用var关键字的另一个好处是,在一条语句中创建多个相同类型的变量。

var result1, result2, result3, result4 []map[string]interface{}

var 关键字也可用于将某些文字值存储在具有不同数据类型的变量中。

// store string literal value in interface{} variable
var anyValue interface{} = "hello world"

// store int literal value in float64 variable
var otherValue float64 = 12

【讨论】:

  • 我同意你的观点,但需要注意的是,使用var时需要多加注意。让我们看看这个简单的例子:var john *Person fmt.Println("%s is %d years old", john.name, john.age) - 这将导致运行时错误:play.golang.org/p/ZJh7qfQaO73
  • @DanielHornik 这是因为任何指针类型的零值都是nil。并且您尝试访问它的属性(例如john.name)同时john 的值是nil。你的情况实际上与var的使用无关。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 2021-09-24
  • 2011-05-02
  • 2012-06-05
  • 2014-03-06
  • 2011-07-20
  • 2019-05-22
  • 2011-09-12
相关资源
最近更新 更多