golang里的reflect

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里大小写问题):


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容