web-dev-qa-db-ger.com

Gehe Array- und Slice-Datentypen

Ich bin neu in der Go-Sprache. Ich war mit den Datentypen array und slice verwirrt.

In Go-Dokumenten werden Arrays wie folgt beschrieben:

Es gibt große Unterschiede zwischen den Funktionsweisen der Arrays in Go und C. In Go

  • Arrays sind Werte. Wenn Sie ein Array einem anderen zuweisen, werden alle Elemente kopiert.
  • Wenn Sie ein Array an eine Funktion übergeben, erhält diese eine Kopie des Arrays, keinen Zeiger darauf.
  • Die Größe eines Arrays ist Teil seines Typs. Die Typen [10] int und [20] int unterscheiden sich.

Funktionen:

Wie in allen Sprachen der C-Familie wird alles in Go von .__ übergeben. Wert. Das heißt, eine Funktion erhält immer eine Kopie der Sache übergeben, als gäbe es eine Zuweisungsanweisung, die den Wert zum Parameter. Beispielsweise übergeben Sie einen int-Wert an eine Funktion erstellt eine Kopie des Int, und das Übergeben eines Zeigerwerts erstellt eine Kopie von der Zeiger, aber nicht die Daten, auf die er zeigt.

Warum ändert sort.Ints(arrayValue) die übergebene Variable, wenn ich sie als Array deklariert habe und nicht als Slice?

Code

var av = []int{1,5,2,3,7}

fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
return

Ausgabe

[1 5 2 3 7]
[1 2 3 5 7]
46
duganets

Siehe " Slices: Verwendung und Interna "

var av = []int{1,5,2,3,7}

Das ist ein Slice, kein Array.

Ein Slice-Literal wird genau wie ein Array-Literal deklariert, außer dass Sie die Elementanzahl weglassen.

Das erklärt, warum die Sortierfunktion den Inhalt von content von dem Slice ändert.

Wie unten von Kirk kommentiert, gibt sort.Ints einen Fehler aus, wenn Sie ein Array anstelle eines Slice übergeben haben.

func Ints(a []int)
38
VonC

Weil Sie ein Slice verwenden, kein Array.

Das ist eine Scheibe:

var av = []int{1,5,2,3,7}

Und das sind Arrays:

var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}

Wenn Sie versuchen, zu kompilieren:

var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)

Sie erhalten eine Fehlermeldung:

kann av (type [5] int) nicht als type [] int im Funktionsargument verwenden

as sort.Ints erwartet ein slice [] int .

41
Artem Shitov

[]int{1,5,2,3,7} ist kein Array. Ein Array hat seine Länge in seinem Typ, wie [5]int{1,5,2,3,7}.

Erstellen Sie eine Kopie des Slice und sortieren Sie es stattdessen:

a := []int{1,5,2,3,7}
sortedA := make([]int, len(a))
copy(sortedA, a)
sort.Ints(sortedA)
fmt.Println(a)
fmt.Println(sortedA)
11
Moshe Revah
var av = []int{1,5,2,3,7}

in der obigen Anweisung initialisieren Sie Slice wie ein Array 

Um ein Array zu erstellen, sollte die Syntax sein 

var av = [5]int{1,5,2,3,7}
3
user2383973

slices sind Zeiger auf Array. Wenn Sie ein Array in ein anderes kopieren oder ein Array in der Funktion übergeben, wird die gesamte Kopie des Arrays kopiert oder übergeben. Dies macht einen kostspieligeren Vorgang, wenn die Arraygröße groß ist. so können wir für scheiben gehen.

0
swarna