golang如何调用函数?


本文摘自php中文网,作者coldplay.xixi,侵删。

golang调用函数的方法:使用一个map变量显式的把字符串和函数关联起来,并通过【funcs["foo"]】得到函数对象,代码为【funcs := map[string]interface{} "foo": foo】。

golang调用函数的方法:

应用场景

我们知道一个函数名,通过一个字符串变量表示函数名,然后如何调用这个函数的功能。

1

2

3

4

5

6

7

8

func foo() {

  fmt.Println("in foo");

}

var funcname string = "foo"

func callFunc(funcname string) {

    ...

}

callFunc(funcname)

下面的问题是我们如何实现callFunc()的内容来完成所要的功能呢。

目前已知的办法好像是不行的,无法从全局域中通过名字获取一个函数的对象。
(对于变量也一样,无法从全局域中通过名字获取一个变量的对象)

可行的办法

使用一个map变量显式的把字符串和函数(变量)关联起来:

1

2

3

funcs := map[string]interface{} {

         "foo": foo,

 }

这样我们可以通过funcs["foo"]得到函数对象,然后才能对函数进行操作。

函数操作的例子

下面是一个函数调用的例子,包括参数的传递以及返回值的处理。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

package main

import "fmt"

import "reflect"

import "errors"

type MyStruct struct {

    i int

    s string

}

func foo0() int {

    fmt.Println("running foo0: ")

    return 100

}

func foo1(a int) (string, string) {

    fmt.Println("running foo1: ", a)

    return "aaaa", "bbb"

}

func foo2(a, b int, c string) MyStruct {

    fmt.Println("running foo2: ", a, b, c)

    return MyStruct{10, "ccc"}

}

func Call(m map[string]interface{}, name string, params ... interface{}) (result []reflect.Value, err error) {

    f := reflect.ValueOf(m[name])

    if len(params) != f.Type().NumIn() {

        err = errors.New("The number of params is not adapted.")

        return

    }

    in := make([]reflect.Value, len(params))

    for k, param := range params {

        in[k] = reflect.ValueOf(param)

    }

    result = f.Call(in)

    return

}

func main() {

    funcs := map[string]interface{} {

            "foo0": foo0,

            "foo1": foo1,

            "foo2": foo2,

    }

    // call foo0

    if result, err := Call(funcs, "foo0"); err == nil {

        for _, r := range result {

            fmt.Printf("  return: type=%v, value=[%d]\n", r.Type(), r.Int())

        }

    }

    // call foo1

    if result, err := Call(funcs, "foo1", 1); err == nil {

        for _, r := range result {

            fmt.Printf("  return: type=%v, value=[%s]\n", r.Type(), r.String())

        }

    }

    // call foo2

    if result, err := Call(funcs, "foo2", 1, 2, "aa"); err == nil {

        for _, r := range result {

            fmt.Printf("  return: type=%v, value=[%+v]\n", r.Type(), r.Interface().(MyStruct))

        }

    }

}

编译运行:

1

2

3

4

5

6

7

running foo0:

  return: type=int, value=[100]

running foo1:  1

  return: type=string, value=[aaaa]

  return: type=string, value=[bbb]

running foo2:  1 2 aa

  return: type=main.MyStruct, value=[{i:10 s:ccc}]

相关学习推荐:Go语言教程

以上就是golang如何调用函数?的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang怎么判断数组是否为空

go 中基于 ip 地址的 http 请求限流

golang如何调试

golang gmssl编译不过

手撸golang 行为型设计模式 观察者模式

解决go升级到1.14后无法debug

聊聊dubbo-go-proxy的apifilter

[译]go语言最佳实战[一]

go插件系统

手撸golang 结构型设计模式 享元模式

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...