我是Go的新手。我用JavaScript编写了我可以做到的地方:
var x = [];
x[0] = 1;
这样可以正常工作。但在Go中,我试图用Go语法实现相同的功能。但这没有用。我需要一个带有未指定索引号的数组。
我这样做了:
var x []string
x[0] = "name"
我如何做到这一点?
答案 0 :(得分:2)
键入时:
var x []string
您创建切片,类似于Javascript中的数组。但与Javascript不同,切片具有设定的长度和容量。在这种情况下,您将得到一个nil
切片,其长度和容量为0。
一些如何做到这一点的例子:
x := []string{"name"} // Creates a slice with length 1
y := make([]string, 10) // Creates a slice with length 10
y[0] = "name" // Set the first index to "name". The remaining 9 will be ""
var z []string // Create an empty nil slice
z = append(z, "name") // Appends "name" to the slice, creating a new slice if required
更深入地了解切片: Go slices usage and internals
答案 1 :(得分:1)
在JavaScript数组中, dynamic 是指如果使用大于或等于其长度(当前元素数)的索引设置数组元素,则数组将为自动扩展以具有设置元素所需的大小(因此您使用的索引将成为数组的新长度)。
Go中的 Arrays和slices不是那么动态。设置数组或切片的元素时,使用index expression指定要设置的元素。在Go中,您只能使用范围内的索引值,这意味着索引值必须为0 <= index < length
。
在您的代码中:
var x []string
x[0] = "name"
第一行声明了一个名为x
的{{1}}类型的变量。这是一个切片,其值为[]string
(所有切片类型的zero value,因为您没有提供初始化值)。它的长度为0,因此索引值nil
超出范围,因为它不小于长度。
如果您事先知道长度,请使用它创建数组或切片,例如:
0
在上述声明之后,您可以在var arr [3]string // An array with length of 3
var sli = make([]string, 3) // A slice with length of 3
,0
和1
的指示处引用(读取或写入)值。
您也可以在一个步骤中使用composite literal 创建和初始化数组或切片,例如
2
您还可以使用内置append()
函数将新元素添加到切片的末尾。如果需要,var arr = [3]string{"one", "two", "three"} // Array
var sli = []string{"one", "two", "three"} // Slice
函数会在引擎盖下分配一个更大的新数组/切片。您还需要指定append()
的返回值:
append()
如果你想要类似于JavaScript数组的动态“数组”,那么地图就是一个类似的结构:
var x []string
x = append(x, "name")
(但是地图也需要初始化,在上面的例子中我使用了复合文字,但我们也可以编写var x = map[int]string{}
x[0] = "name"
。)
您可以为键指定值,而无需事先声明意图。但是要知道映射不是切片或数组,映射通常不包含索引键的连续范围的值(但可能会这样),并且映射不保持键或插入顺序。有关详细信息,请参阅Why can't Go iterate maps in insertion order?。
必须阅读有关数组和切片的博文:Go Slices: usage and internals
推荐的问题/答案,以便更好地理解:
How do I initialize an array without using a for loop in Go?
How do I find the size of the array in go
答案 2 :(得分:0)
你能否使用 var x [length] string; (其中length是你想要的数组的大小)而不是 var x [] string; ?
答案 3 :(得分:0)
在Go中定义像var x=[]int
这样的变量会创建一个整数类型的切片。切片是动态的,当您想要为切片添加整数时,您必须将其添加为x = append(x, 1)
(或多个x = append(x, 2, 3, 4)
)。
正如srxf所说,你去过Go之旅吗?有一个关于slices的页面。
答案 4 :(得分:-1)
我发现这样做的方法是通过动态数组。喜欢这个
type mytype struct {
a string
}
func main() {
a := []mytype{mytype{"name1"}}
a = append(a, mytype{"name 2"})
fmt.Println(a);
}
golang playground链接:https://play.golang.org/p/owPHdQ6Y6e