为什么Golang类型别名有时兼容,有时不兼容?
以下代码工作正常:为什么Golang类型别名有时兼容,有时不兼容?,go,Go,以下代码工作正常: 类型别名[]字节 类型数据结构{ x别名 } func main(){ s2:=[]字节(“s2”) s1:=&数据{ x:s2, } 变量s4别名=s2 格式打印LN(s1、s2、s4) } 但是下面的代码没有编译 type alias string type data struct { x alias } func main() { s2 := string("s2") s1 := &data{ x
类型别名[]字节
类型数据结构{
x别名
}
func main(){
s2:=[]字节(“s2”)
s1:=&数据{
x:s2,
}
变量s4别名=s2
格式打印LN(s1、s2、s4)
}
但是下面的代码没有编译
type alias string
type data struct {
x alias
}
func main() {
s2 := string("s2")
s1 := &data{
x: s2, // needs explicit alias(s2)
}
var s4 alias = s2 // needs explicit alias(s2)
fmt.Println(s1,s2, s4)
}
}
唯一的区别是类型别名从字节片更改为字符串
这些类型之间有什么区别,一个是自动转换的,另一个不是?根据Go langauge规范: 本具体条款: x的类型V和T具有相同的基础类型,并且V或T中至少有一个不是已定义的类型 请注意,
string
是已定义的类型,[]byte
是未定义的类型。因此:
- 您可以将
分配给[]字节
,因为它们具有相同的基础类型,别名
是未定义的类型[]字节
- 不能将
分配给字符串
,因为它们都是已定义的类型别名
string
不仅仅是type string[]byte
,编译器会对它们进行不同的处理。字符串是不可变的,字节片不是;虽然您可以在字符串
和[]字节
之间自由转换,字符串
上的范围
生成符文
元素,而不是字节
元素。