go函数内声明局部变量有三种写法:1. :=用于快速声明并初始化新变量;2. =仅对已声明变量赋值;3. var支持显式类型、批量声明和延迟初始化。

Go里函数内声明局部变量的三种写法
Go语言函数内部声明局部变量,最常用的是:=短变量声明,但它有明确限制:只能在函数体内用,且左边至少有一个新变量名。如果想复用已有变量名但只改值,就得用=赋值;如果要指定类型或声明未初始化的变量,则用var。
-
:=适合快速声明并初始化,比如name := "Alice"或count, err := strconv.Atoi(s) -
=仅用于已声明变量的重新赋值,比如前面用var age int声明后,后面写age = 25 -
var支持显式类型、批量声明、延迟初始化,比如var x, y float64或var buf bytes.Buffer(此时buf是零值)
为什么不能在函数外用 :=
因为:=本质是声明+赋值的语法糖,而包级作用域只允许用var声明全局变量。如果你在函数外写 port := 8080,Go会直接报错:non-declaration statement outside function body。
- 错误示例:
package main port := 8080 // 编译失败
- 正确写法:
package main var port = 8080 // 类型由右值推导 // 或 var port int = 8080
局部变量的作用域和生命周期
Go中函数内用任何方式声明的变量,都只在该函数(或其内部的代码块,如if、for)内可见。一旦函数返回,这些变量占用的栈内存就自动释放——没有垃圾回收负担,也不需要手动清理。
- 注意嵌套作用域遮蔽:在
if块内用:=声明同名变量,会创建新变量,外部同名变量不受影响 - 循环中声明的变量(如
for i := range items),每次迭代复用同一内存位置,不是每次都新建 - 如果变量逃逸到堆上(比如被返回的指针引用),编译器会自动处理,但声明写法本身不影响逃逸判断
容易踩的坑:重复声明和未使用变量
Go对局部变量管理非常严格。用:=时,如果左边所有变量名都已在当前作用域声明过,就会报错no new variables on left side of :=。另外,声明了但没使用的变量会导致编译失败(即使是var声明)。
- 常见误写:
name := "Tom" name := "Jerry" // 错误:重复声明
- 修复方式:第二次用
name = "Jerry",或确保至少一个新变量名:name, ok := lookupUser(id) - 未使用变量也会报错,哪怕只是
var _ int,也得用_明确表示丢弃,否则var unused int直接编译不过
:=的“必须含新变量”规则和编译期的未使用检查,是新手最容易卡住的地方。写完记得跑一遍,别依赖IDE提示——Go的编译错误信息通常很直接,但前提是它真能编译到那一步。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











