共计 1646 个字符,预计需要花费 5 分钟才能阅读完成。
序
本文次要钻研一下 golang 中的零值
zero value
初始化时没有赋值的变量的默认值如下:
- false for booleans
- 0 for numeric types
- “” for strings
- nil for pointers, functions, interfaces, slices, channels, and maps
拜访 nil 实例
package main
import (
"encoding/json"
"fmt"
)
// https://golang.google.cn/ref/spec#The_zero_value
type Demo struct {
Name string
Ptr *string
}
type DemoFunc func() string
type 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
// <nil>
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
正文完