8

場合によっては呼び出すメソッドがいくつかあります (追加、削除など)。ただし、時間の経過とともにケースの数が増加し、スイッチケースが長くなります。だから私はGo map of functions のようなメソッドのマップを作成すると思った。ここでは、関数のマッピングは簡単です。しかし、 Goでメソッドのマップを作成することは可能ですか?

メソッドがある場合:

func (f *Foo) Add(a string, b int) { }

以下の構文では、コンパイル時エラーが発生します。

actions := map[string]func(a, b){
        "add": f.Add(a,b),
}

Goでメソッドのマップを作成することは可能ですか?

4

4 に答える 4

10

はい。現在:

actions := map[string]func(a string, b int){
        "add": func(a string, b int) { f.Add(a, b) },
}

後で: go11func ドキュメント guelfi を参照してください。

于 2013-02-26T13:35:04.803 に答える
2

現在、レシーバーとメソッドの両方を単一の値に格納する方法はありません (構造体に格納しない限り)。これは現在取り組んでおり、Go 1.1 で変更される可能性があります ( http://golang.org/s/go11funcを参照)。

ただし、(レシーバーなしで) メソッドを関数値に割り当て、後でレシーバーを値に渡すことはできます。

package main

import "fmt"

type Foo struct {
    n int
}

func (f *Foo) Bar(m int) int {
    return f.n + m
}

func main() {
    foo := &Foo{2}
    f := (*Foo).Bar
    fmt.Printf("%T\n", f)
    fmt.Println(f(foo, 42))
}

この値は、他のものと同様にマップに格納できます。

于 2013-02-26T13:25:40.643 に答える