关于 go:为什么使用 ‘=’ 而不是 ‘:=’?


Why use '=' instead of ':='?

我在这里查看 Go-SQL-Driver 的示例代码:

1
2
3
4
5
//Insert
    stmt, err := db.Prepare("INSERT userinfo SET username=?")

// Update
    stmt, err = db.Prepare("update userinfo set username=?")

为什么在 Insert 中我们使用 := 而在 Update 中我们使用 =?在我看来,两者都应该是 :=


:= 用于短变量声明;它都在左侧声明变量,并分配给它们。 (这在 Go 编程语言规范的"短变量声明"部分中有解释。)

相比之下,

= 仅执行分配。

在您的示例中,第二行使用 = 因为变量已经被声明(第一行),所以不需要 :=。 (事实上??,它会给出错误信息::= 仅在至少有一个变量是"new"时才允许,即尚未声明。)


= 是赋值运算符之一。

:= 是短变量声明。

在引用的链接中,你可以发现语义有很大不同,所以实际上"代替"这个概念有点问题。

一个可能有用的记忆规则:

1
identifierI := expressionE

相同

1
var identifierI = expressionE

相同

1
2
var identifierI typeOf(expressionE)
identifierI = expressionE

:= 是为了方便。重要的区别在于 := 进行类型推断,因此当它在一行中声明和分配变量时,变量类型是从函数的返回值类型推断出来的。

这在大多数情况下使您的程序更易于阅读,但确实意味着有人必须在文档中查找函数的返回值类型才能确定变量的类型。

当您重新分配给现有变量或从函数内分配给全局/包变量时,您将需要使用 =,否则,您将创建一个新的本地变量。