为什么这个赋值不是类型不匹配?

时间:2015-11-08 03:25:48

标签: go

为什么这不是类型不匹配?

来自:https://golang.org/ref/spec#Assignability

在任何这些情况下,值x都可分配给类型为T的变量(“x可赋予T”): ...略... x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是命名类型。 ... ...剪断

是否因为N []的基础类型是N []而不是命名类型?

背后的理由是什么?

package main

import "fmt"

type N []N

func main() {
    n := make([]N, 1)
    fmt.Printf("%T\n", n)
    fmt.Printf("%T\n", n[0])
    n[0] = n
    //fmt.Println(n)
}

*Output:*
[]main.N
main.N

1 个答案:

答案 0 :(得分:1)

您问n[0] = n是否有效。您已从语言规范中正确识别规则:

  

x可分配给T类型的变量(“x是   在任何这些情况下都可分配给T“):

     
      
  • ...
  •   
  • x的类型VT具有相同的基础类型,VT中至少有一个不是命名类型。
  •   

以下是它的适用方式:

  • n[0]的类型为N,基础类型为[]N(来自语言规范:“N在其类型声明中引用的类型”)。
  • n的类型为[]N(具有相同的基础类型)。

因此n[0]n具有相同的基础类型([]N),n的类型不是命名类型。