Home > Backend Development > Golang > How to call functions in golang?

How to call functions in golang?

coldplay.xixi
Release: 2020-07-18 14:41:40
Original
4575 people have browsed it

Golang’s method of calling a function: use a map variable to explicitly associate the string with the function, and obtain the function object through [funcs["foo"]], the code is [funcs := map[string ]interface{} "foo": foo].

How to call functions in golang?

Golang’s method of calling a function:

Application scenario

We know a function name, Represent the function name through a string variable, and then how to call the function of this function.

func foo() {
  fmt.Println("in foo");
}
var funcname string = "foo"
func callFunc(funcname string) {
    ...
}
callFunc(funcname)
Copy after login

The following question is how do we implement the content of callFunc() to complete the required function.

The currently known methods do not seem to work. It is impossible to obtain a function object by name from the global domain.
(The same is true for variables, you cannot get a variable object by name from the global domain)

Feasible methods

Use a map variable to explicitly combine the string with the function ( Variables) are associated:

   funcs := map[string]interface{} {
            "foo": foo,
    }
Copy after login

In this way, we can get the function object through funcs["foo"], and then we can operate the function.

Example of function operation

The following is an example of a function call, including the passing of parameters and the processing of return values.

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))
        }
    }
}
Copy after login

Compile and run:

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}]
Copy after login

Related learning recommendations: Go language tutorial

The above is the detailed content of How to call functions in golang?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template