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

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

有定义结构

go 复制代码
package main

import (
	"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 User
    json.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")
}

反射方式

go 复制代码
import (
	"log"
	"reflect"
)

func main() {
	type test struct {
		A bool
		B bool
		C 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 库

go 复制代码
package main

import (
	"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 Meta
	err := 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 Meta
	err2 := 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"
*/

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

相关推荐
white-persist5 分钟前
【vulhub weblogic CVE-2017-10271漏洞复现】vulhub weblogic CVE-2017-10271漏洞复现详细解析
java·运维·服务器·网络·数据库·算法·安全
zzginfo7 分钟前
JavaScript 解构赋值
开发语言·javascript·ecmascript
2501_9216494910 分钟前
Java 接入外汇数据 API 完整教程:实时报价、历史 K 线与 WebSocket 推送
java·开发语言·websocket·金融
sR916Mecz12 分钟前
MongoDB 详解、应用场景及案例分析(AI)
数据库·mongodb
℡終嚸♂68013 分钟前
Java 反序列化漏洞详解
java·开发语言
故事和你9117 分钟前
蓝桥杯-2025年C++B组国赛
开发语言·软件测试·数据结构·c++·算法·职场和发展·蓝桥杯
王忘杰26 分钟前
0基础CUDA炼丹、增加断点保存,从零开始训练自己的AI大模型 87owo/EasyGPT Python CUDA
开发语言·人工智能·python
Lzh编程小栈33 分钟前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
_MyFavorite_33 分钟前
JAVA重点基础、进阶知识及易错点总结(35)注解与反射
java·开发语言·tomcat
AbandonForce36 分钟前
模拟实现vector
开发语言·c++·算法