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

时间:2016-04-11 17:29:50

标签: 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

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

1 个答案:

答案 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?