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?

WBOY
Freigeben: 2024-02-08 23:10:10
nach vorne
1148 Leute haben es durchsucht

Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?

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.

Frageninhalt

Ich würde gerne wissen, warum, bitte geben Sie mir einen Hinweis.

Ich möchte ein Array an res中,resanhä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)
Nach dem Login kopieren
the res is [[-1 0 1] [-1 0 1]]
Nach dem Login kopieren

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]})
}
Nach dem Login kopieren
the res is [[-1 0 1] [-1 -1 2]]
Nach dem Login kopieren

Jetzt stimmt das Ergebnis, aber warum? k[:][]int{k[0],k[1],k[2]} Was ist der Unterschied?

Workaround

Ändern Sie die Schleife in

for k, _ := range mm {
    j := k
    res = append(res, j[:])
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage