ในกรณีของฟังก์ชันส่งคืนหลายค่าคุณไม่สามารถอ้างถึงเขตข้อมูลหรือวิธีการของค่าเฉพาะของผลลัพธ์เมื่อเรียกใช้ฟังก์ชัน
และถ้าหนึ่งในนั้นเป็นerror
มันก็มีเหตุผล (ซึ่งฟังก์ชันนี้อาจล้มเหลว) และคุณไม่ควรข้ามเพราะถ้าคุณทำเช่นนั้นรหัสที่ตามมาของคุณอาจล้มเหลวอย่างน่าสังเวช (เช่นส่งผลให้รันไทม์ตื่นตระหนก)
อย่างไรก็ตามอาจมีสถานการณ์ที่คุณทราบว่ารหัสจะไม่ล้มเหลวในทุกกรณี ในกรณีเหล่านี้คุณสามารถจัดเตรียมฟังก์ชันตัวช่วย (หรือวิธีการ) ซึ่งจะยกเลิกerror
(หรือทำให้รันไทม์ตื่นตระหนกหากยังคงเกิดขึ้น)
กรณีนี้อาจเกิดขึ้นได้หากคุณระบุค่าอินพุตสำหรับฟังก์ชันจากโค้ดและคุณรู้ว่ามันใช้งานได้
ตัวอย่างที่ดีของสิ่งนี้คือtemplate
และregexp
แพ็กเกจ: หากคุณระบุเทมเพลตหรือ regexp ที่ถูกต้องในเวลาคอมไพล์คุณสามารถมั่นใจได้ว่าสามารถแยกวิเคราะห์ได้ตลอดเวลาโดยไม่มีข้อผิดพลาดในขณะรันไทม์ ด้วยเหตุนี้template
แพ็กเกจจึงมีMust(t *Template, err error) *Template
ฟังก์ชันและregexp
แพ็กเกจให้MustCompile(str string) *Regexp
ฟังก์ชัน: พวกเขาไม่ส่งคืนerror
s เนื่องจากวัตถุประสงค์การใช้งานเป็นที่ที่รับประกันว่าอินพุตถูกต้อง
ตัวอย่าง:
// "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]+\]$`)
กลับไปที่กรณีของคุณ
หากคุณมั่นใจได้ว่าGet()
จะไม่สร้างerror
ค่าอินพุตบางค่าคุณสามารถสร้างMust()
ฟังก์ชันตัวช่วยซึ่งจะไม่คืนค่าerror
แต่เพิ่มความตื่นตระหนกของรันไทม์หากยังคงเกิดขึ้น:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
แต่คุณไม่ควรใช้สิ่งนี้ในทุกกรณีเมื่อคุณแน่ใจแล้ว การใช้งาน:
val := Must(Get(1)).Value
ทางเลือก / การทำให้เข้าใจง่าย
คุณสามารถทำให้มันง่ายขึ้นได้อีกหากคุณรวมการGet()
โทรเข้าในฟังก์ชันตัวช่วยของคุณขอเรียกว่าMustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
การใช้งาน:
val := MustGet(1).Value
ดูคำถามที่น่าสนใจ / เกี่ยวข้อง:
วิธีแยกวิเคราะห์ผลตอบแทนหลายรายการใน golang
กลับแผนที่เช่น 'ok' ใน Golang ในฟังก์ชันปกติ
item
โดยทั่วไปจะเป็นnil
กรณีที่เกิดข้อผิดพลาด หากไม่ตรวจสอบข้อผิดพลาดก่อนรหัสของคุณจะผิดพลาดในกรณีนั้น