【问题标题】:Assignment between custom slice type and the underlying type自定义切片类型和底层类型之间的赋值
【发布时间】:2018-12-15 17:20:00
【问题描述】:

Go 分配显示int 的错误,但[]int 切片却没有。

工作代码here

package main

import (
    "fmt"
)

type testType []int

func main() {
    var i testType
    var t []int
    t = i

    fmt.Println("Hello, playground", t, i)
}

但是,如果是int类型,编译器肯定会报错here:

cannot use i (type testType) as type int in assignment
package main

import (
    "fmt"
)

type testType int

func main() {
    var i testType
    var t int
    t = i

    fmt.Println("Hello, playground", t, i)
}

为什么自定义 int 类型而不是自定义 []int 类型会出错?

【问题讨论】:

  • 所以你想要它抱怨?为什么?

标签: go types


【解决方案1】:

Go language specification中定义了赋值类型:

值 x 可分配给 T 类型的变量(“x 可分配给 T") 如果满足以下条件之一:

  • x 的类型与 T 相同。
  • x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是已定义的类型。
  • T 是一个接口类型,x 实现了 T。
  • x为双向通道值,T为通道类型,x的类型V和T具有相同的元素类型,V或T中至少有一个是 不是定义的类型。
  • x 是预先声明的标识符 nil,T 是指针、函数、切片、映射、通道或接口类型。
  • x 是一个无类型常量,可以用 T 类型的值表示。

在您的情况下,[]int 是一个切片而不是命名类型。这就是编译器没有抱怨的原因。有关命名类型的更多信息,请通过Go specification 获取类型:

类型确定值的集合和特定于值的操作 那种类型的。类型可以命名或未命名。指定了命名类型 通过(可能是合格的)类型名称;使用指定未命名类型 一个类型字面量,由现有类型组成一个新类型。

【讨论】:

  • 有没有办法将 []int 转换为 testType 并反转?只是好奇
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 2023-03-29
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多