Lompati ke konten utama
Modul 3 · Pelajaran 2 dari 512/50 dalam kursus~12 min
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:

Go
func divmod(a, b int) (int, int) {
    return a / b, a % b
}

q, r := divmod(17, 5) // q=3, r=2

Mereka dirusak dengan banyak tugas. Untuk membuang salah satunya nilai menggunakan _:

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

Pola (T, error) kanonik

Hampir semua stdlib mengikutinya. error SELALU terakhir:

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
}

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"):

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

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

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

Cobalah

Latihan#go.m3.l2.e1
Upaya: 0Memuat…

Definisikan divmod(a, b int) (int, int) yang mengembalikan hasil bagi dan sisanya.

Memuat editor…
Tunjukkan petunjuk

Tipe pengembalian di antara tanda kurung: `(int, int)`.

Solusi tersedia setelah 3 upaya

Latihan#go.m3.l2.e2
Upaya: 0Memuat…

Implementasikan safeDiv(a, b int) (int, error): jika b == 0 kembalikan (0, error.Baru('divisi per nol')), jika tidak (a/b, nihil).

Memuat editor…
Tunjukkan petunjuk

Kesalahan SELALU sebagai nilai terakhir. Pada kesalahan: nilai nol + kesalahan.

Solusi tersedia setelah 3 upaya

Quiz#go.m3.l2.e3
Siap

Apa yang dicetak oleh program ini, menggunakan pengembalian bernama?

Go
func f() (a, b int) {
    a = 1
    b = 2
    return
}
x, y := f()
fmt.Println(x, y)
Pilihan jawaban

Rekap

  • Beberapa nilai di antara tanda kurung: func f() (T1, T2, error).
  • Konvensi: error SELALU 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.