Pelajaran modul (2/5)
Pengembalian berganda dan pengembalian bernama
Di Go, suatu fungsi dapat mengembalikan beberapa nilai. Itu mekanismenya
mengaktifkan pola (value, error) yang telah Anda lihat dan meresap
seluruh perpustakaan standar.
Pengembalian berganda
Tipe pengembalian berada di antara tanda kurung, dipisahkan koma:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2Mereka dirusak dengan banyak tugas. Untuk membuang salah satunya
nilai menggunakan _:
_, r := divmod(17, 5) // solo il restoPola (T, error) kanonik
Hampir semua stdlib mengikutinya. error SELALU terakhir:
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
}Pengembalian bernama
Anda dapat memberi nama nilai yang dikembalikan: nilai tersebut menjadi variabel yang telah dideklarasikan sebelumnya
diinisialisasi ke nol, dan return tanpa argumen mengembalikannya ("naked
kembali"):
func divmod(a, b int) (q, r int) {
q = a / b
r = a % b
return // naked: ritorna q, r
}Pengembalian bernama juga muncul di keterangan alat dokumentasi, sehingga berguna sebagai bentuk dokumentasi sebaris untuk fungsi kompleks — bukan hanya untuk kembalinya telanjang.
Lebih dari dua pengembalian?
Tidak ada yang menghentikan Anda dari (int, int, int, error), kecuali jika Anda merasa perlu
itu hampir selalu merupakan tanda bahwa Anda harus mengembalikan struct:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }Cobalah
Definisikan divmod(a, b int) (int, int) yang mengembalikan hasil bagi dan sisanya.
Tunjukkan petunjuk
Tipe pengembalian di antara tanda kurung: `(int, int)`.
Solusi tersedia setelah 3 upaya
Implementasikan safeDiv(a, b int) (int, error): jika b == 0 kembalikan (0, error.Baru('divisi per nol')), jika tidak (a/b, nihil).
Tunjukkan petunjuk
Kesalahan SELALU sebagai nilai terakhir. Pada kesalahan: nilai nol + kesalahan.
Solusi tersedia setelah 3 upaya
Apa yang dicetak oleh program ini, menggunakan pengembalian bernama?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)Rekap
- Beberapa nilai di antara tanda kurung:
func f() (T1, T2, error). - Konvensi:
errorSELALU sebagai nilai terakhir; pada kesalahan, nilai nol + kesalahan. - Pengembalian bernama mendeklarasikan variabel terlebih dahulu dan mengaktifkan pengembalian telanjang.
- Telanjang kembali hanya dalam fungsi yang sangat singkat; lebih dari itu, keterbacaan menurun.
- Lebih dari 2-3 pengembalian? Anda mungkin menginginkan sebuah struct.