2014-12-19 11 views

Odpowiedz

10

Plasterek jest tylko oknem na część tablicy, nie ma określonego miejsca.

Oznacza to, że jeśli masz dwa plasterki na tej samej części tablicy, oba plasterki muszą "zawierać" te same wartości.

Tutaj jest dokładnie to, co się dzieje tutaj:

  1. Po wykonaniu pierwszego append, pojawi się nowy kawałek wielkości 2 nad podstawowej gamie rozmiarów 2.
  2. Po wykonaniu następnego append, pojawi się nowy kawałek wielkości 3 ale podstawowa tablica jest od wielkości 4 (append zwykle przydziela więcej miejsca niż jeden potrzebne natychmiast, tak że nie trzeba przeznaczyć na każdym dołącz) .
  3. Oznacza to, że następny append nie potrzebuje nowej tablicy. Tak więc x i y oba będą używać tej samej podstawowej tablicy co poprzedni wycinek s. Piszecie 11, a następnie 12 w tym samym gnieździe tej tablicy, nawet jeśli otrzymacie dwa różne plasterki (pamiętajcie, że to tylko okna).

można sprawdzić, drukując zdolności plasterek po każdym dołączyć:

fmt.Println(cap(s)) 

Jeśli chcesz mieć różne wartości w x i y należy zrobić copy, na przykład jak ten :

s := []int{5} 
s = append(s, 7) 
s = append(s, 9) 
x := make([]int,len(s)) 
copy(x,s) 
x = append(x, 11) 
y := append(s, 12) 
fmt.Println(s, x, y) 

Innym rozwiązaniem tutaj mogło zmusić pojemność macierzy za s wycinka być nie większa niż potrzeba jeden ED (zapewniając w ten sposób do dwóch następujących appendmają użyć nową tablicę)

s := []int{5} 
s = append(s, 7) 
s = append(s, 9) 
s = s[0:len(s):len(s)] 
x := append(s, 11) 
y := append(s, 12) 
fmt.Println(s, x, y) 

Patrz także Re-slicing slices in Golang

0

dystroy wyjaśniono to bardzo dobrze. Lubię dodać wizualne wytłumaczenie zachowania.

Plasterek jest tylko deskryptorem segmentu tablicowego. Składa się ze wskaźnika do tablicy (ptr), długości segmentu (len) i pojemności (cap).

+-----+                
    | ptr |                
    |*Elem|                
    +-----+                
    | len |                
    |int |                
    +-----+                
    | cap |                
    |int |                
    +-----+ 

Wyjaśnienie kodu jest następujące:

func main() {               
         +             
         |             
    s := []int{5}  | s -> +-----+         
         | []int | ptr +-----> +---+      
         |  |*int | [1]int| 5 |      
         |  +-----+  +---+      
         |  |len=1|         
         |  |int |         
         |  +-----+         
         |  |cap=1|         
         |  |int |         
         |  +-----+         
         |             
    s = append(s,7)  | s -> +-----+         
         | []int | ptr +-----> +---+---+     
         |  |*int | [2]int| 5 | 7 |     
         |  +-----+  +---+---+     
         |  |len=2|         
         |  |int |         
         |  +-----+         
         |  |cap=2|         
         |  |int |         
         |  +-----+         
         |             
    s = append(s,9)  | s -> +-----+         
         | []int | ptr +-----> +---+---+---+---+   
         |  |*int | [4]int| 5 | 7 | 9 | |   
         |  +-----+  +---+---+---+---+   
         |  |len=3|         
         |  |int |         
         |  +-----+         
         |  |cap=4|         
         |  |int |         
         |  +-----+         
         |             
    x := append(s,11) |   +-------------+-----> +---+---+---+---+ 
         |   |    | [4]int| 5 | 7 | 9 |11 | 
         |   |    |  +---+---+---+---+ 
         | s -> +--+--+ x -> +--+--+      
         | []int | ptr | []int | ptr |      
         |  |*int |  |*int |      
         |  +-----+  +-----+      
         |  |len=3|  |len=4|      
         |  |int |  |int |      
         |  +-----+  +-----+      
         |  |cap=4|  |cap=4|      
         |  |int |  |int |      
         |  +-----+  +-----+      
         |             
    y := append(s,12) |      +-----> +---+---+---+---+ 
         |      | [4]int| 5 | 7 | 9 |12 | 
         |      |  +---+---+---+---+ 
         |      |       
         |   +-------------+-------------+   
         |   |    |    |   
         | s -> +--+--+ x -> +--+--+ y -> +--+--+  
         | []int | ptr | []int | ptr | []int | ptr |  
         |  |*int |  |*int |  |*int |  
         |  +-----+  +-----+  +-----+  
         |  |len=3|  |len=4|  |len=4|  
         |  |int |  |int |  |int |  
         |  +-----+  +-----+  +-----+  
         |  |cap=4|  |cap=4|  |cap=4|  
         |  |int |  |int |  |int |  
         +  +-----+  +-----+  +-----+  
    fmt.Println(s,x,y)              
} 
Powiązane problemy