Goで複数の戻り値をキャストする慣用的な方法は何ですか?
一行でそれを行うことができますか、または下の例で行ったような一時変数を使用する必要がありますか?
package main
import "fmt"
func oneRet() interface{} {
return "Hello"
}
func twoRet() (interface{}, error) {
return "Hejsan", nil
}
func main() {
// With one return value, you can simply do this
str1 := oneRet().(string)
fmt.Println("String 1: " + str1)
// It is not as easy with two return values
//str2, err := twoRet().(string) // Not possible
// Do I really have to use a temp variable instead?
temp, err := twoRet()
str2 := temp.(string)
fmt.Println("String 2: " + str2 )
if err != nil {
panic("unreachable")
}
}
ちなみに、インターフェースに関してはcasting
と呼ばれますか?
i := interface.(int)
1行で行うことはできません。あなたの一時的な変数のアプローチは、行く方法です。
ちなみに、インターフェースに関してはキャストと呼ばれていますか?
実際には type assertion と呼ばれます。タイプ キャスト 変換が異なります:
var a int
var b int64
a = 5
b = int64(a)
func silly() (interface{}, error) {
return "silly", nil
}
v, err := silly()
if err != nil {
// handle error
}
s, ok := v.(string)
if !ok {
// the assertion failed.
}
しかし、実際に必要なのは、次のようなタイプスイッチを使用することです。
switch t := v.(type) {
case string:
// t is a string
case int :
// t is an int
default:
// t is some other type that we didn't name.
}
Goは、簡潔さよりも正確さを重視しています。
template.Must は、1つのステートメントで最初の戻り値のみを返すための標準ライブラリのアプローチです。あなたの場合にも同様に行うことができます:
func must(v interface{}, err error) interface{} {
if err != nil {
panic(err)
}
return v
}
// Usage:
str2 := must(twoRet()).(string)
must
を使用することにより、基本的にエラーが発生することはないはずであり、エラーが発生した場合、プログラムは動作を継続できず(または少なくとも継続すべきではない)、代わりにパニックになります。
または、次の場合は単一で:
if v, ok := value.(migrater); ok {
v.migrate()
}
Goはif句内のキャストを処理し、キャストされた型のプロパティにアクセスできるようにします。