关于数组

AnstOu · 2018-10-11 17:12:54 · 995 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-10-11 17:12:54 的主题,其中的信息可能已经有所发展或是发生改变。

func main() {

    var sliceA []int
    b := []int{}
    fmt.Println(sliceA == nil)
    fmt.Println(b == nil)

    fmt.Println(len(sliceA), cap(sliceA))
    fmt.Println(len(b), cap(b))

    fmt.Println(sliceA)
    fmt.Println(b)

}

运行结果为

true
false
0 0
0 0
[]
[]

为什么当 b := []int{} 这样定义时,明明len cap都是0 却不等于nil

var sliceA []int len cap也是0 却等于nil呢


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

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

995 次点击  
加入收藏 微博
5 回复  |  直到 2018-10-17 10:51:08
polaris
polaris · #1 · 6年之前

b 初始化了;sliceA 却只是定义

AnstOu
AnstOu · #2 · 6年之前
polarispolaris #1 回复

b 初始化了;sliceA 却只是定义

请问本质区别是什么呢,能详细一点吗

polaris
polaris · #3 · 6年之前

我上面说的可能有一点不严谨;按照标准计算机语言的说法,b 是定义;sliceA 只是声明。

定义:声明了类型,同时进行初始化,也就是分配了内存空间 声明:只是声明了类型,并没有进行初始化,没有分配内存空间,所以是 nil

AnstOu
AnstOu · #4 · 6年之前
polarispolaris #3 回复

我上面说的可能有一点不严谨;按照标准计算机语言的说法,b 是定义;sliceA 只是声明。 定义:声明了类型,同时进行初始化,也就是分配了内存空间 声明:只是声明了类型,并没有进行初始化,没有分配内存空间,所以是 nil

懂了 谢谢!

mlzhou
mlzhou · #5 · 6年之前

var sliceA []int 要实际应用中间还有一个步骤,make([]int,0,0)才能使用,而b := []int{}则不用。就能知道var sliceA []int实际没分配内存了

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