ホームページ >バックエンド開発 >Golang >Go でマップを使用して関数を動的に保存および呼び出すにはどうすればよいですか?

Go でマップを使用して関数を動的に保存および呼び出すにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-12 21:43:09288ブラウズ

How Can I Store and Invoke Functions Dynamically Using Maps in Go?

Go でマップに関数を保存する

Go では、マップはキーと値のペアを保存できる多用途のデータ構造です。場合によっては、関数をマップに保存すると、キーに基づいて動的に呼び出すことができるので便利です。

問題:

複数の関数があり、作成したい関数があるとします。キーが関数名、値が関数自体であるマップ。ただし、以下に示すようにこれを試行すると、エラーが発生します:

func a(param string) {}

m := map[string]func{} 
'a_func': a,
}

for key, value := range m {
    if key == 'a_func' {
        value(param) 
    }
}

解決策:

この問題は、型固有のマップを定義するための構文が原因で発生します。は間違っています。これを解決するには、値に対してタイプ セーフが適用されないため、代わりに構文 map[string]interface{} を使用できます。以下の変更された例は、マップに関数を保存して呼び出す方法を示しています。

package main

import "fmt"

func f(p string) {
    fmt.Println("function f parameter:", p)
}

func g(p string, q int) {
    fmt.Println("function g parameters:", p, q)
}

func main() {
    m := map[string]interface{}{
        "f": f,
        "g": g,
    }
    for k, v := range m {
        switch k {
        case "f":
            v.(func(string))("astring")
        case "g":
            v.(func(string, int))("astring", 42)
        }
    }
}

この例では、マップ m は 2 つの関数値をインターフェイスとして保存します。{}。キーに基づいて関数を呼び出すとき、型アサーションが実行されてインターフェイス値が正しい関数型に変換されます。

以上がGo でマップを使用して関数を動的に保存および呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。