前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang-101-hacks(8)——“nil slice” vs “nil map”

golang-101-hacks(8)——“nil slice” vs “nil map”

作者头像
羊羽shine
发布2019-05-29 08:53:00
6310
发布2019-05-29 08:53:00
举报
文章被收录于专栏:Golang开发Golang开发

在GO语言中Slice和map都是引用类型,默认值都是nil

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var (
        s []int
        m map[int]bool
    )
    if s == nil {
        fmt.Println("The value of s is nil")
    }
    if m == nil {
        fmt.Println("The value of m is nil")
    }
}  

执行结果是:

代码语言:javascript
复制
The value of s is nil
The value of m is nil

当一个切片的值为“nil”时,是可以对它进行添加数据等操作。

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var s []int
    fmt.Println("Is s a nil? ", s == nil)
    s = append(s, 1)
    fmt.Println("Is s a nil? ", s == nil)
    fmt.Println(s)
}

执行结果是: The result is like this:

代码语言:javascript
复制
Is s a nil?  true
Is s a nil?  false
[1]

需要注意的是当slice是nil和没有值两种状况的slice长度都是0 A caveat you should notice is the length of both nil and empty slice is 0:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var s1 []int
    s2 := []int{}
    fmt.Println("Is s1 a nil? ", s1 == nil)
    fmt.Println("Length of s1 is: ", len(s1))
    fmt.Println("Is s2 a nil? ", s2 == nil)
    fmt.Println("Length of s2 is: ", len(s2))
}

运行结果如下 The result is like this:

代码语言:javascript
复制
Is s1 a nil?  true
Length of s1 is:  0
Is s2 a nil?  false
Length of s2 is:  0

将slice的值与' nil '进行比较,以检查它是否是' nil '。 对一个“nil”的map取值是没有问题的,但是存储“nil”的map会引起程序panic:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    var m map[int]bool
    fmt.Println("Is m a nil? ", m == nil)
    fmt.Println("m[1] is ", m[1])
    m[1] = true
}

运行结果如下

代码语言:javascript
复制
Is m a nil?  true
m[1] is  false
panic: assignment to entry in nil map

goroutine 1 [running]:
panic(0x4cc0e0, 0xc082034210)
    C:/Go/src/runtime/panic.go:481 +0x3f4
main.main()
    C:/Work/gocode/src/Hello.go:9 +0x2ee
exit status 2

Process finished with exit code 1

因此对map进行数据操作是 需要提前进行初始化,如下所示

代码语言:javascript
复制
m := make(map[int]bool)

顺便补充一点,建议使用下面的代码方式来判断map中是否存在某个键值:

代码语言:javascript
复制
if v, ok := m[1]; !ok {
    .....
}

参考 The Go Programming Language.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档