为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
肥皂起泡泡 2022-06-27 17:05:21
我对 Golang 有点陌生,我觉得非常有用的一件事是,如果我可以将未知的值类型返回给函数。有没有办法使用 Golang 在同一个函数中返回未知的不同类型的值?
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我通常使用这样的模式。我创建了一个通用的Result类型,它存储作为接口的Data和作为错误类型的Err 。所以我可以重用 Result 类型来返回不同类型的不同函数。然后使用switch type来确定函数返回什么类型。Go Playground 请查看https://play.golang.org/p/SbwGOP_aXLG


package main


import (

    "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 []Gopher


func 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")}

}


查看完整回答
反对 回复 2022-06-27
?
白衣非少年

TA贡献1155条经验 获得超0个赞

像这样的东西?语言规范中描述了类型开关。请参阅https://golang.org/ref/spec#Switch_statements。


package main


import "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。


查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信