Was ist die idiomatische Methode, um mehrere Rückgabewerte in Go umzuwandeln?
Können Sie dies in einer einzelnen Zeile tun oder müssen Sie temporäre Variablen verwenden, wie ich es in meinem Beispiel unten getan habe?
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")
}
}
Wird es übrigens genannt, casting
wenn es um Schnittstellen geht?
i := interface.(int)
casting
go
return-value
ANisus
quelle
quelle
func silly() (interface{}, error) { return "silly", nil } v, err := silly() if err != nil { // handle error } s, ok := v.(string) if !ok { // the assertion failed. }
Wahrscheinlicher ist jedoch, dass Sie einen Typschalter verwenden möchten, wie z.
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. }
Bei Go geht es mehr um Korrektheit als um Knappheit.
quelle
unsafe.Pointer
anstelle von zu verwendeninterface{}
, aber ich vermutete, dass die Typzusicherung nicht genügend Overhead enthält, was die Verwendung unsicherer Zeiger rechtfertigt.Oder einfach nur in einem, wenn:
if v, ok := value.(migrater); ok { v.migrate() }
Go kümmert sich um die Umwandlung in der if-Klausel und lässt Sie auf die Eigenschaften des umgesetzten Typs zugreifen.
quelle
template.Must ist der Ansatz der Standardbibliothek, bei dem nur der erste Rückgabewert in einer Anweisung zurückgegeben wird. Könnte für Ihren Fall ähnlich gemacht werden:
func must(v interface{}, err error) interface{} { if err != nil { panic(err) } return v } // Usage: str2 := must(twoRet()).(string)
Wenn
must
Sie verwenden, sagen Sie im Grunde, dass es niemals einen Fehler geben sollte, und wenn dies der Fall ist, kann (oder sollte) das Programm nicht weiterarbeiten und gerät stattdessen in Panik.quelle
template.Must()
wird normalerweise zum Laden von Vorlagen aus einer Variablen in Deklarationen undinit()
Funktionen auf Paketebene verwendet. Die Idee ist, sofort zur Laufzeit in Panik zu geraten und deutlich zu machen, dass etwas, das der Compiler nicht abfangen konnte, falsch ist. Sie sollten dies nicht verwenden, um temporäre Variablen zu vermeiden.must
Sie verwenden, sagen Sie im Grunde, dass es niemals einen Fehler geben sollte" war nicht klar? Sie sollten dies nicht verwenden, es sei denn, der Fehler kann nur von einem Programmierer verursacht werden oder das Programm kann wirklich nicht fortgesetzt werden, wenn ein Fehler vorliegt.