reflect主要用来获取运行时的状态信息
"reflect"包下主要是Type和Value两个struct:
Type封装了“类型”的属性,定义相关的东西找他;
Value主要封装了“值”的属性,与值相关的东西找他没错。此外,他是线程安全的(或者叫goroutine安全).
下面一步一步来研究
1.先声明两个struct
someStructstruct 和reflectTeststruct
其中reflectTest 包含一个reflect.Type字段
type someStruct struct {
Name string
Age int
signature string
}
type reflectTest struct {
Type reflect.Type
}
2.实例化上述两个struct
如下
one := someStruct{}
t := reflect.TypeOf(&one)
rTest := &reflectTest{t}
注意:这里实例化t时必须用&one而不是one,因为后面类型判断要用到reflect.Type的Elem方法,而reflect.Type.kind()必须是Array, Chan, Map, Ptr, or Slice类型方能调用Elem,否则会报错
3.为reflectTest 添加一个描述方法
func (rt *reflectTest) showTypes() {
kind := rt.Type.Elem().Kind()
if kind == reflect.Struct{
fmt.Println("this is a struct")
}
}
之后调用rTest.showTypes()结果输出:this is a struct,很明显,showTypes()方法里,rt.Type.kind()是一个reflect.ptr类型(实例化时参数为&one),而rt.Type.Elem().kind会是一个struct类型(等于是ptr指向的类型)
4.利用上述试验为struct动态构造sql查询语句
输出:select Name,Age,signature from someStruct
5.为struct动态构造sql插入语句
修改reflectTest
为reflectTest添加新方法saveStruct
输出(暂时没考虑sql里大小写问题):