跳到主要内容

自定义类型

类型定义是什么? 新类型与底层类型是什么关系?​

  • type definition: 基于已有类型定义新类型;
  • 新类型: 与底层类型不是同一类型;
  • 底层类型: 决定新类型的存储和基础操作;
// UserID 是新定义的类型, int64 是它的底层类型
type UserID int64

func main() {
// 100 是无类型整数常量, 可赋值给 UserID
var id UserID = 100
// UserID 的底层类型是 int64, 所以支持整数类型的基础运算
println(id + 1) // 输出 101

var n int64 = 200
// id = n // 报错, UserID 与 int64 不是同一类型
id = UserID(n) // 可以, 显式转换 int64 为 UserID

println(id) // 输出 200
}
  • 建模目的: 不同标识符即使都存成整数,也可以通过新类型阻止意外混用;转换应放在清楚的业务边界;
type OrderID int64
var userID UserID = 1
var orderID OrderID = 2
// userID = orderID // 类型不同,不能直接赋值
println(userID, orderID)

类型别名是什么? 与类型定义有何区别?​

  • type alias: 为已有类型创建别名;
  • 使用场景: 迁移 API, 提供语义化名字;
  • 类型身份: 别名与原类型完全相同,不建立新的赋值边界;需要区分 UserID 与 OrderID 时应使用类型定义;
type Byte = uint8 // Byte 与 uint8 完全相同
type Count int
type CountAlias = Count
var original Count = 3
var same CountAlias = original // 别名保持类型身份,可直接赋值
var plain int = int(original) // 底层类型相同仍需遵守转换规则
println(same, plain)