Вы можете, но так как Go не поддерживает генерики, вы должны определить callback
для типа interface{}
.
Чтобы вызвать значение функции, хранящееся в callback
, вы можете использовать отражениеа именно метод Value.Call()
.
Вот как это будет выглядеть:
func F(callback interface{}, args ...interface{}) {
v := reflect.ValueOf(callback)
if v.Kind() != reflect.Func {
panic("not a function")
}
vargs := make([]reflect.Value, len(args))
for i, arg := range args {
vargs[i] = reflect.ValueOf(arg)
}
vrets := v.Call(vargs)
fmt.Print("\tReturn values: ")
for _, vret := range vrets {
fmt.Print(vret)
}
fmt.Println()
}
При этом вывод вашего приложения будет (попробуйтена игровой площадке Go ):
CB1 called
Return values:
CB2 called
Return values: false
CB3 called
Return values:
CB4 called
Return values: false