golang json unmarshal 默认值_聊聊golang的零值

本文探讨了Golang中未赋值变量的默认零值,如布尔型的false,数值型的0,字符串的"",以及指针、函数、接口等的nil。同时提到,在JSON解析中,nil实例的处理方式,以及访问不存在的map键将返回对应类型的零值。此外,对于零值的slice和map,可以安全地进行for range遍历。但要注意,直接访问nil对象的属性或方法会导致运行时错误。
摘要由CSDN通过智能技术生成

本文主要研究一下golang中的零值

9a5ea63f4d6458a4ce742f1c1fe7c9fd.png

zero value

初始化时没有赋值的变量的默认值如下:

  • false for booleans
  • 0 for numeric types
  • "" for strings
  • nil for pointers, functions, interfaces, slices, channels, and maps

访问nil实例

package mainimport (    "encoding/json"    "fmt")// https://golang.google.cn/ref/spec#The_zero_valuetype Demo struct {    Name string    Ptr *string}type DemoFunc func() stringtype DemoInterface interface {    Hello() string}func main() {    var demo Demo    fmt.Println("demo.Name=", demo.Name)    // {"Name":"","Ptr":null}    printJson(demo)    var demoPtr *Demo    // null    printJson(demoPtr)    // panic: runtime error: invalid memory address or nil pointer dereference    // [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x10a7167]    // fmt.Println(demoPtr.Name)    var demoFunc DemoFunc    // could not marshal object    printJson(demoFunc)    // panic: runtime error: invalid memory address or nil pointer dereference    // fmt.Println(demoFunc())    var demoInterface DemoInterface    // null    printJson(demoInterface)    // panic: runtime error: invalid memory address or nil pointer dereference    // fmt.Println(demoInterface.Hello())    var s []Demo    // []    fmt.Println("[]Demo=", s)    // null    printJson(s)    for _, e := range s {        fmt.Println(e)    }    var sp []*Demo    // []    fmt.Println("[]*Demo=", sp)    // null    printJson(sp)    for _, e := range sp {        fmt.Println(e)    }    var c chan bool    //     fmt.Println(c)    var m map[string]int    // map[]    fmt.Println("map[string]int=", m)    // 0    fmt.Println(m["abc"])    // null    printJson(m)    for k, e := range m {        fmt.Println(k)        fmt.Println(e)    }}func printJson(data interface{}) {    jsonBytes, err := json.Marshal(data)    if err != nil {        fmt.Println("could not marshal object")        return    }    fmt.Println(string(jsonBytes))}

小结

  • 对于toJson来讲,大部分为null,func类型的会报错
  • 对于map,访问不存在的key则返回该类型的零值,另外对于零值的slice或map可以直接for range,不会报错
  • 对象指针、func、接口直接访问其属性或方法,会报panic: runtime error: invalid memory address or nil pointer dereference

doc

  • the zero value
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值