Nie można to zrobić bezpośrednio, jak już wspomniano, ale można rodzaju udawać zrobić coś takiego:
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
Jest to nieco kłopotliwe i szczerze mówiąc uważam, że bardzo zły jest zasadniczo użycie jako wskaźnika twojej mapy wersji smyczkowej wskaźnika. Ale ... to przynajmniej opcja, jeśli naprawdę tego potrzebujesz.
Jaki jest dokładny przypadek użycia? Czy interfejs nie byłby bardziej semantyczny i bardziej rozszerzalny? –
Muszę wiedzieć, czy funkcja, którą otrzymałem od 'trie' jest funkcją, która została utworzona przez funkcję' X' lub nie. – Kokizzu