为什么golang在没有显式类型转换的情况下允许命名切片类型赋值

woo*_*ngs 5 go

我认为在没有显式类型转换的情况下,go不允许任何命名类型进行实际类型赋值.

但如果我分配[]byte给它,如何编译没有错误json.RawMessage?

var a json.RawMessage // type RawMessage []byte
var b []byte

a = b

var x time.Duration // type Duration int64
var y int64

x = y // ERROR: cannot use y (type int64) as type time.Duration in assignment
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/oD5LwJl7an

lib*_*ked 6

int64是命名类型,[]byte是未命名类型。

命名类型由(可能是限定的)类型名称指定;未命名类型使用类型文字指定,它从现有类型组成新类型 - golang 规范

还

如果两个命名类型的类型名称源自相同的 TypeSpec,则它们是相同的。命名类型和未命名类型总是不同的。如果对应的类型文字相同,即,如果它们具有相同的文字结构并且对应的组件具有相同的类型,则两个未命名类型是相同的。-golang规范

所以

type MyByteArray []byte
type MyInt int

var a MyByteArray
var b []byte
a = b // legal because array is unnamed - their corresponding type literals are identical

var x MyInt
var y int
x = y // illegal because int is named - they don't originate in the same type spec
Run Code Online (Sandbox Code Playgroud)

另请参阅为什么我可以键入别名函数并在不进行转换的情况下使用它们?