Karena penanganan kesalahan di Go, saya sering berakhir dengan beberapa fungsi nilai. Sejauh ini, cara saya mengaturnya sangat berantakan dan saya mencari praktik terbaik untuk menulis kode yang lebih bersih.
Katakanlah saya memiliki fungsi berikut:
type Item struct {
Value int
Name string
}
func Get(value int) (Item, error) {
// some code
return item, nil
}
Bagaimana saya dapat menetapkan variabel baru dengan item.Value
elegan. Sebelum memperkenalkan penanganan kesalahan, fungsi saya baru saja kembali item
dan saya cukup melakukan ini:
val := Get(1).Value
Sekarang saya melakukan ini:
item, _ := Get(1)
val := item.Value
Apakah tidak ada cara untuk mengakses secara langsung variabel pertama yang dikembalikan?
go
error-handling
return-value
multiple-return-values
Spearfisher
sumber
sumber
item
biasanya akannil
terjadi jika terjadi kesalahan. Tanpa memeriksa kesalahan terlebih dahulu, kode Anda akan macet dalam kasus itu.Jawaban:
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
danregexp
: 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 initemplate
paket menyediakanMust(t *Template, err error) *Template
fungsi danregexp
paket menyediakanMustCompile(str string) *Regexp
fungsi: mereka tidak mengembalikanerror
s karena tujuan penggunaannya adalah tempat input dijamin valid.Contoh:
Kembali ke kasusmu
JIKA Anda yakin
Get()
tidak akan menghasilkanerror
untuk nilai input tertentu, Anda dapat membuatMust()
fungsi pembantu yang tidak akan mengembalikanerror
tetapi menimbulkan kepanikan runtime jika masih terjadi:Tetapi Anda tidak boleh menggunakan ini dalam semua kasus, hanya jika Anda yakin itu berhasil. Pemakaian:
Alternatif / Penyederhanaan
Anda bahkan dapat menyederhanakannya lebih jauh jika Anda memasukkan
Get()
panggilan ke dalam fungsi pembantu Anda, sebut sajaMustGet
:Pemakaian:
Lihat beberapa pertanyaan menarik / terkait:
bagaimana mengurai beberapa pengembalian di golang
Kembalikan peta seperti 'ok' di Golang dengan fungsi normal
sumber
Tidak, tapi itu bagus karena Anda harus selalu menangani kesalahan Anda.
Ada beberapa teknik yang dapat Anda terapkan untuk menunda penanganan kesalahan, lihat Kesalahan adalah nilai oleh Rob Pike.
Dalam contoh dari posting blog ini dia mengilustrasikan bagaimana Anda bisa membuat
errWriter
jenis yang menangguhkan penanganan kesalahan sampai Anda selesai meneleponwrite
.sumber
Ya ada.
Mengejutkan, ya? Anda bisa mendapatkan nilai tertentu dari beberapa pengembalian menggunakan
mute
fungsi sederhana :https://play.golang.org/p/IwqmoKwVm-
Perhatikan bagaimana Anda memilih nomor nilai seperti yang Anda lakukan dari slice / array dan kemudian jenis untuk mendapatkan nilai sebenarnya.
Anda dapat membaca lebih lanjut tentang ilmu di balik itu dari artikel ini . Penghargaan untuk penulis.
sumber
Tidak, Anda tidak dapat langsung mengakses nilai pertama.
Saya kira hack untuk ini akan mengembalikan array nilai bukan "item" dan "err", dan kemudian lakukan saja
item, _ := Get(1)[0]
tetapi saya tidak akan merekomendasikan ini.sumber
Bagaimana kalau begini?
sumber