关于if data != nil && len(data) != n { }的思考

jan-bar · 2019-08-24 21:24:56 · 449594 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-08-24 21:24:56 的主题,其中的信息可能已经有所发展或是发生改变。

1.我经常看到在项目里面使用了下面这些代码

if data != nil && len(data) != 0 {  
    do  xxx
}

我就在思考,为啥要多写一个判断data != nil
因此我测试了下面的代码,发现完全可以去掉第一个判断
因为len(nil)==0,因此第一个判断去掉没有任何问题的

package main

import "fmt"

func main() {
    var data1 []interface{} = nil
    data2 := []interface{}{}
    data3 := make([]interface{}, 0, 8)
    fmt.Println(len(data1), len(data2), len(data3))
}

result:0 0 0

2.由此还能想到很多其他场景,下面两个也没必要判断data==nil的

if len(data) == n {
}
if len(data) != n {
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

449594 次点击  
加入收藏 微博
9 回复  |  直到 2024-11-14 09:31:47
focussoft
focussoft · #1 · 6年之前

是的,如果确定是一个slice, 的确不需要判断是否nil, 这属于画蛇添足了, 因为slice天生就不可能为nil

jan-bar
jan-bar · #2 · 6年之前
focussoftfocussoft #1 回复

是的,如果确定是一个slice, 的确不需要判断是否nil, 这属于画蛇添足了, 因为slice天生就不可能为nil

slice是可能为nil的,只是len求nil的slice也是等于0所以才不需要判断nil额。

dzj251452765
dzj251452765 · #3 · 6年之前

666

13934221960
13934221960 · #4 · 5年之前
focussoftfocussoft #1 回复

是的,如果确定是一个slice, 的确不需要判断是否nil, 这属于画蛇添足了, 因为slice天生就不可能为nil

var is []int is为nil,虽然这种声明没啥意义

focusonline
focusonline · #5 · 5年之前
1393422196013934221960 #4 回复

#1楼 @focussoft var is []int is为nil,虽然这种声明没啥意义

这种生命是有意义的, 声明的意义在于制定了变量的类型. 虽然没有初始化也可以使用了.

amocea
amocea · #6 · 大约1年之前

有两种需要区分的切片声明方式,一种是 var s []int,这种叫做 nil 切片,底层数组是 nil,即没有依赖任何的底层数组。 一种是 s := make([]int),这种叫做空切片,底层数组不是 nil,而是长度为零的数组,即有依赖,但是为空的。这两种在 len() 计算的时候都会输出 0

rubycrack
rubycrack · #7 · 10月之前

是的,#6说的很好,空切片是这么声明的,s := make([]int, 5)

YuPeng
YuPeng · #8 · 5月之前

是没有意思

mengmeng
mengmeng · #9 · 5月之前

遇到不判断,有概率报错 XJD

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传