У разі повернення багатозначної функції при виклику функції не можна посилатися на поля або методи конкретного значення результату.
І якщо один з них - це error
, він є з причини (яка функція може вийти з ладу), і вам не слід його обходити, тому що, якщо це зробити, ваш наступний код також може вийти з ладу (наприклад, внаслідок паніки під час виконання).
Однак можуть бути ситуації, коли ви знаєте, що код не вийде з ладу за будь-яких обставин. У цих випадках ви можете надати допоміжну функцію (або метод), яка відкине error
(або підніме паніку виконання, якщо вона все-таки виникає).
Це може бути, якщо ви надаєте вхідні значення функції з коду, і ви знаєте, що вони працюють.
Прекрасними прикладами цього є template
і 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 на звичайних функціях
item
зазвичай будеnil
у випадку помилки. Якщо спочатку не перевірити помилку, ваш код в цьому випадку вийде з ладу.