登录
首页 >  Golang >  Go问答

Go语言中怎么通过一个字符串调用对应名称的函数

来源:SegmentFault

时间:2023-01-23 20:41:56 229浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go语言中怎么通过一个字符串调用对应名称的函数》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下go,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

先看一个示例代码:

package main

import (
    "fmt"
)

func main() {
    funcs := [3]string{"test1", "test2", "test3"}
    var result string
    for _, v := range funcs {
        switch v {
        case "test1":
            result = test1()
        case "test2":
            result = test2()
        case "test3":
            result = test3()
        default:
            result = "NON"
        }
        fmt.Println(result)
    }
}

func test1() string {
    return "test1"
}

func test2() string {
    return "test2"
}

func test3() string {
    return "test3"
}

上面的代码中函数名通过一个数组传递,有多少个就要写多少个switch/case很是蛋疼。

是否有类似PHP语言中的:

这样通过已知的函数名字符串来调用函数的方法?

正确答案

由于golong中函数也是类型 所以可以这样

package main

import "fmt"

func main(){
     symbol := []func()string{test1,test2, test3}
     for _,v := range symbol{
        fmt.Println( v())
     }
}


func test1() string {
    return "test1"
}

func test2() string {
    return "test2"
}

func test3() string {
    return "test3"
}

要实现s = “test”, $s(), 也就是key=value的方式,所以改造上边symbol为一个map

    symbol := map[string]func()string{"test1":test1, "test2":test2, "test":test3}
    s  := "test1"
    fmt.Println(symbol[s]())

补充: c语言中函数不是这样的类型, 但是任何指针都可以赋值给void* p, 所以可以通过指针数组方式实现

void* (symbol[]) = {test1, test2, test3};
//通过字符串获取下标i 然后调用
//获取下标当然可以用哈希的方式 即 string = $string
int hash(char* str)
{
    ....
    ....
    return i;
}

symbol[hash(“test1”)]() //函数调用

本篇关于《Go语言中怎么通过一个字符串调用对应名称的函数》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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