golangで関数を呼び出すにはどうすればよいですか?

coldplay.xixi
リリース: 2020-07-18 14:41:40
オリジナル
4541 人が閲覧しました

Golang の関数呼び出し方法: マップ変数を使用して文字列を関数に明示的に関連付け、[funcs["foo"]] を通じて関数オブジェクトを取得します。コードは [funcs := map[文字列]インターフェイス{} "foo": foo]。

golangで関数を呼び出すにはどうすればよいですか?

Golang の関数呼び出し方法:

アプリケーション シナリオ

関数名はわかっています。 , 関数名を文字列変数で表し、この関数の関数を呼び出す方法を示します。

func foo() {
  fmt.Println("in foo");
}
var funcname string = "foo"
func callFunc(funcname string) {
    ...
}
callFunc(funcname)
ログイン後にコピー

次の質問は、必要な関数を完了するために callFunc() の内容をどのように実装するかです。

現在知られている方法は機能しないようです。グローバル ドメインから関数オブジェクトを名前で取得することは不可能です。
(変数にも同じことが当てはまります。グローバル ドメインから変数オブジェクトを名前で取得することはできません)

可能なメソッド

マップ変数を使用して文字列と関数を明示的に結合します(変数) は関連付けられています:

   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))
        }
    }
}
ログイン後にコピー

コンパイルと実行:

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で関数を呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート