页面加载中,请稍候
来源:嵌入式应用研究院发布时间:2023-05-241324浏览
询问 AI点击上方“嵌入式应用研究院”,选择“置顶/星标公众号”
干货福利,第一时间送达!来源 | golang编程笔记
整理&排版| 嵌入式应用研究院
1 为什么需要反射反射就是程序能够在运行时检查变量和值,求出它们的类型。(注:C++用的是模板编程)比如下面的例子,我们要根据输入的结构体参数字段的值,生成SQL语句。显而易见,对于定义的两个完全不同的结构体,我们需要在函数中判断传入的时什么类型,不然生成的SQL语句就是错的。这就需要在运行时判断输入的参数时什么类型
typeorderstruct{2 reflect包
ordIdint
customerIdint
}
typeemployeestruct{
namestring
idint
addressstring
salaryint
countrystring
}
//这里要判断q的具体类型,不然获取字段值就会出错
funccreateQuery(qinterface{})string{
i:=fmt.Sprintf("insertintoordervalues(%d,%d)",q.ordId,q.customerId)
returni
}
funcmain(){
o:=order{
ordId:1234,
customerId:567,
}
fmt.Println(createQuery(o))
}
在Go语言中,reflect实现了运行时反射。reflect包会帮助识别interface{}变量的底层具体类型和具体值。常用方法如下:
示例如下:
packagemain
typeorderstruct{
ordIdint
customerIdint
}
funccreateQuery(qinterface{}){
t:=reflect.TypeOf(q)
k:=t.Kind()
fmt.Println("Type",t)//输出main.order
fmt.Println("Kind",k)//输出struct
}
有了反射机制,我们可以实现第一小节SQL的例子了:
funccreateQuery(qinterface{})string{
ifreflect.ValueOf(q).Kind()==reflect.Struct{//判断是不是结构体
t:=reflect.TypeOf(q).Name()//获取类型名称
query:=fmt.Sprintf("insertinto%svalues(",t)
v:=reflect.ValueOf(q)//获取值
fori:=0;i<v.NumField();i++{//获取字段个数
switchv.Field(i).Kind(){
casereflect.Int:
ifi==0{
query=fmt.Sprintf("%s%d",query,v.Field(i).Int())//取出当前字段的值,加入到query中
}else{
query=fmt.Sprintf("%s,%d",query,v.Field(i).Int())
}
casereflect.String:
ifi==0{
query=fmt.Sprintf("%s\"%s\"",query,v.Field(i).String())
}else{
query=fmt.Sprintf("%s,\"%s\"",query,v.Field(i).String())
}
default:
fmt.Println("Unsupportedtype")
return
}
}
query=fmt.Sprintf("%s)",query)
fmt.Println(query)
returnquery
}
fmt.Println("unsupportedtype")
}
必须注意:反射是Go语言中非常强大和高级的概念,我们应该小心谨慎地使用它。使用反射编写清晰和可维护的代码是十分困难的。你应该尽可能避免使用它,只在必须用到它时,才使用反射。
sss
新闻来源:嵌入式应用研究院,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-07-15

2026-06-25