> 백엔드 개발 > Golang > golang에서 함수를 호출하는 방법은 무엇입니까?

golang에서 함수를 호출하는 방법은 무엇입니까?

coldplay.xixi
풀어 주다: 2020-07-18 14:41:40
원래의
4572명이 탐색했습니다.

golang에서 함수를 호출하는 방법: 맵 변수를 사용하여 문자열을 함수와 명시적으로 연결하고 [funcs["foo"]]를 통해 함수 객체를 가져옵니다. 코드는 [funcs := map[string]interface입니다. {} "foo": foo].

golang에서 함수를 호출하는 방법은 무엇입니까?

golang에서 함수를 호출하는 방법:

응용 시나리오

우리는 함수 이름을 알고 문자열 변수를 통해 함수 이름을 표현한 다음 이 함수의 함수를 호출하는 방법을 설명합니다.

func foo() {
  fmt.Println("in foo");
}
var funcname string = "foo"
func callFunc(funcname string) {
    ...
}
callFunc(funcname)
로그인 후 복사

다음 질문은 필요한 기능을 완성하기 위해 callFunc()의 내용을 어떻게 구현하는지에 대한 것입니다. callFunc()的内容来完成所要的功能呢。

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

可行的办法

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

   funcs := map[string]interface{} {
            "foo": foo,
    }
로그인 후 복사

这样我们可以通过funcs["foo"]

현재 알려진 방법은 작동하지 않는 것 같습니다. 전역 도메인에서 이름으로 함수 개체를 얻는 것은 불가능합니다.
(변수의 경우에도 마찬가지입니다. 전역 도메인에서 이름으로 변수 개체를 가져올 수 없습니다.)

가능한 방법

맵 변수를 사용하여 문자열을 함수(변수)와 명시적으로 연결하세요.

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))
        }
    }
}
로그인 후 복사

이런 식으로 funcs["foo"]를 통해 함수 객체를 얻은 후 함수를 조작할 수 있습니다.

함수 연산 예다음은 매개변수 전달, 반환 값 처리 등을 포함한 함수 호출의 예입니다.

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}]
로그인 후 복사
컴파일 및 실행: 🎜rrreee🎜🎜관련 학습 권장 사항: 🎜Go 언어 튜토리얼🎜🎜🎜

위 내용은 golang에서 함수를 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿