Идиоматический способ сделать утверждение преобразования / типа для нескольких возвращаемых значений в Go
каков идиоматический способ приведения нескольких возвращаемых значений в 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)
4 ответа:
вы не можете сделать это в одну строку. Ваш временный переменный подход-это путь.
кстати, это называется кастинг, когда дело доходит до интерфейсов?
Это на самом деле называется утверждение типа. Тип
castпреобразование различных: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 действительно больше о правильности, чем о краткости.
шаблон.Должен - это подход стандартной библиотеки для возврата только первого возвращаемого значения в одном операторе. Может быть сделано аналогично для вашего случая:
func must(v interface{}, err error) interface{} { if err != nil { panic(err) } return v } // Usage: str2 := must(twoRet()).(string)
С помощью
must
вы в основном говорите, что никогда не должно быть ошибки, а если есть, то программа не может (или, по крайней мере, не должна) продолжать работать, и вместо этого будет паниковать.