问题

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

怎么答

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

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

举例

通过一个例子加深了解。

package mainimport (    "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的区别吗?
如果你想每天学习一个知识点?