自定义切片类型和基础类型之间的分配

时间:2018-07-07 09:02:02

标签: go types

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类型会出错?

1 个答案:

答案 0 :(得分:2)

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输入类型:

  

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