Ana içeriğe geç
Modül 4 · Ders 2 ders 5Kurstaki 17/50~15 min
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
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

Yaratılış

Go
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 append

append: her zaman sonucu ata

append öğeler ekler ve yeni bir dilim döndürür (potansiyel olarak kapasite yetersizse yeni bir dizi tahsis etmek):

Go
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:

Go
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ı

Go
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:

Go
out := make([]int, len(sub))
copy(out, sub)

Deneyin

Egzersiz#go.m4.l2.e1
Denemeler: 0Yükleniyor…

[1, 2, 3] ile bir dilim oluşturun ve 4 eklemek için eklemeyi kullanın.

Düzenleyici yükleniyor…
İpucu göster

HER ZAMAN geri ekleme işleminin sonucunu "s"ye atayın.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m4.l2.e2
Denemeler: 0Yükleniyor…

Dizin 1'den hariç 3'e (ör. [20, 30]) kadar öğeleri çıkarmak için bir dilim ifadesi kullanın.

Düzenleyici yükleniyor…
İpucu göster

Sözdizimi: `s[başlangıç:bitiş]`, `başlangıç` dahil, `son` hariç.

3 denemeden sonra çözüm mevcut

Quiz#go.m4.l2.e3
Hazır

Bunlardan hangisinin yazılması YANLIŞtır?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
Cevap seçenekleri

Ö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çin var s []T.
  • s = append(s, ...): HER ZAMAN sonucu atayın.
  • s[a:b] temel diziyi paylaşır: bağımsız kopyalar için copy(...).
  • Bir nil dilimi = okuma/aralık/ekleme işlemi tamam; sıfır haritadan oldukça farklı.