
Go 是静态类型语言,变量必须有编译期确定的类型;短变量声明(i := 1)通过类型推导自动赋予变量类型(如 int),而 var i int = 1 则显式指定类型——二者语义等价,均满足静态类型要求。
go 是静态类型语言,变量必须有编译期确定的类型;短变量声明(`i := 1`)通过类型推导自动赋予变量类型(如 `int`),而 `var i int = 1` 则显式指定类型——二者语义等价,均满足静态类型要求。
在 Go 中,变量声明主要有两种常用形式:短变量声明(:=)和标准变量声明(var 关键字)。它们看似不同,实则统一服务于 Go 的核心设计原则:静态类型 + 类型推导优先。
短变量声明:简洁而安全的类型推导
语法为 identifier := expression,例如:
i := 1 s := "hello" b := true
此处无需写出类型,但 Go 编译器会严格根据右侧表达式的默认类型(default type)自动推导并固定变量类型:
- 1 是无类型整数常量(untyped integer constant),其默认类型为 int → i 的类型即为 int;
- "hello" 默认类型为 string → s 类型为 string;
- true 默认类型为 bool → b 类型为 bool。
⚠️ 注意:短变量声明只能在函数内部使用,且左侧标识符必须是新声明的(不能重复声明同一作用域内的已有变量)。
标准变量声明:显式或隐式类型均可
var 声明支持三种写法:
var i int = 1 // 显式指定类型(最明确) var j = 2 // 隐式推导类型(等价于 var j int = 2) var k, l = 3, "x" // 批量声明,类型分别推导(k→int, l→string)
根据 Go 语言规范,当 var 后省略类型时,编译器同样依据初始化表达式的默认类型进行推导——这与 := 的底层机制完全一致。
为什么 Go 既是“静态类型”又允许省略类型?
关键在于:静态类型 ≠ 必须手写类型。Go 要求每个变量在编译时拥有唯一、不可变的类型,而类型推导正是编译器在编译期完成的静态分析过程。无论你写 i := 1 还是 var i = 1,生成的目标代码中 i 的类型都是确定的 int,运行时不会改变,也不允许赋值其他类型值(如 i = 3.14 将编译失败)。
✅ 总结建议:
- 在函数内优先使用 :=,简洁清晰;
- 在包级变量声明(全局变量)中必须用 var(因 := 不允许在函数外使用);
- 当可读性要求高(如类型不直观)或需指定非默认类型(如 var port uint16 = 8080)时,显式写出类型更佳。
类型推导不是弱类型,而是 Go 在静态类型框架下对开发者体验的优雅增强。











