是否可以确定(使用)任意类型的实例是否可以设置为任意值,即确定是否由于类型不兼容而导致死机?reflectValue.Set()
MCVE如下所述。我想知道的是有效的“我可以在不使用延迟/恢复构造的情况下编写吗?set()
我想避免不仅因为它看起来很丑陋,而且因为可能因为其他原因而恐慌。deferValue.Set()
请注意,这不仅仅是比较类型相等的问题,如下面的示例所示。o2
package main
import (
"fmt"
"reflect"
)
// set a value V to interface i, returning true if this can be done, else false
//
// CAN WE WRITE THIS WITHOUT HAVING TO USE DEFER / RECOVER?
//
func set(v reflect.Value, i interface{}) bool {
success := true
defer func() {
if r := recover(); r != nil {
success = false
}
}()
v.Set(reflect.ValueOf(i))
return success
}
// get the type of a typed nil
func getType(typedNil interface{}) reflect.Type {
return reflect.TypeOf(typedNil).Elem()
}
func main() {
t1 := getType((*int)(nil))
o1 := reflect.New(t1)
t2 := getType((*interface{})(nil))
o2 := reflect.New(t2)
var ok bool
var aInt = 456
var aString string = "hello"
var aUint uint = 123
// Set o1 to various types
ok = set(o1.Elem(), aInt) // Should return true
fmt.Printf("After o1 set to aInt returned %v: obj is type %T content '%v'\n", ok, o1.Elem().Interface(), o1.Elem().Interface())
ok = set(o1.Elem(), aString) // Should return false
fmt.Printf("After o1 set to aString returned %v: obj is type %T content '%v'\n", ok, o1.Elem().Interface(), o1.Elem().Interface())
ok = set(o1.Elem(), aUint) // Should return false
fmt.Printf("After o1 set to aUint returned %v: obj is type %T content '%v'\n", ok, o1.Elem().Interface(), o1.Elem().Interface())
}
元芳怎么了
30秒到达战场
随时随地看视频慕课网APP
相关分类