Go语言精进之路:从新手到高手的编程思想、方法和技巧(1)
上QQ阅读APP看书,第一时间看更新

9.2 有类型常量带来的烦恼

Go是对类型安全要求十分严格的编程语言。Go要求,两个类型即便拥有相同的底层类型(underlying type),也仍然是不同的数据类型,不可以被相互比较或混在一个表达式中进行运算:

type myInt int

func main() {
    var a int = 5
    var b myInt = 6
    fmt.Println(a + b) // 编译器会给出错误提示:invalid operation: a + b (mismatched  types int and myInt)
}

我们看到,Go在处理不同类型的变量间的运算时不支持隐式的类型转换。Go的设计者认为,隐式转换带来的便利性不足以抵消其带来的诸多问题[1]。要解决上面的编译错误,必须进行显式类型转换:

type myInt int

func main() {
    var a int = 5
    var b myInt = 6
    fmt.Println(a + int(b)) // 输出:11
}

而将有类型常量与变量混合在一起进行运算求值时也要遵循这一要求,即如果有类型常量与变量的类型不同,那么混合运算的求值操作会报错:

type myInt int
const n myInt = 13
const m int = n + 5        // 编译器错误提示:cannot use n + 5 (type myInt) as type  int in const initializer

func main() {
    var a int = 5
    fmt.Println(a + n)     // 编译器错误提示:invalid operation: a + n (mismatched  types int and myInt)
}

唯有进行显式类型转换才能让上面的代码正常工作:

type myInt int
const n myInt = 13
const m int = int(n) + 5

func main() {
    var a int = 5
    fmt.Println(a + int(n)) // 输出:18
}

有类型常量给代码简化带来了麻烦,但这也是Go语言对类型安全严格要求的结果。