Menu

Golang Birden Fazla Dönüş Değeri: (value, error), Adlı Sonuçlar

Go fonksiyonları birden fazla değer döndürebilir. Bu sayfa söz dizimini, (value, error) geleneğini, virgül-ok kalıbını, adlı sonuçları, çıplak return'leri ve boş tanımlayıcıyı anlatıyor.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Birden fazla değer döndürmek

Sonuç tiplerini parantez içinde listeleyin. Değerleri virgülle ayırarak döndürün ve aynı şekilde alın.

Yerleşik min ve max Go 1.21'den beri vardır. Çağıran her sonucu almak zorundadır: x := minMax(nums), assignment mismatch: 1 variable but minMax returns 2 values hatasıyla derlenmez.

(value, error) geleneği

İki değer döndürmenin en yaygın nedeni başarısızlığı bildirmektir. Geleneğe göre hata en sona gelir ve nil değilse diğer sonuçlar anlamsız kabul edilmelidir.

Çıktı:

port: 8080
error: port "http": strconv.Atoi: parsing "http": invalid syntax
error: port out of range

Başarısızlıkta diğer her sonuç için sıfır değeri döndürün (0, "", nil). Sarmalama ve kontrol dahil kalıbın tamamı hata yönetimi sayfasında.

Virgül-ok kalıbı

Birkaç yerleşik işlem, ilk değerin gerçek olup olmadığını söyleyen isteğe bağlı ikinci bir bool döndürür. Değişken geleneksel olarak ok diye adlandırılır.

Bu üç biçim (map araması, type assertion, channel alımı) özeldir: kaç değişkene atadığınıza bağlı olarak bir ya da iki değer döndürürler. Kendi fonksiyonlarınız bunu yapamaz. İki sonuçla tanımlanmış bir fonksiyon her zaman iki değer döndürür.

Boş tanımlayıcı

_ bir değeri alır ve atar. İhtiyacınız olmayan sonuçlar için kullanın:

_, err := fmt.Sscan(input, &n)
key, _ := parseLine(line)

Bir hatayı _ ile yok saymak derlenir, bu yüzden bunu yalnızca çağrının başarısız olamayacağını ya da başarısızlığın önemli olmadığını bildiğinizde yapın. Örneğin strings.Builder.WriteString her zaman nil bir hata döndürür; yazdıktan sonra bir dosyayı kapatmak ise öyle değildir.

Adlı sonuçlar

Sonuç parametrelerinin adları olabilir. Fonksiyonun başında tanımlanırlar, sıfır değerleriyle başlatılırlar ve değersiz bir return onların tuttuğu değeri döndürür.

Adlar go doc çıktısında görünür; bu da iki sonuç aynı tipi paylaştığında işe yarar: (quotient, remainder int), (int, int)'ten daha çok şey söyler.

Uzun bir fonksiyondaki çıplak return zor okunur, çünkü okuyucu sonuçların ne tuttuğunu görmek için geri taramak zorunda kalır. Yaygın tavsiye: adlar bir şeyi belgeliyorsa sonuçları adlandırın, ama fonksiyon birkaç satırlık değilse yine de return quotient, remainder'ı açıkça yazın.

Adlı sonuçlar ve defer

Ertelenmiş bir fonksiyon, return ifadesi sonuçları ayarladıktan sonra ve çağıran onları almadan önce çalışır. Adlı sonuçlarla ertelenmiş fonksiyon onları okuyup değiştirebilir. Bir fonksiyonun döndürdüğü herhangi bir hataya bağlam eklemenin ya da bir panic'i hataya çevirmenin yolu budur.

Bu önce load : empty name, sonra <nil> yazdırır. return errors.New(...) önce err'e atama yapar, ardından ertelenmiş fonksiyon onu sarmalar. Daha fazlası defer sayfasında.

Adlı bir sonucu gölgelemek

Adlı sonuçlar fonksiyonun en dış kapsamında yaşar. İç içe bir bloktaki := aynı adda yeni bir değişken oluşturur ve çıplak bir return bu durumda dıştakini döndürür.

func find() (n int, err error) {
	if true {
		n, err := compute() // new n and err, shadowing the results
		_ = n
		_ = err
	}
	return // returns 0, nil
}

Derleyici en kötü durumu yakalar: bir sonucun gölgelendiği bloğun içindeki çıplak bir return, result parameter err not in scope at return hatasıyla başarısız olur. Return'ün bloğun dışında olduğu yukarıdaki sürümü ise yakalamaz. Sonuç değişkenlerini kastettiğinizde := yerine = kullanın.

Sık yapılan hatalar

  • err nil değilken değeri kullanmak. Önce err'i kontrol edin. Bir fonksiyon bir hatanın yanında çöp değer döndürmekte serbesttir.
  • Tipli bir nil pointer'ı error olarak döndürmek. var e *MyErr; return e, nil olmayan bir error döndürür. Başarıda düz bir nil döndürün.
  • Çok fazla sonuç. Anlamları karışık üç ya da daha fazla sonucu kullanmak zordur. Bunun yerine bir struct döndürün.

Sıkça Sorulan Sorular

Go'da bir fonksiyondan birden fazla değer nasıl döndürülür?

Sonuç tiplerini parantez içinde listeleyin ve değerleri virgülle ayırarak döndürün: func minMax(xs []int) (int, int) { ...; return lo, hi }. Çağıran hepsini tek seferde atar: lo, hi := minMax(nums).

Go'da dönüş değerlerinden biri nasıl yok sayılır?

Onu boş tanımlayıcı _'a atayın: _, err := strconv.Atoi(s) ya da n, _ := strconv.Atoi(s). Bir değeri tamamen dışarıda bırakamazsınız: soldaki değişken sayısı sonuç sayısıyla eşleşmelidir.

Go'da adlı dönüş değerleri nedir?

func split(n int) (half, rest int) gibi adı olan sonuç parametreleridir. Sıfır değerleriyle başlarlar, gövdede atanabilirler ve çıplak bir return onların o anki değerlerini döndürür. Ayrıca ertelenmiş (deferred) bir fonksiyonun çağıranın alacağı değeri değiştirmesine izin verirler.

Go'da çıplak return kullanmalı mıyım?

Yalnızca kısa fonksiyonlarda. Uzun bir fonksiyondaki çıplak return neyin döndürüldüğünü gizler ve gölgeleme hatalarını kolaylaştırır. Go stil rehberleri, sonuçları belgeleme amacıyla adlandırmayı ve birkaç satırdan uzun her şeyde değerleri açıkça döndürmeyi önerir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA