Go 为什么不是';这个赋值不是类型不匹配吗?
为什么这不是类型不匹配 发件人: 在以下任何情况下,值x可分配给T类型的变量(“x可分配给T”): 剪 x的类型V和T具有相同的底层类型,并且V或T中至少有一个不是命名类型。 …剪断 这是因为N[]的基础类型是N[]而不是命名类型吗 背后的理由是什么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",
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)的功能。