2012-07-31 7 views
41

Jestem nowym językiem Go. Znalazłem się zdezorientowany z typami danych array i slice.Przejdź do tablicy kolorów i typów danych plasterków

Od docs odejść, tablice są opisane w następujący sposób:

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.

funkcje:

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.

Dlaczego sort.Ints(arrayValue) zmodyfikować zmienną przekazany kiedy ogłosił go jako tablicę, a nie jako plaster?

Kod

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

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

Wyjście

[1 5 2 3 7] 
[1 2 3 5 7] 

Odpowiedz

31

Patrz "Slices: usage and internals"

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

To jest kawałek, a nie tablicą.

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

To wyjaśnia dlaczego funkcja sortowania będą modyfikować zawartość co się odwoływać w kawałkach.

Zgodnie z komentarzem przedstawionym poniżej przez Kirk, sort.Ints pojawi się błąd, jeśli przekazano mu tablicę zamiast plasterka.

func Ints(a []int) 
+1

Ponadto sort.Ints da błąd, jeśli przekażemy mu tablica zamiast plasterka. Dokumentacja sort.Ints określa plaster. https://golang.org/pkg/sort/#Ints – Kirk

+0

@Kirk dobry punkt. Zawarłem to w odpowiedzi, aby uzyskać lepszą widoczność. – VonC

34

Ponieważ używasz kawałek, a nie tablicą.

To jest kawałek:

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

A ci są macierze:

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

Przy próbie kompilacji:

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

, otrzymasz błąd:

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

jako sort.Ints oczekuje otrzymania slice []int.

+1

tak, plasterek jest jak tablica "odniesienie"? – allyourcode

+7

tak, plasterek składa się ze wskaźnika do elementu tablicy i długości. Jest to więc odniesienie do podsekcji tablicy ("kawałek" tablicy, jeśli wolisz). – mfhholmes

+0

@mfhholmes dziękuję. To jest najbardziej zwięzłe wyjaśnienie IMHO. –

10

[]int{1,5,2,3,7} nie jest tablicą. Tablica ma swoją długość w swoim typie, na przykład [5]int{1,5,2,3,7}.

Zrób kopię wycinka i sortować je zamiast:

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

Może również mieć ... zamiast swojej długości. [...] int {1,2,3} –

+0

@ArtemShitov Racja, to pomocny cukier syntaktyczny. Kompilator mimo wszystko przetłumaczy go na "[3] int {1,2,3}". –

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

w powyższym oświadczeniu jesteś inicjalizacji kawałek jak tablicy

Aby utworzyć tablicę składnia powinna być

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