将值存储在数组中

时间:2017-09-21 06:35:50

标签: arrays go slice

我是Go的新手。我用JavaScript编写了我可以做到的地方:

var x = [];
x[0] = 1;

这样可以正常工作。但在Go中,我试图用Go语法实现相同的功能。但这没有用。我需要一个带有未指定索引号的数组。

我这样做了:

var x []string
x[0] = "name"

我如何做到这一点?

5 个答案:

答案 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中的

Arraysslices不是那么动态。设置数组或切片的元素时,使用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 01的指示处引用(读取或写入)值。

您也可以在一个步骤中使用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

推荐的问题/答案,以便更好地理解:

Why have arrays in Go?

How do I initialize an array without using a for loop in Go?

How do I find the size of the array in go

Keyed items in golang array initialization

Are golang slices pass by value?

答案 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