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

如何创建具有不同签名的函数切片?

如何创建具有不同签名的函数切片?

Go
动漫人物 2022-01-10 17:16:30
如何创建具有不同签名的函数切片?我尝试了下面的代码,但感觉很hack-ish。我们是否只是硬着头皮使用切片接口{}?package mainimport (    "fmt")type OneParams func(string) stringtype TwoParams func(string, string) stringtype ThreeParams func(string, string, string) stringfunc (o OneParams) Union() string {    return "Single string"}func (t TwoParams) Union() string {    return "Double string"}func (t ThreeParams) Union() string {    return "Triple string"}type Functions interface {    Union() string}func Single(str string) string {    return str}func Double(str1 string, str2 string) string {    return str1 + " " + str2}func Triple(str1 string, str2 string, str3 string) string {    return str1 + " " + str2 + " " + str3}func main() {    fmt.Println("Slice Of Functions Program!\n\n")    fSlice := []Functions{        OneParams(Single),        TwoParams(Double),        ThreeParams(Triple),    }    for _, value := range fSlice {        switch t := value.(type) {        case OneParams:            fmt.Printf("One: %s\n", t("one"))        case TwoParams:            fmt.Printf("Two: %s\n", t("one", "two"))        case ThreeParams:            fmt.Printf("Three: %s\n", t("one", "two", "three"))        default:            fmt.Println("Huh! What's that?")        }    }    fmt.Println("\n\n")}这只是试图用 Go 做太多事情的一个例子吗?
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

请检查一下,我不知道它是否你想要的。因为我不知道你到底想要什么。


package main


import (

    "fmt"

    "reflect"

)


func A() {

    fmt.Println("A")

}


func B(A int) {

    fmt.Println("B", A)

}


func C(A string, B float32) {

    fmt.Println("C", A, B)

}


func main() {

    f := []interface{}{A, B, C}

    f[0].(func())()

    f[1].(func(int))(15)

    f[2].(func(string, float32))("TEST", 90)


    fmt.Println("\n******* another thing ******")

    for a, v := range f {

        v := reflect.TypeOf(v)

        fmt.Println("#######", a)

        fmt.Println("num param :", v.NumIn())

        for i := 0; i < v.NumIn(); i++ {

            fmt.Println("param :", i, "type is ", v.In(i))

        }

    }

}

检查去游乐场


这里我有另一个使用反射调用的示例


package main


    import (

        "fmt"

        "reflect"

    )


    func A() {

        fmt.Println("A")

    }


    func B(A int) {

        fmt.Println("B", A)

    }


    func C(A string, B float32) {

        fmt.Println("C", A, B)

    }


    func main() {

        f := []interface{}{A, B, C}

        f[0].(func())()

        f[1].(func(int))(15)

        f[2].(func(string, float32))("TEST", 90)


        fmt.Println("\n******* calling with reflect ******")

        for a, v := range f {

            v := reflect.TypeOf(v)

            //calling the function from reflect

            val := reflect.ValueOf(f[a])

            params := make([]reflect.Value, v.NumIn())

            if v.NumIn() == 1 {

                params[0] = reflect.ValueOf(1564)

            } else if v.NumIn() == 2 {

                params[0] = reflect.ValueOf("Test FROM reflect")

                params[1] = reflect.ValueOf(float32(123456))

            }

            val.Call(params)

        }

    }


查看完整回答
反对 回复 2022-01-10
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

取决于你需要什么不同。根据您的示例,我们可以使用variadic。


package main


import(

    "fmt"

    "strings"

)


func foo(ss ...string) string{

    return strings.Join(ss, " ")

}


func main(){

    fmt.Println(foo("one"))

    fmt.Println(foo("one", "two"))

    fmt.Println(foo("one", "two", "three"))

}


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

添加回答

举报

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