Ana içeriğe geç
Modül 5 · Ders 1 ders 5Kurstaki 21/50~12 min
Modül dersleri (1/5)

Yapıyı tanımlama ve kullanma

Bir struct adlandırılmış alanları tek bir türde gruplandırır. Bu Go'nun yoludur "nesneler" inşa etme fikri - sınıflardan daha gerçek ve doğrudan, miras yok ve yerleşik kurucu yok.

beyan

Go
type Person struct {
    Name string
    Age  int
}

type yeni bir adlandırılmış tür sunuyor. Alanlar başına bir tane yazılır satır, name type. Aynı türden ardışık alanlar, beyan: X, Y int.

Yaratılış

Go
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}

// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}

// zero value: every field at its zero value
var r Person          // r = {Name: "", Age: 0}

// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person)   // *Person to a zero-value struct

Saha erişimi

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

Bir işaretçi üzerinde ptr.Name doğrudan çalışır: Go, örtük kayıtsızlık. C'deki gibi -> yok.

Görünürlük: büyük harf kuralı

Baş harfi büyük olan alanlar dışa aktarılır (diğer alanlardan görülebilir) paketler); küçük harf = geçerli pakete özel.

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

Aynı kural Go'daki her tanımlayıcı için geçerlidir: türler, fonksiyonlar, değişkenler, alanlar.

Anonim ve iç içe yapılar

Go
// anonymous (handy for ad-hoc data)
config := struct {
    Host string
    Port int
}{Host: "localhost", Port: 8080}

// nested
type Address struct {
    Street string
    City   string
}
type Customer struct {
    Name    string
    Address Address
}

Karşılaştırılabilirlik

İki yapı, eğer TÜM alanları aynıysa == ile karşılaştırılabilir karşılaştırılabilir (içinde dilim/harita/işlev yok):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

Bu aynı zamanda bunları harita anahtarları olarak kullanmanıza da olanak tanır.

Deneyin

Egzersiz#go.m5.l1.e1
Denemeler: 0Yükleniyor…

Kişi türünü Name string ve Age int ile tanımlayın, ardından bunu main'de {Name: 'Ada', Age: 36} olarak somutlaştırın.

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

Söz dizimi: `type Ad yapısı { Alan Türü; ... }`.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m5.l1.e2
Denemeler: 0Yükleniyor…

p'nin (mevcut bir Kişi) Ad alanının değerini yazdırın.

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

Alan erişimi: 'p.Field'.

3 denemeden sonra çözüm mevcut

Quiz#go.m5.l1.e3
Hazır

Başka bir paketteki 'ad dizesi' alanının (küçük harf) görünürlüğü nedir?

Go
// in package other
type X struct {
    name string
}
Cevap seçenekleri

Özet

  • type Name struct { ... }: adlandırılmış alanlara sahip yeni adlandırılmış tür.
  • Yapı: T{Field: value, ...} (önerilir) veya konumsal.
  • Sıfır değeri: türündeki her alan sıfırdır.
  • Bir işaretçi için &T{...} ve new(T); örtülü başvuru (p.Field on *T).
  • Büyük harf = dışa aktarıldı; küçük harf = pakete özel.
  • Tüm alanlar; harita tuşları olarak kullanılabilir.