Puppollo
2/27/2018 - 1:20 PM

reflect

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)
}