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
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ış
// 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 structSaha erişimi
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.
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
// 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):
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b) // trueBu aynı zamanda bunları harita anahtarları olarak kullanmanıza da olanak tanır.
Deneyin
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.
İpucu göster
Söz dizimi: `type Ad yapısı { Alan Türü; ... }`.
3 denemeden sonra çözüm mevcut
p'nin (mevcut bir Kişi) Ad alanının değerini yazdırın.
İpucu göster
Alan erişimi: 'p.Field'.
3 denemeden sonra çözüm mevcut
Başka bir paketteki 'ad dizesi' alanının (küçük harf) görünürlüğü nedir?
// in package other
type X struct {
name string
}Ö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{...}venew(T); örtülü başvuru (p.Fieldon*T). - Büyük harf = dışa aktarıldı; küçük harf = pakete özel.
- Tüm alanlar; harita tuşları olarak kullanılabilir.