Go中短变量声明“:=”必须至少引入一个新变量,否则报错“no new variables on left side of :=”;它仅限函数内使用,会自动推导类型,而var更显式且可用于包级声明。

Go里声明变量用 var,但多数时候你根本不用它
Go支持多种变量声明方式,var 是最显式的写法,但日常开发中更常用短变量声明操作符 :=。它只能在函数内部使用,且会自动推导类型。
常见错误是试图在函数外用 := —— 这会直接报错 syntax error: non-declaration statement outside function body。
-
var x int = 42:包级或函数内都合法,显式声明 -
x := 42:仅限函数内,类型由值推导(这里是int) -
var y, z float64 = 1.5, 2.7:批量声明同类型变量 -
a, b := "hello", 100:短声明支持多变量、多类型混用
常量必须用 const,且不能运行时计算
Go的 const 是编译期常量,所有值必须在编译时确定。这意味着不能用函数调用、变量、甚至 len() 等内置函数(除非作用于字符串字面量等编译期可求值的表达式)。
典型错误是写 const now = time.Now() 或 const size = len(buf) —— 都会编译失败。
立即学习“go语言免费学习笔记(深入)”;
-
const Pi = 3.14159:隐式类型,实际是未命名的浮点常量 -
const MaxRetries int = 3:显式指定类型,后续赋值给int变量更安全 -
const ( StatusOK = 200; StatusNotFound = 404 ):用括号批量声明,值可省略(自动递增) -
const s = "hello"; const n = len(s):len(s)合法,因为s是字符串字面量,长度在编译期可知
变量和常量的零值与初始化差异
Go中未显式初始化的变量会被赋予对应类型的零值(0、""、nil 等),而常量没有“零值”概念——它必须有明确初始值,否则编译不通过。
容易忽略的是:包级变量(用 var 声明)即使没赋值,也会被初始化为零值;但局部变量若只声明不赋值(如 var x int),则一定为 0,不可读未初始化状态。
-
var count int→count永远是0,不存在“未定义”状态 -
const name→ 编译错误:missing value in const declaration -
const v = iota是特例,iota是编译器维护的计数器,不是运行时值
类型推导陷阱::= 和 const 的默认类型不同
短声明 := 推出的类型可能和你想的不一样,比如 x := 42 得到的是 int(取决于平台,通常是 int64 或 int32),而 const y = 42 是无类型的整数常量,可无损赋值给 int8、uint16 等任何整数类型。
这导致一个常见问题:把常量传给需要特定类型参数的函数时不会报错,但用变量就可能类型不匹配。
-
const port = 8080; listen(":port")✅ 可行,port自动转为int -
port := 8080; listen(":port")❌ 若listen参数是int32,而port是int,可能报类型不匹配 - 解决办法:显式类型转换
int32(port),或声明时指定类型var port int32 = 8080


















