登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-17 16:07:19 104浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《如何创建具有不同签名的函数切片?》,以下内容主要包含golang等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

如何创建具有不同签名的函数切片?我尝试了下面的代码,但感觉很hack-ish。我们是否只是硬着头皮使用切片接口{}?

package main

import (
    "fmt"
)

type OneParams func(string) string
type TwoParams func(string, string) string
type ThreeParams func(string, string, string) string

func (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 做太多事情的一个例子吗?

正确答案

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

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 

检查去游乐场

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

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

检查去游乐场

今天关于《如何创建具有不同签名的函数切片?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表