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



我认为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

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

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

命名类型由(可能是限定的)类型名称指定;未命名的类型是使用类型文字指定的,该文字从现有类型中组成一个新类型-golang-spec

还有

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

因此

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

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

最新更新