code: func set(dst, src reflect.Value) error {
  	dstType, srcType := dst.Type(), src.Type()
  	switch {
  	case dstType.Kind() == reflect.Interface && dst.Elem().IsValid():
  		return set(dst.Elem(), src)
  	case dstType.Kind() == reflect.Ptr && dstType.Elem() != derefbigT:
  		return set(dst.Elem(), src)
  	case srcType.AssignableTo(dstType) && dst.CanSet():
  		dst.Set(src)
  	case dstType.Kind() == reflect.Slice && srcType.Kind() == reflect.Slice:
  		return setSlice(dst, src)
  	default:
  		return fmt.Errorf("abi: cannot unmarshal %v in to %v", src.Type(), dst.Type())
  	}
  	return nil
  }
docs: // set attempts to assign src to dst by either setting, copying or otherwise.
  //
  // set is a bit more lenient when it comes to assignment and doesn't force an as
  // strict ruleset as bare `reflect` does.