类型与值
预声明类型
布尔:bool。整数:int/int8/int16/int32/int64,uint 及同宽度无符号,uintptr。浮点:float32/float64。复数:complex64/complex128。字符串:string。别名:byte ≡ uint8,rune ≡ int32(Unicode 码点)。
int/uint 宽度由实现决定(常见 64 位平台为 64 位),不可假定与 int32 相同。
零值
未显式初始化的变量取零值:数值 0、布尔 false、指针/切片/映射/通道/函数/接口 nil,字符串 ""。
常量
const 可为无类型常量(untyped),在上下文中默认转为需要的目标类型,只要不溢出:
const MaxUint16 = 65535
var u uint16 = MaxUint16 // 合法
iota 在 const 块中每行递增,常用于枚举。
字符串
- Go 字符串为只读字节序列,UTF-8 是惯用编码,但语言层不保证内容为合法 UTF-8。
- 索引用字节下标:
s[i]为byte;按 Unicode 标量值遍历用for range s。 - 字符串与
[]byte/[]rune转换会分配新内存(除非编译器证明可优化)。
切片与数组
- 数组
[n]T:n为类型的一部分,[3]int与[4]int不同类型。 - 切片
[]T:底层指向数组片段,含ptr/len/cap。 - 字面量
[]int{1,2,3}为切片;[...]int{1,2}为数组长度推导。
append(s, x) 可能触发重新分配,s 需接住返回值。
映射
map[K]V:K 必须可比较(见语言规范「Comparison operators」)。读取 m[k] 第二返回值表示是否存在;删除用 delete(m, k)。
未初始化的 map 为 nil,不能写入;须 make(map[K]V) 或字面量初始化。
指针
类型 *T。指针算术不像 C 那样自由;unsafe.Pointer 与 uintptr 转换有严格规则,仅在与 syscall/CGO 等交互时在专家场景使用。
类型转换
Go 只有显式转换 T(x)。不同数值类型、兼容的指针类型等可转,规则见规范;不能隐式从 int64 到 int 等。
可比较性与可排序性
==/!= 要求可比较:map/slice/func 不可比较(与 nil 除外规则见规范)。interface 值比较在动态类型可比较时比较动态值,否则运行时 panic。
any
any 为 interface{} 的别名,表示可承载任意非接口具体类型赋值(接口赋值规则仍适用)。