Ana içeriğe geç
Modül 3 · Ders 2 ders 5Kurstaki 12/50~12 min
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:

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

Go
_, r := divmod(17, 5) // solo il resto

Kurallı (T, error) modeli

Stdlib'in neredeyse tamamı onu takip ediyor. error HER ZAMAN sonuncudur:

Go
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üş"):

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

Go
type Result struct {
    Sum  int
    Avg  float64
    Max  int
}

func analyze(nums []int) (Result, error) { ... }

Deneyin

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

Bölüm ve kalanı döndüren divmod(a, b int) (int, int) işlevini tanımlayın.

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

Parantez içindeki dönüş türleri: `(int, int)`.

3 denemeden sonra çözüm mevcut

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

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).

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

Son değer olarak HER ZAMAN hata. Hata durumunda: sıfır değer + hata.

3 denemeden sonra çözüm mevcut

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

Bu program adlandırılmış getirileri kullanarak ne yazdırıyor?

Go
func f() (a, b int) {
    a = 1
    b = 2
    return
}
x, y := f()
fmt.Println(x, y)
Cevap seçenekleri

Özet

  • Parantez içinde birden çok değer: func f() (T1, T2, error).
  • Kural: error HER 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.