Dalam kasus fungsi pengembalian multi-nilai, Anda tidak bisa merujuk ke bidang atau metode dari nilai tertentu dari hasil saat memanggil fungsi tersebut.
Dan jika salah satunya adalah error
, kode itu ada karena suatu alasan (yaitu fungsinya mungkin gagal) dan Anda tidak boleh melewatinya karena jika Anda melakukannya, kode berikutnya mungkin juga gagal total (misalnya, mengakibatkan panik runtime).
Namun mungkin ada situasi di mana Anda tahu kode tidak akan gagal dalam keadaan apa pun. Dalam kasus ini, Anda bisa menyediakan fungsi helper (atau metode) yang akan membuang error
(atau menimbulkan kepanikan runtime jika masih terjadi).
Ini bisa terjadi jika Anda memberikan nilai input untuk fungsi dari kode, dan Anda tahu bahwa fungsi tersebut berfungsi.
Contoh yang bagus dari ini adalah paket template
dan regexp
: jika Anda memberikan template yang valid atau regexp pada waktu kompilasi, Anda dapat memastikan bahwa template tersebut selalu dapat diurai tanpa kesalahan saat runtime. Untuk alasan ini template
paket menyediakan Must(t *Template, err error) *Template
fungsi dan regexp
paket menyediakan MustCompile(str string) *Regexp
fungsi: mereka tidak mengembalikanerror
s karena tujuan penggunaannya adalah tempat input dijamin valid.
Contoh:
// "text" is a valid template, parsing it will not fail
var t = template.Must(template.New("name").Parse("text"))
// `^[a-z]+\[[0-9]+\]$` is a valid regexp, always compiles
var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
Kembali ke kasusmu
JIKA Anda yakin Get()
tidak akan menghasilkan error
untuk nilai input tertentu, Anda dapat membuat Must()
fungsi pembantu yang tidak akan mengembalikan error
tetapi menimbulkan kepanikan runtime jika masih terjadi:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Tetapi Anda tidak boleh menggunakan ini dalam semua kasus, hanya jika Anda yakin itu berhasil. Pemakaian:
val := Must(Get(1)).Value
Alternatif / Penyederhanaan
Anda bahkan dapat menyederhanakannya lebih jauh jika Anda memasukkan Get()
panggilan ke dalam fungsi pembantu Anda, sebut saja MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Pemakaian:
val := MustGet(1).Value
Lihat beberapa pertanyaan menarik / terkait:
bagaimana mengurai beberapa pengembalian di golang
Kembalikan peta seperti 'ok' di Golang dengan fungsi normal
item
biasanya akannil
terjadi jika terjadi kesalahan. Tanpa memeriksa kesalahan terlebih dahulu, kode Anda akan macet dalam kasus itu.