複数の値を返す関数の場合、関数を呼び出すときに結果の特定の値のフィールドまたはメソッドを参照することはできません。
そして、それらの 1 つが である場合error
、それは何らかの理由(関数が失敗する可能性がある) があり、それをバイパスしてはなりません。バイパスすると、後続のコードも惨めに失敗する可能性があるためです (たとえば、ランタイム パニックが発生します)。
ただし、どのような状況でもコードが失敗しないことがわかっている場合もあります。このような場合、ヘルパー関数 (またはメソッド) を提供して、それを破棄するerror
(または実行時パニックが発生する場合はそれを発生させる) ことができます。
これは、コードから関数の入力値を提供し、それらが機能することがわかっている場合に当てはまります。
これの好例はパッケージtemplate
とregexp
パッケージです。コンパイル時に有効なテンプレートまたは正規表現を提供すると、実行時にエラーなしで常に解析できることを確認できます。このため、template
パッケージはMust(t *Template, err error) *Template
関数を提供し、regexp
パッケージは関数を提供しMustCompile(str string) *Regexp
ます: それらは返されませんerror
入力が有効であることが保証されている場合に使用するためです。
例:
// "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 で複数のリターンを解析する方法
通常の関数で Golang の 'ok' のようなマップを返す