golang如何使用如何使用struct的的tag属性的详细介绍属性的详细介绍
主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也
给大家做个参考。一起跟随小编过来看看吧
从一个例子说起
我们经常会碰到下面格式的struct定义:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
这个struct定义一个叫做Person的类型,包含两个域Name和Age;但是在域的后面有神奇的 json:"name" ,这个用来干什么
用?这篇文章试图来解释这个问题。
当golang的对象需要和json做转换的时候,我们就经常用到这个特性。
有两点注意的地方:有两点注意的地方:
1、如果一个域不是以大写字母开头的,那么转换成json的时候,这个域是被忽略的。
$ cat main.go
package main
import (
"fmt"
"encoding/json"
)
type Person struct {
Name string `json:"name"`
age int `json:"age"`
}
func main() {
person := Person { "tom", 12 }
if b, err := json.Marshal(person); err != nil {
fmt.Printf("error: %s", err.Error())
} else {
fmt.Printf("value: %s", b)
}
}
$ go build -o main main.go
$ ./main
value: {"name":"tom"}
我们看到转换成json串之后,name正常输出了,而age被丢弃了,因为age以小写字母开头。
2、如果没有使用 json:"name" tag,那么输出的json字段名和域名是一样的。
$ cat main.go
package main
import (
"fmt"
"encoding/json"
)
type Person struct {
Name string
Age int
}
func main() {
person := Person { "tom", 12 }
if b, err := json.Marshal(person); err != nil {
fmt.Printf("error: %s", err.Error())
} else {
fmt.Printf("value: %s", b)
}
}
$ go build -o main main.go
$ ./main
value: {"Name":"tom","Age":12}