ich vor kurzem eine Karte in einem meiner golang Projekte verwendet, die Funktionszeiger als Schlüssel wie folgt hatte:Karte mit Funktionszeiger als Schlüssel in go
map[*functiontype] somestructtype
Einer meiner Kollegen sagte dies eine schlechte Idee war, Jetzt bin ich mir nicht sicher, ob das machbar ist. Ich hielt es zunächst für OK, weil Methodenzeiger auf Gleichheit überprüft werden können und unveränderbar sind. Kann jemand etwas dazu beitragen?
Komplettes Beispiel:
package main
import "fmt"
type s struct {
string
}
type f func() string
func func1() string { return "func 1" }
func func2() string { return "func 2" }
func main() {
// make two functions and two pointers to them
f1, f2 := func1, func2
p1, p2 := (*f)(&f1), (*f)(&f2)
// make a map of their function pointers
m := make(map[*f]s)
m[p1] = s{"struct 1"}
m[p2] = s{"struct 2"}
// print out the mapping
printmapping(m, p1, p2)
// reverse the pointers and have that printed
p1, p2 = (*f)(&f2), (*f)(&f1)
printmapping(m, p1, p2)
}
func printmapping(m map[*f]s, p1, p2 *f) {
fmt.Println("pointer 1:", m[(*f)(p1)])
fmt.Println("pointer 2:", m[(*f)(p2)])
}
Leider hatte ich weggelassen ursprünglich das Sternchen vor Function in meinem Beispiel. Also wäre das obige (gerade editiert) wirklich in Ordnung? –
@PeterHommel Da ist nichts technisch falsch, obwohl man sich kaum vorstellen kann, warum man einen Zeiger auf eine Funktion haben möchte. Welches Problem, denkst du, braucht diese Umleitung? Beachten Sie, dass Zeiger auf Funktionen in Go nicht mit Funktionszeigern in C identisch sind. Sie wären den Zeigern von Funktionszeigern in C ähnlicher. – rightfold
Ich habe sie als Handler-Callbacks in einem Plugin-System verwendet. Ich wollte nur einige Daten von außen an jede Instanz dieses Callbacks anhängen und verwendete daher diese Art von Konstrukt. –