记一次bug,定义的切片给前端返回了nil
踩坑经历!
和前端小姐姐约定了人员列表一定会返回数组,没有值的话会返回了空数组,但是由于程序的不严谨,导致代码返回了nil,由此记录一下加深一下了解。
一. 变量初始化过程
变量初始化一般包括 变量声明和变量内存分配。var关键字就是用来声明变量的,new和make函数主要用来分配内存的。
二. 常见的变量命名方式
1. var的使用
var 声明值类型的变量时,系统会默认为他分配内存空间,并且赋该类型的零值。比如布尔、数字、字符串、结构体。
对于指针类型或则引用类型的变量,系统不会为它分配内存,默认就是nil。不能直接使用,需要分配内存空间,才能使用。
type person struct { name string age int } var p *person func main() { fmt.Println(p.name) //会报错,空指针 }
要注意的是对于切片,如果var声明未赋值,则返回的是nil。
func main() { var list []int listStr, _ := json.Marshal(list) fmt.Println("list", string(listStr)) list1 := []int{} list1Str, _ := json.Marshal(list1) fmt.Println("list1", string(list1Str)) } 输出: list null list1 []
2. new和make 函数
new、make都是内置函数,不是关键字,主要用来分配内存空间,有了内存变量就可以使用了。
new 返回一个指向该类型内存地址的指针
func new(Type) *Type
make 只能用于 chan、slice、map的初始化,返回的这些类型本身。
func make(t Type,size …IntegerType) Type
3. :=的使用
:= 简短声明,多用于局部变量
分配空间,并且赋初值
结语
平常var声明的方式最常用,但是大家注意如果直接返回的话就是nil。大家还有什么在变量命名上的坑,说出来大家一起探讨探讨呀。
本作品采用《CC 协议》,转载必须注明作者和本文链接
goland老是提醒只需要定义, 然后就会返回nil