Go: type system
Backlinks (0)
No backlinks found
1 · Go: type system#
https://go.dev/ref/spec#Types https://go.dev/ref/spec#Properties_of_types_and_values
- 类型决定一组值,以及这些值被允许的操作、和该类型提供的方法。 assignability 不等于 identical 为什么?
类型系统:
- 结构:如何从简单类型构造复杂类型?
- 关系:类型之间如何相等、兼容、转换、实现?
- 操作:某类型的值,拥有哪些合法操作?
Go 语言的类型系统:
- 静态强类型语言,类型检查主要在编译期完成。
- 类型系统比较克制,核心包括:基础类型、复合类型(
array、slice、map、chan、struct)、函数、指针、接口。 - 在结构上,主要通过数组、切片、映射、通道、结构体、函数类型等方式
组合出复杂类型。 - 没有传统
class和继承,主要通过struct + method组织数据与行为。 - 强调组合而不是继承,复用通常依赖字段组合、内嵌和接口。
interface是行为抽象的核心;类型的方法集满足接口要求时,即实现该接口,且为隐式实现。- 在关系上,重要的类型关系包括:同一类型、可赋值、可转换、实现接口、底层类型相关。
- 在操作上,类型决定值的合法操作,例如:是否可比较、是否可取地址、是否可为
nil、是否可索引、是否可调用、是否可发送/接收。 - 零值具有表达能力:变量未显式初始化时,也先得到该类型的合法默认值。
- 支持泛型;类型参数通过约束控制可接受的类型集合,约束通常写成interface形式。
- 区分新类型与类型别名:
type T U:定义新类型。type T = U:定义类型别名。 - 底层类型:把类型名逐层展开后最终得到的实际类型(类型别名不创造底层类型关系);用于转换、类型约束
值的存在与复制:
- 值在运行时如何表示:值可能是自包含的,也可能是对底层数据的引用。
- 值如何被复制:复制一个值时,复制的可能是完整数据,也可能只是引用。
- 复制带来的影响:复制之后,多个值可能彼此独立,也可能共享同一份底层数据。