当前位置: 首页 > 面试题库 >

Golang-如何创建具有不同签名的函数片段?

巫英纵
2023-03-14
问题内容

如何创建具有不同签名的函数片段?我尝试了下面的代码,但感觉有点黑。我们只是硬着头皮使用切片界面{}吗?

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

}

这仅仅是尝试对Golang做太多事情的一种情况吗?


问题答案:

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

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

在Go
Playground
上检查

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

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

在Go
Playground
上检查



 类似资料:
  • 为了在我们的JUnit测试中使用H2数据库而不是调用Oracle,我被阻止在H2上创建别名以模拟一些Oracle兼容性: > 我首先为日期到字符的转换声明了to_char的别名:可以

  • 我试图在C++中创建一个,作为键,泛型方法作为,但我不知道这是否可能。我想做这样的事情: 这可能吗?如果是,我如何实现这一点?

  • 问题内容: 我有一个超类的方法: 在其子类之一中,我想执行以下操作: 但这是行不通的。问题是我有一个超类的引用,并且我想只在其中一个子类中调用此方法。 问题答案: 您不能在重写方法中更改类型参数的数量。对于您的情况,返回类型显然会覆盖失败。但是,即使返回类型相同,您的方法仍然不会被覆盖等效,因为您应该覆盖的方法中的类型参数更少。 从JLS- 方法签名 : 如果两个方法具有相同的名称和参数类型,则它

  • 问题内容: 我发布了我的APP,然后为了测试它,在手机上安装了APK。使用导出的APK,Facebook无法正常工作(错误的哈希),但是使用开发人员bin.ed apk可以正常工作。 有人可以告诉我怎么回事吗?密钥哈希为何不同?(第二次,日食更新第一次更改了它)。 也 由于我已经将APK上传到市场并发布了(现在尚未发布,非常烦人)。另外,我已经在本地删除了APK,因此我无法找到密钥哈希,也无法从市

  • 更新2020-12-23 正如@slaw所说,这是kotlin编译器的行为,它是有效的,因为JVM使用地址而不是“签名”调用正确的方法。 我遇到了一种情况,似乎Kotlin允许子类创建与超类的getter相同的签名。 通常,函数具有相同的签名和不同的返回类型是不允许的。所以我对这种情况感到困惑。我不确定这是不是故意的。 如果我们看看反编译的Java代码,有两个方法具有相同的签名和不同的返回类型,这

  • 当我启动一个实现viewpager的活动时,viewpager创建了各种片段。我想为每个片段使用不同的布局,但问题是viewpager最大只显示两个布局(在1之后的所有剩余片段上显示第二个布局)。 下面是实现viewpager的SwipeActivity的代码: 这是片段的代码