Skip to content
On this page

类型与值

预声明类型

布尔:bool。整数:int/int8/int16/int32/int64uint 及同宽度无符号,uintptr。浮点:float32/float64。复数:complex64/complex128。字符串:string。别名:byteuint8runeint32(Unicode 码点)。

int/uint 宽度由实现决定(常见 64 位平台为 64 位),不可假定int32 相同。

零值

未显式初始化的变量取零值:数值 0、布尔 false、指针/切片/映射/通道/函数/接口 nil,字符串 ""

常量

const 可为无类型常量(untyped),在上下文中默认转为需要的目标类型,只要不溢出:

go
const MaxUint16 = 65535
var u uint16 = MaxUint16 // 合法

iotaconst 块中每行递增,常用于枚举。

字符串

  • Go 字符串为只读字节序列,UTF-8 是惯用编码,但语言层不保证内容为合法 UTF-8。
  • 索引用字节下标:s[i]byte;按 Unicode 标量值遍历用 for range s
  • 字符串与 []byte/[]rune 转换会分配新内存(除非编译器证明可优化)。

切片与数组

  • 数组 [n]Tn 为类型的一部分,[3]int[4]int 不同类型。
  • 切片 []T:底层指向数组片段,含 ptr/len/cap
  • 字面量 []int{1,2,3} 为切片;[...]int{1,2} 为数组长度推导。

append(s, x) 可能触发重新分配,s 需接住返回值。

映射

map[K]VK 必须可比较(见语言规范「Comparison operators」)。读取 m[k] 第二返回值表示是否存在;删除用 delete(m, k)

未初始化mapnil不能写入;须 make(map[K]V) 或字面量初始化。

指针

类型 *T。指针算术不像 C 那样自由;unsafe.Pointeruintptr 转换有严格规则,仅在与 syscall/CGO 等交互时在专家场景使用。

类型转换

Go 只有显式转换 T(x)。不同数值类型、兼容的指针类型等可转,规则见规范;不能隐式从 int64int 等。

可比较性与可排序性

==/!= 要求可比较:map/slice/func 不可比较(与 nil 除外规则见规范)。interface 值比较在动态类型可比较时比较动态值,否则运行时 panic。

any

anyinterface{} 的别名,表示可承载任意非接口具体类型赋值(接口赋值规则仍适用)。

技术文库