记一次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 协议》,转载必须注明作者和本文链接
讨论数量: 2

goland老是提醒只需要定义, 然后就会返回nil

8个月前 评论
Lien_Go (楼主) 8个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!