当前位置: 首页 > news >正文

将golang中变量重置为零的reflect方法

下面给出简单的代码,这里通过将变量重置为零来实现过滤字段的目的:

type student struct {
	Age    int    `json:"age,omitempty"`
	Name   string `json:"name,omitempty"`
	School string `json:"school,omitempty"`
}

var st = student{
	Age:    10,
	Name:   "john smith",
	School: "a high school",
}

var dic = map[string]int{
	"age":    0,
	"name":   1,
	"school": 2,
}

var filters = []string{
	"name",
	"school",
}

func initStudentElems(st *student, fields []string) bool {
	v := reflect.Indirect(reflect.ValueOf(st))
	for _, field := range fields {
		idx, exist := dic[field]
		if !exist {
			return false
		}
		vf := v.Field(idx)
		vf.Set(reflect.Zero(vf.Type()))
	}
	return true
}

func printMarshalIdent(st *student) error {
	b, err := json.MarshalIndent(st, "", "    ")
	if err != nil {
		return err
	}

	fmt.Println(string(b))
	return nil
}

func main() {
	printMarshalIdent(&st)
	initStudentElems(&st, filters)
	printMarshalIdent(&st)
}

 如果不希望使用二次映射,可以考虑使用reflect库中,Value结构体的FieldByName成员函数。

转载于:https://www.cnblogs.com/albizzia/p/10341404.html

相关文章:

  • Java虚拟机之内存模型
  • [CTSC2014]企鹅QQ
  • 单词接龙---牛客网
  • Bzoj2164 采矿(线段树+树链剖分)
  • 个位数统计
  • CF528D Fuzzy Search (生成函数+FFT)
  • c++随机数引擎
  • 《学习之道》第六章番茄工作法
  • 加密_滴答~滴
  • Ext中 grid 设置行样式
  • 技术研究 | 我所了解的物联网设备渗透手段(硬件篇)
  • Exif xss
  • C语言复习1_变量与数据类型
  • linux操作文本三个命令awk、grep、sed
  • 【c#】RabbitMQ学习文档(三)Publish/Subscribe(发布/订阅)
  • ----------
  • JS 中的深拷贝与浅拷贝
  • C++入门教程(10):for 语句
  • ES10 特性的完整指南
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • MQ框架的比较
  • Redis 懒删除(lazy free)简史
  • Redux系列x:源码分析
  • Vue 动态创建 component
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 七牛云假注销小指南
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 再谈express与koa的对比
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​configparser --- 配置文件解析器​
  • ​如何防止网络攻击?
  • #### go map 底层结构 ####
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (31)对象的克隆
  • (pojstep1.3.1)1017(构造法模拟)
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转) Face-Resources
  • (转)setTimeout 和 setInterval 的区别
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET4.0并行计算技术基础(1)
  • .net下简单快捷的数值高低位切换
  • .NET中统一的存储过程调用方法(收藏)
  • @拔赤:Web前端开发十日谈
  • [20150904]exp slow.txt
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C]编译和预处理详解
  • [C++]打开新世界的大门之C++入门