Go 类型定义与类型别名(type)

主要区别

在 Go 中(Go 1.9 引入 = 别名语法),这两者有本质不同:

1. type MyInt int —— 类型定义(Defined Type)

  • 这是一个新的、独立的类型
  • 它的底层类型(underlying type)是 int,但 MyIntint不同类型
  • 不能直接赋值,需要显式转换。
type MyInt int

var i int = 42
var m MyInt = MyInt(i)  // 必须转换
// var m MyInt = i      // 编译错误:cannot use i (type int) as type MyInt

// 可以为 MyInt 定义方法
func (m MyInt) Double() MyInt {
    return m * 2
}

2. type MyInt = int —— 类型别名(Type Alias)

  • 不是新类型,只是给 int 起了一个别名
  • MyIntint完全相同的类型,可以随意互换。
  • 不能为别名定义方法(因为它和 int 是同一个类型)。
type MyInt = int

var i int = 42
var m MyInt = i     // 完全合法,无需转换
var m2 MyInt = 100  // 也合法

// 下面两个是完全等价的
var a MyInt = 5
var b int = a       // 合法

总结对比

特性 type MyInt int (定义) type MyInt = int (别名)
是否为新类型 否(完全相同)
赋值是否需要转换 需要 MyInt(x) 不需要
是否可以定义方法 可以 不可以
类型比较 MyInt != int MyInt == int
常用场景 需要类型安全、自定义方法 简化长类型名、代码重构

实际使用建议

  • type MyInt int:当你想增加类型安全性(如区分 IDAgeCount 等不同含义的整数)或者需要给它附加方法时。
  • type MyInt = int:主要用于代码重构、简化复杂类型(如 type Table = map[string]map[int]float64),或者在包之间逐步迁移类型时。

这个区别是 Go 类型系统里“名义类型(nominal typing)” vs “别名”的核心体现。