乐趣区

关于golang:连json包变量不加tag会怎么样都不知道年轻人耗子尾汁

问题

json包里应用的时候,构造体里的变量不加 tag 能不能失常转成 json 里的字段?

怎么答

  • 如果变量 首字母小写 ,则为private。无论如何 不能转 ,因为取不到 反射信息
  • 如果变量 首字母大写,则为public

    • 不加 tag,能够失常转为 json 里的字段,json内字段名跟构造体内字段 原名统一
    • 加了 tag,从 structjson的时候,json的字段名就是 tag 里的字段名,原字段名曾经没用。

举例

通过一个例子加深了解。

package main
import (
    "encoding/json"
    "fmt"
)
type J struct {
    a string             // 小写无 tag
    b string `json:"B"`  // 小写 +tag
    C string             // 大写无 tag
    D string `json:"DD"` // 大写 +tag
}
func main() {
    j := J {
      a: "1",
      b: "2",
      C: "3",
      D: "4",
    }
    fmt.Printf("转为 json 前 j 构造体的内容 = %+v\n", j)
    jsonInfo, _ := json.Marshal(j)
    fmt.Printf("转为 json 后的内容 = %+v\n", string(jsonInfo))
}

输入

转为 json 前 j 构造体的内容 = {a:1 b:2 C:3 D:4}
转为 json 后的内容 = {"C":"3","DD":"4"}

解释

  • 构造体里定义了四个字段,别离对应 小写无 tag小写 +tag大写无 tag大写 +tag
  • 转为 json 后首字母 小写的 不论加不加 tag都不能 转为 json 里的内容,而 大写的 加了 tag 能够 取别名 ,不加tagjson内的字段跟构造体字段 原名统一

文章举荐:

  • 连 nil 切片和空切片一不一样都不分明?那 BAT 面试官只好让你回去等告诉了。
  • 昨天那个在 for 循环里 append 元素的共事,明天还在么?
  • golang 面试官:for select 时,如果通道曾经敞开会怎么样?如果只有一个 case 呢?
  • golang 面试官:for select 时,如果通道曾经敞开会怎么样?如果只有一个 case 呢?
  • golang 面试题:对曾经敞开的的 chan 进行读写,会怎么样?为什么?
  • golang 面试题:对未初始化的的 chan 进行读写,会怎么样?为什么?
  • golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出公有变量的 tag?
  • golang 面试题:json 包变量不加 tag 会怎么样?
  • golang 面试题:怎么防止内存逃逸?
  • golang 面试题:简略聊聊内存逃逸?
  • golang 面试题:字符串转成 byte 数组,会产生内存拷贝吗?
  • golang 面试题:翻转含有中文、数字、英文字母的字符串
  • golang 面试题:拷贝大切片肯定比小切片代价大吗?
  • golang 面试题:能说说 uintptr 和 unsafe.Pointer 的区别吗?
如果你想每天学习一个知识点?

退出移动版