Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么不是';这个赋值不是类型不匹配吗?_Go - Fatal编程技术网

Go 为什么不是';这个赋值不是类型不匹配吗?

Go 为什么不是';这个赋值不是类型不匹配吗?,go,Go,为什么这不是类型不匹配 发件人: 在以下任何情况下,值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",

为什么这不是类型不匹配

发件人:

在以下任何情况下,值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

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

x
可分配给
T
类型的变量(“
x
为 在以下任何情况下可分配给
T
”:

  • x
    的类型
    V
    T
    具有相同的基础类型,并且
    V
    T
    中至少有一个不是命名类型
下面是它在这里的应用:

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

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

您知道该规则背后的基本原理吗?当然,除了让我困惑之外。如果我将n:=make([]n,1)更改为n:=make(n,1),为什么仍然有效?我想make需要一个切片、地图或频道。这是一个有点离题的话题,但也是为什么下面没有给出越界错误。make([]int,3)[3:]@VM7我认为这是语言规范中的一个遗漏,它没有说明make(N,1)的功能。