Go struct tag能否设置默认值?

简介: Go struct tag能否设置默认值?

struct tag默认值



1. 需求背景


有时候gopher在marshal一个struct到json的时候,想要struct某些属性在没有值的情况下有默认值,但是按照现在marshar的作用下不会给struct的属性赋默认值,所以为了解决这个特殊需求,我们应该按照以下方案来解决。


2. 解决方案


利用反射,因为通过反射,我们可以拿到tag属性,进而对默认字段做赋值操作


先看一段代码:


type test struct {
    Name     string `json:"name"`
    Addr     string `json:"addr" default:"localhost"`
    Port     uint   `json:"port" default:"8080"`
}
func MarshalJson(i interface{}) ([]byte, error) {
    typeof := reflect.TypeOf(i)
    valueof := reflect.ValueOf(i)
    for i := 0; i < typeof.Elem().NumField(); i++ {
        if valueof.Elem().Field(i).IsZero() {
            def := typeof.Elem().Field(i).Tag.Get("default")
            if def != "" {
                switch typeof.Elem().Field(i).Type.String() {
                case "int":
                    result, _ := strconv.Atoi(def)
                    valueof.Elem().Field(i).SetInt(int64(result))
                case "uint":
                    result, _ := strconv.ParseUint(def, 10, 64)
                    valueof.Elem().Field(i).SetUint(result)
                case "string":
                    valueof.Elem().Field(i).SetString(def)
                }
            }
        }
    }
    return json.Marshal(i)
}
func main() {
    t := &test{
        Name:     "test server",
    }
    data, err := MarshalJon(t)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}
结果:
{"name":"test server","addr":"localhost","port":8080}


3. 小结


其实在解析struct的时候golang本身已经为struct的属性按照类型赋默认值了,但是这个默认值在没有办法满足我们的需求的时候,这个时候就需要造轮子,别怕麻烦,解决问题才是王道。大家想想unmarshal的时候如何赋默认值呢?

相关文章
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
JSON 编译器 Go
Go struct
该文章详细讨论了Go语言中的结构体,包括结构体的字面形式、内存对齐和填充、字段标签的使用、结构体值的赋值和可寻址性、组合字面量的取地址特性、通过指针访问结构体字段的隐式解引用,以及结构体值的比较和类型转换。
18 3
|
3月前
|
Go
Go - struct{} 实现 interface{}
Go - struct{} 实现 interface{}
39 9
|
3月前
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
31 0
|
5月前
|
JSON Go 数据格式
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(4)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
5月前
|
Java 编译器 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(3)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
5月前
|
存储 安全 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(2)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
5月前
|
Java Go 索引
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(1)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言结构体(struct)入门:定义与使用
【4月更文挑战第22天】Go语言中的结构体是构建复杂数据类型的关键,允许组合多种字段。本文探讨了结构体定义、使用及常见问题。结构体定义如`type Person struct { Name string; Age int; Address Address }`。问题包括未初始化字段的默认值、比较含不可比较字段的结构体以及嵌入结构体字段重名。避免方法包括初始化结构体、自定义比较逻辑和使用明确字段选择器。结构体方法、指针接收者和匿名字段嵌入提供了灵活性。理解这些问题和解决策略能提升Go语言编程的效率和代码质量。
121 1
|
6月前
|
JSON Go 数据库
Go语言中tag的用处及详细介绍
【2月更文挑战第24天】
205 2