複数値の戻り関数の場合、関数を呼び出すときに、結果の特定の値のフィールドまたはメソッドを参照することはできません。
そして、そのうちの一つがある場合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]+\]$`)
あなたのケースに戻る
IFあなたが確信できる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」のようなマップを返す
item通常nil、エラーが発生します。最初にエラーをチェックしないと、コードはその場合クラッシュします。