Modül dersleri (2/5)
Dilimler: deyimsel yapı
dilim, Go'da en çok kullanılan veri yapısıdır: dinamik görünüm
temel bir dizi üzerinde. Sözdizimi: []T. Dizilerden farklı olarak uzunluk
türün bir parçası değil ve onu append ile büyütebilirsiniz.
Bir dilimin anatomisi
Dahili olarak bir dilim üç alanlı bir yapıdır:
- temel dizideki ilk öğeye bir işaretçi
- a uzunluk (
len): görünür öğelerin sayısı - a kapasite (
cap): görünümün başlangıcından itibaren kullanılabilen öğeler temel dizinin sonuna kadar
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3Yaratılış
a := []int{1, 2, 3} // literal
b := make([]int, 3) // [0 0 0] len=3 cap=3
c := make([]int, 3, 10) // len=3 cap=10 (reserved)
var d []int // nil slice: len=0 cap=0, still usable with appendappend: her zaman sonucu ata
append öğeler ekler ve yeni bir dilim döndürür (potansiyel olarak
kapasite yetersizse yeni bir dizi tahsis etmek):
s := []int{1, 2, 3}
s = append(s, 4) // [1 2 3 4]
s = append(s, 5, 6, 7) // append multiple elements
s = append(s, altra...) // concatenate another slice (spread)Dilim ifadesi s[a:b]
a'den (dahil) b'e (hariç) bir alt dilim çıkarır:
s := []int{10, 20, 30, 40, 50}
sub := s[1:4] // [20 30 40]
inizio := s[:2] // [10 20]
fine := s[3:] // [40 50]
intera := s[:] // [10 20 30 40 50]Alt dilimler altta yatan diziyi orijinal dilimle paylaşır:
sub[i] = ... aracılığıyla gerçekleşen mutasyonlar s'de de görülebilir.
Tuzak: dizi paylaşımı
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s) // [99 2 3 4] — modified!Bağımsız bir kopya almak için copy veya append kullanın:
out := make([]int, len(sub))
copy(out, sub)Deneyin
[1, 2, 3] ile bir dilim oluşturun ve 4 eklemek için eklemeyi kullanın.
İpucu göster
HER ZAMAN geri ekleme işleminin sonucunu "s"ye atayın.
3 denemeden sonra çözüm mevcut
Dizin 1'den hariç 3'e (ör. [20, 30]) kadar öğeleri çıkarmak için bir dilim ifadesi kullanın.
İpucu göster
Sözdizimi: `s[başlangıç:bitiş]`, `başlangıç` dahil, `son` hariç.
3 denemeden sonra çözüm mevcut
Bunlardan hangisinin yazılması YANLIŞtır?
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)Özet
[]T: bir dizi üzerinde dinamik görünüm; üçlü (ptr, len, cap).make([]T, len, cap)ön tahsis için; Kullanılabilir sıfır dilim içinvar s []T.s = append(s, ...): HER ZAMAN sonucu atayın.s[a:b]temel diziyi paylaşır: bağımsız kopyalar içincopy(...).- Bir
nildilimi = okuma/aralık/ekleme işlemi tamam; sıfır haritadan oldukça farklı.