pass callback interface value to interface
package main
import (
"reflect"
"errors"
)
func ddd(value interface{}, cb func() interface{}) error {
rvalue := reflect.ValueOf(value)
if rvalue.Kind() != reflect.Ptr {
return errors.New("value should be addressable")
}
rvalue = reflect.Indirect(rvalue)
rv := reflect.ValueOf(cb())
if rv.Type().Kind() == reflect.Ptr {
rv = reflect.Indirect(rv)
}
if !rv.Type().AssignableTo(rvalue.Type()) {
return errors.New("cb should return Type/*Type as value Type")
}
rvalue.Set(rv)
rvalue = rvalue.Addr()
return nil
}
func main() {
var i int
err := ddd(&i, func() interface{} { return 50 })
if err != nil {
panic(err)
}
println(i)
}