package main
import (
"encoding/json"
"fmt"
)
type Project struct {
Key string `json:"key"`
Value string `json:"value"`
}
type JiraHttpReqField struct {
Project `json:",inline"`
Summary string `json:"summary"`
Description string `json:"description"`
}
func main() {
dataProject := Project{
Key: "key",
Value: "value",
}
dataJiraHttpReqField := &JiraHttpReqField{
Project: dataProject,
Summary: "Summary",
Description: "Description",
}
data, _ := json.Marshal(dataJiraHttpReqField)
fmt.Println(string(data))
}
JiraHttpReqField 跟Project结构体是平级关系,如果很多struct需要Project里面的字段,可以直接inline Project,减少重复定义
建议点击 查看原文 查看最新内容。
原文链接: https://typonotes.com/posts/2024/01/09/golang-tag-inline/
这是一片错误笔记, 没什么高大上的东西。简单记录一下在 Go 中使用 json 和 yaml 在解析字符串的时候没有太注意的一个点。
以 Json 为例, 通常我们在 struct结构 与 Json结构 的时候是 一一对应 的。
以下几种名字都是我自己取的, 不保证正确。
1. 平板型
平铺直叙, 没有任何波澜, 最简单的类型。
2. 嵌套型:
- 嵌套对象也支持引用/指针类型
- 嵌套对象可以是:struct, slice, map 等。
- 从某种角度来说, 平板型 可以被认为是一种 特殊 的 嵌套型, 被嵌套对象是 基础类型
- 嵌套对象是 具名嵌套
以上说的这两种情况是最常用的。
3. 内联型 (,inline)
在 tag 种使用 ,inline
关键值。可以实现这种 内敛型:
从图中可以看到
- 左边:使用了平板型的 Json 结构
- 右边:使用了嵌套型的 struct 结构, 但又有一点差别。
需要 特别强调 的是:
- 需要使用 tag
inline
关键字, 但需要省略 字段映射名字。所以 inline 前面有一个,
json:",inline"
- 字段 必须 是 匿名嵌套 的。
NOTE: 如果使用具名嵌套则,即使使用了 inline 也无效。也是这种习惯造成我错误记忆的。
3.1 应用场景
我能想到最直观的,就是 k8s yaml 声明文件中的 api信息
代码语言:javascript 复制type Deployment struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec DeploymentSpec `json:"spec,omitempty"`
Status DeploymentStatus `json:"status,omitempty"`
}
// +k8s:deepcopy-gen=false
type TypeMeta struct {
Kind string `json:"kind,omitempty"`
APIVersion string `json:"apiVersion,omitempty"`
}
对应的 yaml 文件
代码语言:javascript 复制# k8s deployment.yaml
# inline 内联
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
# ...
3.2 测试案例
代码语言:javascript 复制package main
import (
"encoding/json"
"fmt"
)
type info_inline struct {
User user `json:"user"`
address `json:",inline"`
}
type user struct {
Name string `json:"name"`
Age int `json:"age"`
}
type address struct {
Home string `json:"home"`
School string `json:"school"`
}
func main() {
s := `{
"user": {
"name": "jarvis",
"age": 18
},
"home": "home",
"school": "school"
}`
var i info_inline
err := json.Unmarshal([]byte(s), &i)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", i)
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-09,如有侵权请联系 [email protected] 删除
yaml
笔记
对象
json
inline
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/fjgui/article/details/104063806