Sie können dies nicht direkt tun, wie bereits erwähnt, aber man kann Art gefälschte es tun Sie etwas wie folgt aus:
package main
import "fmt"
func a(i int) int {
return i + 1
}
func b(i int) int {
return i + 2
}
type Function func(int)int
type FunctionWrapper struct {
f *Function
}
var fnMap = make(map[string]FunctionWrapper)
// MakeFunctionWrapper returns a unique FunctionWrapper per Function pointer, using fnMap to avoid having multiple values for the same function
func MakeFunctionWrapper(f Function) FunctionWrapper {
key := fmt.Sprintf("%#v", f)
data, ok := fnMap[key]
if !ok {
data = FunctionWrapper{&f}
fnMap[key] = data
}
return data
}
func main() {
functions := make(map[FunctionWrapper]bool)
fa := MakeFunctionWrapper(a)
fb := MakeFunctionWrapper(b)
fb2 := MakeFunctionWrapper(b)
functions[fa] = true
functions[fb] = true
functions[fb2] = false // This overwrites the previous value since fb is essentially the same as fb2
fmt.Println(functions[fa]) // "true"
fmt.Println(functions[fb]) // "false"
fmt.Println(functions[fb2]) // "false"
}
Check it out on the Go playground
Dies ist ein wenig umständlich, und ich denke, es ist eine sehr schlechte Idee, die String-Version eines Zeigers im Wesentlichen als Schlüssel Ihrer Karte zu verwenden. Aber ... es ist zumindest eine Option, wenn Sie es wirklich brauchen.
Was ist die genaue Anwendungsfall? Wäre eine Schnittstelle hier nicht semantischer und erweiterbarer? –
Ich muss wissen, ob eine Funktion, die ich von einem 'Trie 'erhielt, eine Funktion ist, die durch die Funktion' X' erzeugt wurde oder nicht. – Kokizzu