Go语言中不同int切片类型赋值差异的原因探究
问题解答
先看你给出的类型与变量定义:
type MyInt int type Ints []int type MyInts []MyInt var is []int var ints Ints var myInts MyInts
两种赋值情况的编译差异,核心在于Go语言对自定义类型的底层结构匹配规则:
is = ints能编译的原因:Ints是直接基于原生切片[]int定义的自定义类型,它的底层类型和is的[]int完全一致。Go允许这种底层结构完全匹配的自定义切片类型,直接赋值给对应的原生切片变量,所以这条赋值语句能正常通过编译。is = myInts编译失败的原因:MyInts的底层类型是[]MyInt,而MyInt本身是基于int的自定义类型——也就是说,MyInts的元素类型是MyInt,而非原生的int。虽然MyInt和int的底层都是int,但它们属于不同的类型,这就导致[]MyInt和[]int的底层结构不匹配,Go不允许这种跨类型的隐式赋值转换,所以这条语句会编译报错。
如果要实现myInts到is的赋值,你需要手动做类型转换,比如遍历myInts的每个元素,把MyInt转成int后构造新的[]int切片:
is = make([]int, len(myInts)) for i, v := range myInts { is[i] = int(v) }
内容的提问来源于stack exchange,提问作者Picci
相关产品推荐
相关产品推荐

