Heim >Backend-Entwicklung >Golang >Was ist der Unterschied zwischen „array' und „slice{array,array,...}' in Golang?
Was ist der Unterschied zwischen „array“ und „slice{array,array,...}“ in Golang? Diese Frage wird oft von vielen Anfängern gestellt. Der PHP-Editor Zimo wird für Sie antworten: In Golang ist „Array“ eine Sequenz fester Länge. Einmal definiert, kann die Länge nicht geändert werden. „Slice“ ist eine Sequenz dynamischer Länge, die je nach Bedarf erweitert oder reduziert werden kann. Darüber hinaus wird die Länge des „Arrays“ zum Zeitpunkt der Definition bestimmt, während die Länge des „Slices“ zur Laufzeit dynamisch geändert werden kann. Daher müssen Sie bei der Verwendung eine geeignete Datenstruktur basierend auf den tatsächlichen Anforderungen auswählen.
Ich würde gerne wissen, warum, bitte geben Sie mir einen Hinweis.
Ich möchte ein Array an res
中,res
anhängen, bei dem es sich um ein 2D-Slice handelt. Also muss ich zuerst konvertieren.
Wenn ich das Array in ein Slice konvertiere, erhalte ich eine Fehlermeldung.
// i need a map to remove duplicates mm := map[[3]int]bool{} mm[[3]int{-1, -1, 2}] = true mm[[3]int{-1, -1, 2}] = true mm[[3]int{-1, 0, 1}] = true var res [][]int for k, _ := range mm { res = append(res, k[:]) } fmt.printf("the res is %v\n", res)
the res is [[-1 0 1] [-1 0 1]]
Aber das Ergebnis ist nicht das, was ich will.
Dann habe ich die for-Schleife versuchsweise geändert
for k, _ := range mm { //res = append(res, k[:]) res = append(res, []int{k[0], k[1], k[2]}) }
the res is [[-1 0 1] [-1 -1 2]]
Jetzt stimmt das Ergebnis, aber warum?
k[:]
和 []int{k[0],k[1],k[2]}
Was ist der Unterschied?
Ändern Sie die Schleife in
for k, _ := range mm { j := k res = append(res, j[:]) }
Ihre ursprüngliche Schleife deklariert eine Variable vom Typ [3]int
的变量 k
,该变量在内存中具有特定位置。循环的每次迭代,都会将映射 mm
, in die ein anderer Schlüssel kopiert wird. So weit, ist es gut.
Wenn Sie k[:]
将其转换为切片时,它会创建一个切片标头,指向数组 k
。这里出错了 - 循环的下一次迭代,k
的值被覆盖。循环中创建的所有切片都指向内存中同一位置的同一支持数组 k
verwenden.
Sie vermeiden das Problem, indem Sie jedem Slice ein eigenes Backing-Array zuweisen, indem Sie zunächst den Wert von k
in eine innerhalb der Schleife deklarierte Variable kopieren.
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen „array' und „slice{array,array,...}' in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!