go中var声明变量需明确类型或初始值,省略类型时必须赋值;函数内可用:=快速声明,仅限局部且要求新变量;批量声明支持包级var()和函数内多变量:=,但类型须一致;类型推导默认int/float64,跨平台应显式指定int32/int64。

用 var 声明并初始化变量的写法和限制
Go 中 var 声明变量时,类型和初始值可以分开写,也可以合并。但一旦省略类型,就必须提供初始值,否则编译报错:missing type in variable declaration。
常见写法有三种:
-
var name string = "Alice"—— 明确写出类型和值 -
var name = "Alice"—— 类型由右值推导(只能是局部变量) -
var name string—— 只声明不赋值,变量获得零值(""、0、false等)
注意:var 不能在函数外使用短变量声明(:=),也不能在包级作用域省略类型又不给初值。
函数内用 := 快速声明并初始化
这是最常用的写法,仅限函数内部,且要求左侧变量名此前未声明过(否则会变成赋值操作)。
示例:
func main() {
age := 25 // 推导为 int
name := "Bob" // 推导为 string
isActive := true // 推导为 bool
}
容易踩的坑:
- 在
if或for语句块里用:=声明同名变量,会导致新变量遮蔽外层变量,而非赋值 - 多个变量同时声明时,只要有一个是新变量,全部都按新变量处理(即“至少一个新”规则)
批量声明变量的几种方式及适用场景
当多个变量类型相同或逻辑相关时,可批量声明提升可读性。
包级批量声明(必须带类型):
var (
port int = 8080
host string = "localhost"
debug bool
)
函数内批量短声明(不支持,只能逐行 :=);但可用多变量赋值语法一次初始化多个已声明变量:
var a, b, c int a, b, c = 1, 2, 3
或者直接:
a, b, c := 1, 2, 3
注意:所有变量必须同类型才能用 := 批量推导;若类型不同,只能用 var 分开写或显式指定类型。
初始化时类型推导的边界情况
Go 的类型推导很实用,但有些值会让编译器无法唯一确定类型,比如数字字面量 42 可能是 int、int64、uint 等,这时它默认选 int;而浮点数字面量 3.14 默认是 float64。
如果需要特定类型,必须显式写出:
-
var count int32 = 100—— 不能靠:=得到int32 -
duration := time.Second * 5—— 结果是time.Duration,不是int64,因为time.Second是具名类型
类型推导发生在编译期,不会影响运行时性能,但写错类型可能导致接口不匹配或溢出问题,尤其在涉及 int 和 int64 混用时。
真正容易被忽略的是:在跨平台代码中,int 在 32 位系统上是 32 位,在 64 位系统上是 64 位——如果依赖具体位宽,应该显式使用 int32 或 int64。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











