Arrays 如何在golang中使用type.NewArray初始化数组?

Arrays 如何在golang中使用type.NewArray初始化数组?,arrays,go,Arrays,Go,基本上,我想在types模块中使用数组类型结构,但无法初始化它。您必须在类型中传递什么作为第一个参数 package main import ( "fmt" "go/types" ) func main() { var a *types.Array a = types.NewArray(types.Int, 2) //error here fmt.Println(a) } 我也是围棋新手。对我来说,这个问题看起来并不愚蠢。不幸的是,还没有人解释如何使

基本上,我想在
types
模块中使用数组类型结构,但无法初始化它。您必须在类型中传递什么作为第一个参数

package main

import (
    "fmt"
    "go/types"
)

func main() {
    var a *types.Array
    a = types.NewArray(types.Int, 2) //error here
    fmt.Println(a)
}

我也是围棋新手。对我来说,这个问题看起来并不愚蠢。不幸的是,还没有人解释如何使用NewArray。在我看来,golang社区并不是很友好,我现在遇到的是更多的反对票,而不是真正的帮助

顺便说一句,我参加了Go tour的课程:)但不管怎样,我对如何获取对象类型的问题感到困惑,因为这个问题通常会将您带到
反射包
(在google中键入类似于
golang获取对象类型的内容
),而它与
类型没有任何共同之处。键入
。我花了一些时间研究如何获取
类型.Type
对象,我认为对于有其他语言经验的人来说这并不明显

因此,要使用
NewArray
方法,您需要传递一个对象,该对象实现了mkopriva指出的
types.Type
。我最终得到了

package main

import (
    "fmt"
    "go/types"
)

type NewType int

func (v NewType) String() string {
    return string(v)
}

func (v NewType) Underlying() types.Type {
    return types.Type(v)
}

func main() {
    var a *types.Array
    a = types.NewArray(NewType(0), 2)
    fmt.Println(a)
}

使用的新类型具有基础
int
。我想我还不了解golang中的一些东西,因为使用这么简单的东西,我不得不编写一些无用的方法,比如
String
底层的
,它们因为实现而无用,我不明白为什么要被迫编写这样的代码。我很感激golang的专家们能解释一下

请了解语言的基本知识。您需要传递一个实现
类型的类型值。type
接口,您要做的是传递一个
类型的值。BasicKind
,但此类型不实现该接口,因此,您不能将其作为第一个参数传递给
types.NewArray
@Adrian您确定Go tour包含Go/types包吗??文档中说,
所有类型都实现了类型接口。
在这种情况下,
int
听起来并不是类型怪异…@DanielGrankin所说的“所有类型”是指在该包中定义的类型,这只是一种泛化,因为
BasicKind
,一种也在该包中定义的类型,未实现该接口。包
go/types
,以及父级
go/
下的所有同级包可帮助您处理go源代码、分析、类型检查、解析、,等等。
NewArray
不是用来作为你在典型应用程序中使用的数组的初始值设定项。这就是OP被称为Go tour的原因。
Go/
下的内容通常适用于Go语言的高级用户,即熟悉基础知识的用户,不是那些只学习基础知识的人。如果有人想在Go中初始化切片或数组,他们可以使用
make([]T,len,cap)
(切片)或
var arr[N]T
(数组)。如果您不确定其函数/类型的用途,最好阅读包的文档
go/types
在第一段中明确了它的目标权利。也就是说,我确实觉得对OPs的混淆是很自然的,并且认为对它们进行向下表决是没有帮助的,而且会产生反效果。@SagarShah您可以使用一个切片,它就像一个数组,但具有动态长度。In-Go数组很少使用,大多数情况下应该使用切片。像这样初始化的片
var S[]T
,或
S:=[]T{}
,或
make([]T,len,cap)
可以通过使用
append
来增长。