前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 使用 inline 处理 JSON/YAML 内联字段的2点注意事项

Golang 使用 inline 处理 JSON/YAML 内联字段的2点注意事项

作者头像
老麦
发布2024-01-12 17:25:16
4090
发布2024-01-12 17:25:16
举报
文章被收录于专栏:Go与云原生Go与云原生

Golang 使用 inline 处理 JSON/YAML 内联字段的2点注意事项

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2024/01/09/golang-tag-inline/

这是一片错误笔记, 没什么高大上的东西。简单记录一下在 Go 中使用 json 和 yaml 在解析字符串的时候没有太注意的一个点。

以 Json 为例, 通常我们在 struct结构Json结构 的时候是 一一对应 的。

以下几种名字都是我自己取的, 不保证正确。

1. 平板型

平铺直叙, 没有任何波澜, 最简单的类型。

2. 嵌套型:

  1. 嵌套对象也支持引用/指针类型
  2. 嵌套对象可以是:struct, slice, map 等。
    • 从某种角度来说, 平板型 可以被认为是一种 特殊嵌套型, 被嵌套对象是 基础类型
  3. 嵌套对象是 具名嵌套

以上说的这两种情况是最常用的。

3. 内联型 (,inline)

在 tag 种使用 ,inline 关键值。可以实现这种 内敛型

从图中可以看到

  1. 左边:使用了平板型的 Json 结构
  2. 右边:使用了嵌套型的 struct 结构, 但又有一点差别。

需要 特别强调 的是:

  1. 需要使用 tag inline 关键字, 但需要省略 字段映射名字。所以 inline 前面有一个 ,
    • json:",inline"
  2. 字段 必须匿名嵌套 的。

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,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 平板型
  • 2. 嵌套型:
  • 3. 内联型 (,inline)
    • 3.1 应用场景
      • 3.2 测试案例
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档