【问题标题】:Assignability question in golang specificationgolang规范中的可分配性问题
【发布时间】:2019-12-28 00:54:08
【问题描述】:

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

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

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

定义类型specification 声明

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

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

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
}

playground

【问题讨论】:

    标签: go language-specifications


    【解决方案1】:

    同样来自规范:

    https://golang.org/ref/spec#Numeric_types

    为避免可移植性问题,所有数字类型都是已定义类型,因此是不同的

    【讨论】:

    • 所以,由于两者都是定义类型,所以不能直接相互赋值。但是你可以说d = Defined(i)
    【解决方案2】:

    由于type Defined int32 定义了一个新类型,di 没有相同的类型;因此,assignability spec 中的第一个子句 x 的类型与 T 相同是不适用的。第二个子句 x 的类型 V 和 T 具有相同的底层类型,并且 V 或 T 中的至少一个不是已定义类型不适用,因为 id 的类型都是已定义类型.由于可分配性规范中的其余条款不适用于这种情况,因此分配失败。将type Defined int32 更改为type Defined = int32(给类型起别名)修复了该错误。

    x = y 由于 T 是一个接口类型,x 实现了可分配性规范中的 T 子句是适用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多