golang 中判断结构体中某一个属性是否存在(以区分零值)

2023-12-26 07:52

本文主要是介绍golang 中判断结构体中某一个属性是否存在(以区分零值),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原问题地址:validate-struct field if it exists

有定义结构

package mainimport ("fmt""encoding/json"
)type User struct {Name     string  `json:"name,omitempty"`Username *string `json:"username,omitempty"`Email    string  `json:"email,omitempty"`Town     string  `json:"town,omitempty"`//more fields here
}func main() {var u, u2 Userjson.Unmarshal([]byte(`{"username":"hi"}`), &u)fmt.Println("username set:", u.Username != nil, *u.Username)json.Unmarshal([]byte(`{}`), &u2)fmt.Println("username set:", u2.Username != nil)fmt.Println("Hello, playground")
}

反射方式

import ("log""reflect"
)func main() {type test struct {A boolB boolC bool}v := new(test)metaValue := reflect.ValueOf(v).Elem()for _, name := range []string{"A", "C", "Z"} {field := metaValue.FieldByName(name)if field == (reflect.Value{}) {log.Printf("Field %s not exist in struct", name)}}
}

借助 json 库

package mainimport ("fmt""encoding/json"
)func main() {fmt.Println("Hello, World!")type Meta struct{FcTag struct{Name string `json:"name"`Value json.Number `json:"value"`} `json:"fc_tag"`}template := `{"fc_tag": {"name": "tiger"}}`var meta1 Metaerr := json.Unmarshal([]byte(template), &meta1)if err != nil {fmt.Println("err=", err.Error())}else{fmt.Printf("meta1=%#v\n", meta1.FcTag.Value)}template = `{"fc_tag": {"name": "tiger", "value": 1}}`var meta2 Metaerr2 := json.Unmarshal([]byte(template), &meta2)if err2 != nil {fmt.Println("err=", err2.Error())}else{fmt.Printf("meta2=%#v\n", meta2.FcTag.Value)}
}/*Hello, World!meta1=""meta2="1"
*/

给以后解决类似问题,提供了不错的思路👍🏻

这篇关于golang 中判断结构体中某一个属性是否存在(以区分零值)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/538616

相关文章

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作