首页 > 其他分享 >Go 反射 の 应用场景

Go 反射 の 应用场景

时间:2025-01-19 17:33:23浏览次数:1  
标签:反射 场景 Name Age insertObjectInDb Student Go string

两年前曾经写过一篇博客,是关于反射基本概念的 Go 反射 の 基本概念,之后对其再也没有更深入的学习,主要因为 反射主要应用在一些基本库中,而在平时的项目开发中几乎用不到。本文结合一个sql构造器的应用案例,深入的了解一下反射的应用场景。

什么是反射

射就是程序在运行时,能够找到变量类型和值得能力

看到上面的解释,初学的人,就会有疑问,怎么会有这种情况?go这种强类型的语言,不应该是先把类型定义好了,然后再使用吗?怎么还会有不知道结构体类型的情况呢?你别说,还真有!,请看下面的这样一个例子。

使用反射实现一个SQL构造器

比如我们要设计一个 SQL 构造器,将 student对象,通过 insertObjectInDb 方法写入到数据库中。

type Student struct {
	Name string
	Age  int
}
func insertObjectInDb(s Student) {
	fmt.Printf("把 name: %s 插入数据库\n", s.Name)
	fmt.Printf("把 age:  %d 插入数据库\n", s.Age)
}

func main() {
	s := Student{
		Name: "座山雕",
		Age:  18,
	}
	insertObjectInDb(s)
}

通过上面的例子,你就会发现,insertObjectInDb 方法,并不具有普适性。他只能处理 Student 这个固定结构体。如果我再有一个 school 这个结构体呢?他就处理不了。所以该如何提高该方法的泛化能力呢?此时就可以用到反射了

使用反射,泛化 insertObjectInDb 的处理能力

type Student struct {
	Name string
	Age  int
	//反射中,不能使用是私有变量,不然会报错
	//addr string
}

type School struct {
	NumberOfPeople int
	Addr           string
}

func insertObjectInDb(obj any) {
	t := reflect.TypeOf(obj)
	v := reflect.ValueOf(obj)
	for i := 0; i < t.NumField(); i++ {
		fmt.Println("属性名称:", t.Field(i).Name, "属性类型", t.Field(i).Type, "属性值", v.Field(i).Interface())
	}
}

func main() {
	s := Student{
		Name: "座山雕",
		Age:  18,
		//addr: "北京朝阳区",
	}
	sc := School{
		NumberOfPeople: 3000,
		Addr:           "上海浦东新区",
	}
	insertObjectInDb(s)
	insertObjectInDb(sc)
}

参考文献

https://juejin.cn/post/7025523426060140551

标签:反射,场景,Name,Age,insertObjectInDb,Student,Go,string
From: https://www.cnblogs.com/rush-peng/p/18679695

相关文章

  • AI agent 在 6G 网络应用,无人机群控场景
    AIagent在6G网络应用,无人机群控场景随着6G时代的临近,融合人工智能成为关键趋势。借鉴IT行业AIAgent应用范式,提出6GAIAgent技术框架,包含多模型融合、定制化Agent和插件式环境交互理念,构建了涵盖四层结构的框架。通过各层协同实现自主环境感知等能力,并以无......
  • Cecil修改UnityDll,不使用反射就能调用internal的函数
    简介在UnityEditor开发过程中,我们会经常使用反射调用一些unity还没开放的接口,比如s_LastControlID,但每个程序集都写一边反射不免显得有些麻烦。本篇文章将介绍注入InternalsVisibleToAttribute注解到unitydll的方法,来帮助大家更便捷地调用unity的内部函数。思路Internals......
  • jenkins + gogs + docker + nginx 完成自动化部署
    jenkins+gogs+docker+nginx完成自动化部署app安装部署1.docker-compose配置文件version:'3'services:nginx:image:nginx:latestports:-"80:80"volumes:-./nginx.conf:/etc/nginx/nginx.confdepends_on:-jen......
  • 【开源】一款功能全面的商用级溯源防伪系统,适用于各种溯源场景
    项目介绍HiPi是一款开源、功能全面的商用级溯源防伪系统,一物一码系统,适用于各种溯源场景的大、中、小、微规模企业。系统能够追踪记录产品的生命周期各个环节,并将产品信息保存在系统中,实现品牌保护、产品营销、防止假冒伪劣产品、防窜货、产品追踪溯源等功能。应用场景快销品行......
  • 前端必知必会-Node.js连接MongoDB 创建集合
    文章目录Node.js连接MongoDB创建集合创建集合总结Node.js连接MongoDB创建集合MongoDB中的集合与MySQL中的表相同创建集合要在MongoDB中创建集合,请使用createCollection()方法:示例获取您自己的Node.js服务器创建一个名为“customers”的集合:varMon......
  • 前端必知必会-Node.js连接MongoDB 删除集合
    文章目录Node.js连接MongoDB删除集合删除集合db.dropCollection总结Node.js连接MongoDB删除集合删除集合您可以使用drop()方法删除表或MongoDB中所谓的集合。drop()方法采用包含错误对象和结果参数的回调函数,如果成功删除集合,则返回true,否则返回false。......
  • 你有用过HTML5的track标签吗?说说它的运用场景有哪些?
    HTML5的<track>标签是HTML5中新引入的元素,主要用于为HTML5视频(<video>)和音频(<audio>)元素提供文本轨道,比如字幕、标题、说明、章节导航、元数据等。这些信息可以显示在视频或音频的播放界面上,从而增强用户的观看或听音体验。<track>标签的运用场景主要包括:字幕和标题:这是<track>......
  • 请说说你对vh、vw的理解以及它们的运用场景是什么?
    vh和vw的理解vh和vw是前端开发中常用的两种视窗单位,它们是相对于视口(Viewport)的宽度和高度的百分比单位。具体来说:vw(ViewportWidth):代表视口宽度的百分之一。例如,如果浏览器的视口宽度是900像素,那么1vw就等于9像素。无论浏览器窗口如何变化,1vw始终都是视口宽度的1%。vh(View......
  • 2025年编程语言热度分析:Python领跑,Go与Rust崛起
    TIOBEIndex(TIOBE编程语言指数)是一个衡量编程语言流行度的排名系统。它通过分析多种搜索引擎、在线编程社区、技术论坛、问答网站(如Google、Bing、Yahoo、Wikipedia、StackOverflow)等的搜索和讨论数据,评估不同编程语言的受欢迎程度。TIOBEIndex每月更新一次,并根据多个因......
  • Spring中Bean的作用域解析及使用场景
    目录一、Singleton(单例模式)二、Prototype(原型模式)三、Request(请求作用域)四、Session(会话作用域)五、GlobalSession(全局会话作用域)六、Application(应用作用域)七、WebSocket(WebSocket作用域)在Spring框架中,Bean的作用域决定了Bean的生命周期和可见范围。合理选择Bean的作......