最近golang 项目需要一个通用函数,更新结构体中的数据。查看资料需要用到反射机制,之前对反射机制理解不深,费了些周折,终于有所理解,记录于此,供自己和大家参考。
理解interface{}变量
理解reflect 机制很重要一点,本人觉得关键需要理解把一个变量传给下面例子函数的interface{}参数后,interface{}获取了变量的哪些信息。
func reload(i interface{}) {
}
通过reflect的unpackEface函数可以推测变量传给interface{}参数后,会把参数信息存储到emptyInterface结构体中
func unpackEface(i interface{}) Value {
e := (*emptyInterface)(unsafe.Pointer(&i))
// NOTE: don't read e.word until we know whether it is really a pointer or not.
t := e.typ
if t == nil {
return Value{}
}
f := flag(t.Kind())
if ifaceIndir(t) {
f |= flagIndir
}
return Value{t, e.word, f}
}
emptyInterface结构体包含变量的结构体信息和指向结构体的指针
// emptyInterface is the header for an interface{} value.
type emptyIn