2014-12-19 13 views

cevap

10

Bir dilim yalnızca bir dizinin bir bölümüdür, belirli bir depolama alanı yoktur.

Bu, bir dizinin aynı bölümü üzerinde iki diliminiz varsa, her iki dilimin de aynı değerleri "içermesi" gerektiği anlamına gelir.

İşte burada olduğunu tam olarak budur: İlk append yaptığınızda

  1. , sen büyüklük 2 altta yatan bir dizi üzerinden büyüklüğü 2 yeni pay alıyor. (Her append de tahsis gerek kalmaması append genellikle hemen gerekli olandan daha fazla yer ayırır) sonraki append yaptığınızda
  2. , sen büyüklük 3 yeni bir dilim almak ancak alttaki dizi büyüklüğü 4 taşımaktadır .
  3. Bu, sonraki append'un yeni bir diziye gerek duymadığı anlamına gelir. Bu nedenle x ve y her ikisi de öncü dilim s ile aynı temel diziyi kullanacaktır. Bu dizinin aynı slotunda 11 ve daha sonra 12 yazıyorsunuz, iki farklı dilim alsanız bile (unutmayın, sadece pencereler).

Her sonra dilim kapasitesini yazdırarak kontrol edebilirsiniz ekleyin:

fmt.Println(cap(s)) 

Eğer x ve y farklı değerlere sahip olmak istiyorsanız, bir copy yapmalıyım böyle örneğin :

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) 

burada diğer çözüm ihtiyacı daha fazla olmaması için s dilim geride dizinin kapasitesini zorlamak olabilirdi ed on (bu şekilde, aşağıdaki iki append sahip yeni bir dizi kullanımı sağlanması):

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) 

Ayrıca bkz Re-slicing slices in Golang

0

dystroy çok iyi açıklanmıştır. Davranışa görsel bir açıklama eklemek istiyorum.

Bir dilim, yalnızca bir dizi segmentinin bir tanımlayıcısıdır. Diziye (ptr), segmentin uzunluğuna (len) ve kapasiteye (kapak) bir işaretçiden oluşur.

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

Yani, kod açıklama aşağıdaki gibidir;

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)              
} 
İlgili konular