我认为在没有显式类型转换的情况下,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
答案 0 :(得分:4)
int64
是一个命名类型,[]byte
是一个已命名的类型。
命名类型由(可能是合格的)类型名称指定;使用类型文字指定未命名的类型,类型文字构成现有类型的新类型 - golang spec
另外
如果两个命名类型的类型名称来自同一个TypeSpec,则它们是相同的。命名和未命名类型总是不同的。如果相应的类型文字是相同的,即,如果它们具有相同的文字结构并且相应的组件具有相同的类型,则两个未命名的类型是相同的。 - golang spec
因此
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
另见Why can I type alias functions and use them without casting?