猿问

为什么 Golang 类型别名有时兼容有时不兼容?

以下代码可以正常工作:


type alias []byte


type data struct {

    x alias

}


func main() {

    s2 := []byte("s2")

    s1 := &data{

        x: s2,

    }

    var s4 alias = s2

    fmt.Println(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)

}

}

唯一的区别是类型别名从字节切片变为字符串。


这些类型之间有什么区别,一种是自动转换的,另一种不是?


慕田峪4524236
浏览 179回答 1
1回答

潇湘沐

根据 Go 语言规范:https://golang.org/ref/spec#Assignability此特定条款:x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是定义的类型。请注意,string是一个已定义的类型,[]byte是一个未定义的类型。所以:您可以分配一个[]byteto,alias因为它们具有相同的基础类型,并且[]byte是未定义的类型您不能分配string到,alias因为它们都是已定义的类型。
随时随地看视频慕课网APP

相关分类

Go
我要回答