Recentemente ho usato una mappa in uno dei miei progetti golang, che ha avuto i puntatori a funzione come tasti come questo:mappa con puntatore a funzione, come chiave per andare
map[*functiontype] somestructtype
uno dei miei colleghi ha detto che questa era una cattiva idea, quindi ora non sono sicuro che questo sia fattibile. Inizialmente l'ho ritenuto ok, perché i puntatori del metodo possono essere controllati per l'uguaglianza e sono immutabili. Qualcuno può fornire un ragionamento su questo argomento?
Esempio completo:
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)])
}
dispiace, avevo inizialmente omesso l'asterisco prima FunctionType nel mio esempio. Quindi quanto sopra (appena modificato) sarebbe davvero ok? –
@PeterHommel Non c'è niente di tecnicamente sbagliato in questo, anche se è difficile immaginare perché si vorrebbe un puntatore a una funzione. Quale problema pensi che richieda questa indiretta? Nota che i puntatori alle funzioni in Go non sono gli stessi dei puntatori di funzione in C; sarebbero più simili ai puntatori ai puntatori alle funzioni in C. – rightfold
Li ho usati come callback del gestore in un sistema di plugin. Volevo semplicemente allegare alcuni dati dall'esterno a ogni istanza di questo callback e quindi utilizzato questo tipo di costrutto. –