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

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2