为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 golang 允许命名切片类型赋值而无需显式类型转换?

为什么 golang 允许命名切片类型赋值而无需显式类型转换?

Go
Smart猫小萌 2022-01-04 10:50:16
我认为 go 不允许任何命名类型在没有显式类型转换的情况下进行实际类型分配。但是,如果我分配[]byte给它,它如何编译而不会出错json.RawMessage?var a json.RawMessage // type RawMessage []bytevar b []bytea = bvar x time.Duration // type Duration int64var y int64x = y // ERROR: cannot use y (type int64) as type time.Duration in assignmenthttps://play.golang.org/p/oD5LwJl7an
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

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


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号