猿问

如何从同一函数返回未知数据类型?(哥朗)

我对 Golang 有点陌生,我觉得非常有用的一件事是,如果我可以将未知的值类型返回给函数。

有没有办法使用 Golang 在同一个函数中返回未知的不同类型的值?


肥皂起泡泡
浏览 188回答 2
2回答

杨__羊羊

我通常使用这样的模式。我创建了一个通用的Result类型,它存储作为接口的Data和作为错误类型的Err 。所以我可以重用 Result 类型来返回不同类型的不同函数。然后使用switch type来确定函数返回什么类型。Go Playground 请查看https://play.golang.org/p/SbwGOP_aXLGpackage mainimport (    "fmt"    "errors"    "os")func main() {    what := "multiple"    result := Func(what)    if result.Err != nil {        fmt.Println(result.Err.Error())        os.Exit(1)    }        switch res := result.Data.(type) {        case Gopher:            fmt.Println("Gopher name : ", res.Name)        case Gophers:            for _, g := range res {                fmt.Println("Gopher name : ", g.Name)            }    }}type Result struct {    Data interface{}    Err error}type Gopher struct {    Name string}type Gophers []Gopherfunc Func(what string) Result {    switch what {        case "one":            return Result{Data: Gopher{"gopher one"}}                case "multiple":            return Result{Data: Gophers{Gopher{"gopher one"}, Gopher{"gopher two"}}}                    }    return Result{Err: errors.New("invalid what")}}

白衣非少年

像这样的东西?语言规范中描述了类型开关。请参阅https://golang.org/ref/spec#Switch_statements。package mainimport "fmt"func main() {    p := BasedOnType(true)    fmt.Println(p) //map[bool:true]    p = BasedOnType(2)    fmt.Println(p) //map[]}func BasedOnType(i interface{}) map[interface{}]interface{} {    m := make(map[interface{}]interface{})    switch x := i.(type) {    case bool, float64, string:        k := fmt.Sprintf("%T", x)        v := fmt.Sprintf("%v", x)        m[k] = v        return m    default:        return m    }}对于 Go 游乐场,请参阅https://play.golang.org/p/0ahpua7ujb2。
随时随地看视频慕课网APP

相关分类

Go
我要回答