为什么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
是未定义的类型。因此:

  • 您可以将
    []字节
    分配给
    别名
    ,因为它们具有相同的基础类型,
    []字节
    是未定义的类型
  • 不能将
    字符串
    分配给
    别名
    ,因为它们都是已定义的类型

请注意,这些不是类型别名。请参阅规范中的部分。(另外,如果使用类型别名,可以直接指定它们,因为它们是相同的类型:)谢谢,是的,它们是“类型定义”。但“V或T中至少有一个不是已定义类型”的规则并不十分直观……而且
string
不仅仅是
type string[]byte
,编译器会对它们进行不同的处理。字符串是不可变的,字节片不是;虽然您可以在
字符串
[]字节
之间自由转换,
字符串
上的
范围
生成
符文
元素,而不是
字节
元素。