最终,我找到了一种方法。请遵循下面的Go Playground和代码段:
//new approach SetAttribute, without any hard coded type assertion, just based on objectType parameter
func SetAttribute(myUnkNownTypeValue *interface{}, attributeName string, attValue interface{}, objectType reflect.Type) {
// create value for old val
oldValue := reflect.ValueOf(*myUnkNownTypeValue)
//create a new value, based on type
newValue := reflect.New(objectType).Elem()
// set the old value to the new one, making the
// implicit type assertion, not hard coding that.
newValue.Set(oldValue)
//set value attribute to the new struct, copy of the old one
field := newValue.FieldByName(attributeName)
valueForAtt := reflect.ValueOf(attValue)
field.Set(valueForAtt)
//capture the new value from reflect.Value
newValInterface := newValue.Interface()
//set the new value to the pointer
*myUnkNownTypeValue = newValInterface
}