:= 和 = 在 Go 中:有什么区别?完整解析及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么混淆 := 和 = 会破坏你的 Go 代码

\n\n

你在写 Go 代码,一切进展顺利,但突然编译器报错 no new variables on left side of :=。熟悉吗?或者你看到同事的代码中,他时而用 =,时而用 :=,看起来似乎没什么区别。实际上,区别是根本性的,不理解这一点是 Golang 初学者最常见的错误之一。

\n\n

在本指南中,我们将详细解析 :=(短变量声明)和 =(赋值)这两个运算符的区别。你将了解何时使用哪一个,如何避免错误,以及如何编写更简洁、更地道的 Go 代码。开始吧!

\n\n

基础:什么是变量以及为什么需要它们?

\n\n

在深入探讨运算符的细节之前,让我们先回顾一下,变量是一块命名的内存区域,用于存储特定类型的值。在 Go 中,如同在任何强类型语言中一样,操作变量需要非常小心。

\n\n

运算符 := 和 = 是与变量交互的两种方式,但它们解决不同的问题。第一个是声明变量,第二个是修改变量的值。

\n\n

= 运算符(赋值):仅修改,不声明

\n\n

= 运算符是经典的赋值操作。它获取一个已存在的变量,并将新值写入其中。如果变量不存在,编译器将报错。

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    var name string  // 显式声明变量\n    name = "Go"      // 赋值(有效)\n    fmt.Println(name)\n\n    // age = 10       // 错误:变量 age 未声明\n}\n
\n\n

这里,name 是通过 var 声明的,因此我们可以使用 =。如果我们尝试在未事先声明的情况下写 age = 10,编译器将拒绝编译代码。

\n\n

何时使用 =?

\n
    \n
  • 当变量已经声明时(通过 var 或 :=)。
  • \n
  • 在循环和迭代中更新计数器。
  • \n
  • 在处理指针和结构体时,需要修改字段。
  • \n
\n\n

:= 运算符(短变量声明):一步完成声明 + 赋值

\n\n

:= 运算符是一种“语法糖”,它同时声明变量并为其赋值。变量的类型会根据右侧的表达式自动推断。这比写 var x int = 5 要简洁得多。

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    name := "Go"   // 声明并赋值,类型为 string\n    age := 10      // 声明并赋值,类型为 int\n    fmt.Println(name, age)\n}\n
\n\n

这等同于:

\n
var name string = "Go"\nvar age int = 10\n
\n\n

但 := 更简短,也更容易阅读。主要规则是::= 左侧必须至少有一个新变量。如果所有变量都已声明,你将收到错误。

\n\n

何时使用 :=?

\n
    \n
  • 在函数内部声明局部变量。
  • \n
  • 在 for、if 和 switch 循环中用于短初始化。
  • \n
  • 处理返回多个值的函数时(例如,err := someFunc())。
  • \n
\n\n

主要区别:声明 vs 修改

\n\n

需要记住的最重要的区别:

\n
    \n
  • := 是声明(declaration)。它在当前作用域内创建一个新变量。
  • \n
  • = 是赋值(assignment)。它修改一个已存在的变量。
  • \n
\n\n

试着把它想象成变量的“诞生”和“改名”之间的区别。你不能改变一个

博客

书籍推荐