Trong trường hợp hàm trả về nhiều giá trị, bạn không thể tham chiếu đến các trường hoặc phương thức của một giá trị cụ thể của kết quả khi gọi hàm.
Và nếu một trong số chúng là một error
, thì đó là một lý do (đó là hàm có thể bị lỗi) và bạn không nên bỏ qua nó vì nếu bạn làm vậy, mã tiếp theo của bạn có thể cũng thất bại thảm hại (ví dụ: dẫn đến hoảng loạn thời gian chạy).
Tuy nhiên, có thể có những tình huống mà bạn biết mã sẽ không bị lỗi trong bất kỳ trường hợp nào. Trong những trường hợp này, bạn có thể cung cấp một hàm trợ giúp (hoặc phương thức) sẽ loại bỏerror
(hoặc nâng cao một hoảng loạn chạy nếu nó vẫn xảy ra).
Đây có thể là trường hợp nếu bạn cung cấp các giá trị đầu vào cho một hàm từ mã và bạn biết chúng hoạt động.
Các ví dụ tuyệt vời về điều này là các gói template
và regexp
: nếu bạn cung cấp mẫu hoặc regexp hợp lệ tại thời điểm biên dịch, bạn có thể chắc chắn rằng chúng luôn có thể được phân tích cú pháp mà không có lỗi trong thời gian chạy. Vì lý do này, template
gói cung cấp Must(t *Template, err error) *Template
chức năng và regexp
gói cung cấp s vì mục đích sử dụng của chúng là nơi đầu vào được đảm bảo là hợp lệ.MustCompile(str string) *Regexp
chức năng: chúng không trả vềerror
Ví dụ:
// "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]+\]$`)
Quay lại trường hợp của bạn
NẾU bạn có thể chắc chắn Get()
sẽ không sản xuất error
cho một số giá trị đầu vào nhất định, bạn có thể tạo một Must()
hàm trợ giúp sẽ không trả về error
nhưng gây hoảng loạn thời gian chạy nếu nó vẫn xảy ra:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Nhưng bạn không nên sử dụng điều này trong mọi trường hợp, chỉ khi bạn chắc chắn rằng nó thành công. Sử dụng:
val := Must(Get(1)).Value
Thay thế / Đơn giản hóa
Bạn thậm chí có thể đơn giản hóa nó hơn nữa nếu bạn kết hợp Get()
cuộc gọi vào chức năng trợ giúp của mình, hãy gọi nó là MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Sử dụng:
val := MustGet(1).Value
Xem một số câu hỏi thú vị / liên quan:
cách phân tích cú pháp nhiều lần trả về trong golang
Trả lại bản đồ như 'ok' trong Golang trên các chức năng bình thường
item
thường sẽnil
trong trường hợp có lỗi. Nếu không kiểm tra lỗi trước, mã của bạn sẽ bị lỗi trong trường hợp đó.