在Go中使用多个返回值的转换/types断言的习惯方式

在Go中input多个返回值的惯用方法是什么?

你可以在一行中完成,还是需要使用临时variables,例如我在下面的示例中完成的?

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) 

你不能一条线做。 你的临时variables方法是要走的路。

顺便说一句,它接口的时候叫做cast吗?

它实际上被称为types断言 。 一个types转换是不同的:

 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. } 

但更可能的是你真正想要的是使用types开关,就像这样:

 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. } 

围绕正确性而不是简单化。

template.Must是标准库的方法,只返回一个语句中的第一个返回值。 对于你的情况可以做类似的事情:

 func must(v interface{}, err error) interface{} { if err != nil { panic(err) } return v } // Usage: str2 := must(twoRet()).(string) 

通过使用must你基本上说,不应该有一个错误,如果有,那么程序不能(或至less不应该)保持运行,而会恐慌。

或者只是在一个单一的,如果:

 if v, ok := value.(migrater); ok { v.migrate() } 

Go将负责if子句中的转换,并让您访问铸造types的属性。