2012-07-31 14 views
41

Ich bin neu in der Go-Sprache. Ich habe mich mit den Datentypen array und slice verwechselt.Go lang Array und Slice Datentypen

Von Go docs, Arrays werden wie folgt beschrieben:

There are major differences between the ways arrays work in Go and C. In Go,

  • Arrays are values. Assigning one array to another copies all the elements.
  • In particular, if you pass an array to a function, it will receive a copy of the array, not a pointer to it.
  • The size of an array is part of its type. The types [10]int and [20]int are distinct.

Funktionen:

As in all languages in the C family, everything in Go is passed by value. That is, a function always gets a copy of the thing being passed, as if there were an assignment statement assigning the value to the parameter. For instance, passing an int value to a function makes a copy of the int, and passing a pointer value makes a copy of the pointer, but not the data it points to.

Warum sort.Ints(arrayValue) die übergebene Variable nicht ändern, wenn ich es als ein Array deklariert, nicht als Scheibe?

-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] 

Antwort

31

Siehe "Slices: usage and internals"

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

Das ist eine Scheibe ist, kein Array.

A slice literal is declared just like an array literal, except you leave out the element count.

Das erklärt, warum die Sortierfunktion der Inhalt von ändern wird, was durch die Scheibe verwiesen wird.

Wie unten von Kirk kommentiert, wird Ihnen einen Fehler geben, wenn Sie es ein Array statt einer Scheibe übergeben.

func Ints(a []int) 
+1

Darüber hinaus wird sort.Ints Ihnen einen Fehler geben, wenn Sie es angaben Array statt einer Scheibe. Die Dokumentation für sort.Ints gibt ein Segment an. https://golang.org/pkg/sort/#Ints – Kirk

+0

@Kirk guten Punkt. Ich habe es in die Antwort für mehr Sichtbarkeit aufgenommen. – VonC

34

Weil Sie eine Scheibe verwenden, kein Array.

, dass eine Scheibe ist:

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) 

, erhalten Sie einen Fehler erhalten:

cannot use av (type [5]int) as type []int in function argument

als sort.Ints erwartet eine slice []int zu erhalten.

+1

so ist ein Stück wie ein Array "Referenz"? – allyourcode

+7

Ja, ein Slice besteht aus einem Zeiger auf ein Array-Element und einer Länge. Es handelt sich also um einen Verweis auf einen Unterabschnitt des Arrays (ein "Slice" des Arrays, wenn Sie so wollen). – mfhholmes

+0

@mfhholmes danke. Dies ist die prägnanteste Erklärung meiner Meinung nach. –

10

[]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}.

eine Kopie der Scheibe machen und stattdessen sortieren: sollte

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

Es kann auch ... statt seiner Länge haben. [...] int {1,2,3} –

+0

@ArtemShitov Richtig, es ist ein hilfreicher syntaktischer Zucker. Der Compiler wird es trotzdem in '[3] int {1,2,3}' übersetzen. –

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

in der obigen Aussage, die Sie in Scheiben schneiden wie ein Array

ein Array erstellen die Syntax initialisieren seine

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