go 语言之结构体标签

Tag是结构体元信息,可以在运行的时候通过反射的机制独取出来,Tag在结构体字段的后方定义,由一对反引号包裹起来,具体格式如下;

`key1:"value1" key2:"value2"`

结构体tag由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。同一个结构体字段可以设置多个键值对tag,不同的键值对之间使用空格分隔。

注意事项: 为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。

代码实现:

package main

import (
	"encoding/json"
	"fmt"
)

//结构体标签
type student struct {
	ID     int    `json:"id"` //通过指定tag实现json序列化该字段时的key
	Gender string //json序列化是默认使用字段名作为key
	name   string //私有不能被json包访问
}

func main() {
	s1 := student{
		ID:     1,
		Gender: "男",
		name:   "嘟嘟",
	}
	s, err := json.Marshal(s1)
	if err != nil {
		fmt.Println("json marshal failed")
		return
	}
	fmt.Printf("json 表示:%s\n", s)
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用反射的方式将go结构体转换成map。下面是示例代码: ```go import ( "reflect" ) type Person struct { Name string Age int } func StructToMap(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) var data = make(map[string]interface{}) for i := 0; i < t.NumField(); i++ { data[t.Field(i).Name] = v.Field(i).Interface() } return data } // 示例 person := Person{Name: "张三", Age: 20} data := StructToMap(person) fmt.Println(data) // 输出: map[Name:张三 Age:20] ``` 这段代码会将Person结构体转换成一个map,其中map的key是结构体中的字段名,value是对应字段的值。 ### 回答2: 在Go语言中,结构体与map之间的转换可以通过以下两种方式实现: 1. 手动转换: 首先,定义一个结构体类型,包含需要转换的字段和对应的标签(`json`、`xml`等)。 ```go type Person struct { Name string `json:"name"` Age int `json:"age"` Gender string `json:"gender"` } ``` 然后,创建一个同名的map类型,字段名作为map的key. ```go type PersonMap map[string]interface{} ``` 最后,通过遍历结构体的字段,将字段名和对应值存入map中。 ```go func StructToMap(p Person) PersonMap { m := make(PersonMap) v := reflect.ValueOf(p) t := reflect.TypeOf(p) for i := 0; i < v.NumField(); i++ { key := t.Field(i).Tag.Get("json") value := v.Field(i).Interface() m[key] = value } return m } ``` 调用函数`StructToMap`,将结构体转换为map。 ```go func main() { p := Person{ Name: "Alice", Age: 25, Gender: "female", } m := StructToMap(p) fmt.Println(m) } ``` 输出结果: ```go map[name:Alice age:25 gender:female] ``` 2. 使用第三方库: 可以使用一些第三方库如`github.com/mitchellh/mapstructure`来实现结构体转map的更复杂转换需求。 首先,使用`go get`命令安装mapstructure库。 ```shell go get github.com/mitchellh/mapstructure ``` 然后,导入该库并使用`Decode`函数将结构体转换为map。 ```go import ( "fmt" "github.com/mitchellh/mapstructure" ) type Person struct { Name string Age int Gender string } func main() { p := Person{ Name: "Alice", Age: 25, Gender: "female", } var m map[string]interface{} err := mapstructure.Decode(p, &m) if err != nil { fmt.Println(err) } fmt.Println(m) } ``` 输出结果: ```go map[Age:25 Gender:female Name:Alice] ``` 以上是两种将Go语言中的结构体转换为map的方法,可以根据具体的需求选择适合自己的方式。 ### 回答3: 在Golang中,可以通过以下几种方法将结构体转换为Map。 1. 手动转换:通过遍历结构体的字段,并逐个将字段和对应值添加到一个空的Map中。例如: ```go type Person struct { Name string Age int Gender string } func structToMap(p Person) map[string]interface{} { result := make(map[string]interface{}) result["Name"] = p.Name result["Age"] = p.Age result["Gender"] = p.Gender return result } ``` 这种方法的缺点是需要手动指定每个字段的名称和对应值,适用于结构体字段较少的情况。 2. 使用反射:通过反射库可以获取结构体的字段信息,并动态地将字段和对应值添加到Map中。例如: ```go import "reflect" func structToMap(p Person) map[string]interface{} { result := make(map[string]interface{}) structValue := reflect.ValueOf(p) structType := structValue.Type() for i := 0; i < structValue.NumField(); i++ { field := structValue.Field(i) fieldName := structType.Field(i).Name result[fieldName] = field.Interface() } return result } ``` 这种方法可以适用于任意结构体,无需手动指定字段,但是相比于手动转换会有一定的性能影响。 无论使用哪种方法,都需要根据实际需求选择适合的方式进行转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值