为什么 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


Smart猫小萌
浏览 201回答 1
1回答

森林海

int64是命名类型,[]byte是未命名类型。命名类型由(可能限定的)类型名称指定;未命名类型是使用类型文字指定的,它从现有类型组成一个新类型 - golang 规范还如果两个命名类型的类型名称源自相同的 TypeSpec,则它们是相同的。命名类型和未命名类型总是不同的。如果对应的类型文字相同,即如果它们具有相同的文字结构并且对应的组件具有相同的类型,则两个未命名类型是相同的。- golang 规范所以type MyByteArray []bytetype MyInt intvar a MyByteArrayvar b []bytea = b // legal because array is unnamed - their corresponding type literals are identicalvar x MyIntvar y intx = y // illegal because int is named - they don't originate in the same type spec
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go