golang规范中的可分配性问题

在阅读 go 规范“可分配性”部分时,我尝试执行几个示例以更好地理解该主题,现在我无法理解我在代码中做错了什么。


根据规范,值x可分配给类型变量的一种T情况如下:


x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是定义的类型。


定义的类型规范指出


类型定义创建一个新的、不同的类型,它具有与给定类型相同的基础类型和操作,并将标识符绑定到它。


但是当我尝试运行以下代码时,构建失败:


func main() {

    type Defined int32

    var d Defined

    var i int32

    d = i

}

输出是:


cannot use i (type int32) as type Defined in assignment

同时,使用复合文字的类似示例也可以正常工作:


func main() {

    type MyMap map[string]int

    var x MyMap 

    var y map[string]int

    x = y

}


缥缈止盈
浏览 161回答 2
2回答

撒科打诨

同样来自规范:https://golang.org/ref/spec#Numeric_types为了避免可移植性问题,所有数字类型都是定义类型,因此是不同的

牧羊人nacy

由于type Defined int32定义了一个新类型,d并且i没有相同的类型;因此,第一个子句x 的类型与可分配性规范中的 T 相同是不适用的。第二个子句x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是已定义类型不适用,因为两者的类型都是i已d定义类型。由于可分配性规范中的其余条款不适用于这种情况,因此分配失败。更改type Defined int32为type Defined = int32(别名类型)修复了错误。x = y由于T 是一个接口类型,并且 x 实现了可分配性规范中的 T 子句是适用的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go