Modül dersleri (2/5)
Çoklu iadeler ve adlandırılmış iadeler
Go'da bir işlev birden çok değer döndürebilir. Bu mekanizmadır
daha önce gördüğünüz ve her yere yayılan (value, error) modelini etkinleştirir
tüm standart kütüphane.
Çoklu iadeler
Dönüş türleri parantezlerin arasında virgülle ayrılmış olarak bulunur:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2Çoklu atamalarla yapısı bozulur. Bunlardan birini atmak için
değerler _ kullanır:
_, r := divmod(17, 5) // solo il restoKurallı (T, error) modeli
Stdlib'in neredeyse tamamı onu takip ediyor. error HER ZAMAN sonuncudur:
func read(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("read %q: %w", path, err)
}
return data, nil
}Adlandırılmış iadeler
Dönüş değerlerini adlandırabilirsiniz: önceden bildirilen değişkenler haline gelirler
sıfır olarak başlatılır ve return hiçbir argüman olmadan bunları döndürür ("çıplak
dönüş"):
func divmod(a, b int) (q, r int) {
q = a / b
r = a % b
return // naked: ritorna q, r
}Adlandırılmış dönüşler ayrıca dokümantasyon araç ipuçlarında da görünür, dolayısıyla faydalıdırlar karmaşık işlevler için bir satır içi belgeleme biçimi olarak - yalnızca çıplak dönüş için.
İkiden fazla getiri mi?
Hiçbir şey sizi (int, int, int, error) yapmaktan alıkoyamaz, ancak ihtiyaç hissederseniz
bu neredeyse her zaman bir struct döndürmeniz gerektiğinin bir işaretidir:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }Deneyin
Bölüm ve kalanı döndüren divmod(a, b int) (int, int) işlevini tanımlayın.
İpucu göster
Parantez içindeki dönüş türleri: `(int, int)`.
3 denemeden sonra çözüm mevcut
SafeDiv(a, b int) (int, error)'i uygulayın: eğer b == 0 ise geri dönün (0, error.New('sıfır başına bölme')), aksi halde (a/b, nil).
İpucu göster
Son değer olarak HER ZAMAN hata. Hata durumunda: sıfır değer + hata.
3 denemeden sonra çözüm mevcut
Bu program adlandırılmış getirileri kullanarak ne yazdırıyor?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)Özet
- Parantez içinde birden çok değer:
func f() (T1, T2, error). - Kural:
errorHER ZAMAN son değer olarak; hata durumunda sıfır değer + hata. - Adlandırılmış dönüşler, değişkenleri önceden bildirir ve çıplak dönüşleri etkinleştirir.
- Çıplak yalnızca çok kısa işlevlerde geri döner; bunun ötesinde okunabilirlik zarar görür.
- 2-3'ten fazla geri dönüş mü? Muhtemelen bir yapı istiyorsunuz.