Skip to main content

Go: type system

📅 2026-03-18 ✏️ 2026-03-18 Inside Go CS GO

1 · Go: type system#

https://go.dev/ref/spec#Types https://go.dev/ref/spec#Properties_of_types_and_values

  • 类型决定一组值,以及这些值被允许的操作、和该类型提供的方法。 assignability 不等于 identical 为什么?

类型系统:

  • 结构:如何从简单类型构造复杂类型?
  • 关系:类型之间如何相等、兼容、转换、实现?
  • 操作:某类型的值,拥有哪些合法操作?

Go 语言的类型系统:

  • 静态强类型语言,类型检查主要在编译期完成。
  • 类型系统比较克制,核心包括:基础类型、复合类型(arrayslicemapchanstruct)、函数、指针、接口。
  • 在结构上,主要通过数组、切片、映射、通道、结构体、函数类型等方式组合出复杂类型。
  • 没有传统 class继承,主要通过 struct + method 组织数据与行为。
  • 强调组合而不是继承,复用通常依赖字段组合、内嵌和接口。
  • interface 是行为抽象的核心;类型的方法集满足接口要求时,即实现该接口,且为隐式实现
  • 在关系上,重要的类型关系包括:同一类型、可赋值、可转换、实现接口、底层类型相关。
  • 在操作上,类型决定值的合法操作,例如:是否可比较、是否可取地址、是否可为 nil、是否可索引、是否可调用、是否可发送/接收。
  • 零值具有表达能力:变量未显式初始化时,也先得到该类型的合法默认值。
  • 支持泛型;类型参数通过约束控制可接受的类型集合,约束通常写成interface形式。
  • 区分新类型与类型别名: type T U:定义新类型。 type T = U:定义类型别名。
  • 底层类型:把类型名逐层展开后最终得到的实际类型(类型别名不创造底层类型关系);用于转换、类型约束

值的存在与复制:

  • 值在运行时如何表示:值可能是自包含的,也可能是对底层数据的引用。
  • 值如何被复制:复制一个值时,复制的可能是完整数据,也可能只是引用。
  • 复制带来的影响:复制之后,多个值可能彼此独立,也可能共享同一份底层数据。