golang nil slice & empty slice 笔记

lidashuang · · 743 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

示例代码

package main

import (
    "fmt"
)

func main() {
    a := []string{"A", "B", "C", "D", "E"}
    a = nil
    fmt.Println(a, len(a), cap(a))
}

result: [] 0 0 说明: a 是 一个nil 的slice


package main

import (
    "fmt"
)

func main() {
    a := []string{"A", "B", "C", "D", "E"}
    a = a[:0] //空的slice
    fmt.Println(a, len(a), cap(a))
}

result [] 0 5 说明 a是长度是0的emtpy slice

nil slice vs empty slice

  • nil slice 的长度len和容量cap都是0
  • empty slice的长度是0, 容量是由指向底层数组决定
  • empty slice != nil
  • nil slice的pointer 是nil, empty slice的pointer是底层数组的地址

slice的底层表示形式

[pointer] [length] [capacity]
nil slice:   [nil][0][0]
empty slice: [addr][0][0] // pointer是底层数组的地址

创建nil slice和empty slice

package main

import (
    "fmt"
)

func main() {
    var nilSlice []string
    emptySlice0 := make([]int, 0)
    var emptySlice1 = []string{}

    fmt.Printf("\nNil:%v Len:%d Capacity:%d", nilSlice == nil, len(nilSlice), cap(nilSlice))
    fmt.Printf("\nnil:%v Len:%d Capacity:%d", emptySlice0 == nil, len(emptySlice0), cap(emptySlice0))
    fmt.Printf("\nnil:%v Len:%d Capacity:%d", emptySlice1 == nil, len(emptySlice1), cap(emptySlice1))
}

make slice 规则


package main

import "fmt"

func main() {
  s1 := make([]int, 5)
  fmt.Printf("The length of s1: %d\n", len(s1))
  fmt.Printf("The capacity of s1: %d\n", cap(s1))
  fmt.Printf("The value of s1: %d\n", s1)
  s2 := make([]int, 5, 8)
  fmt.Printf("The length of s2: %d\n", len(s2))
  fmt.Printf("The capacity of s2: %d\n", cap(s2))
  fmt.Printf("The value of s2: %d\n", s2)
}

make 初始化slice

  • 第一个参数表示长度
  • 第二个参数表示容量
  • make函数初始化切片时,如果不指明其容量,那么它就会和长度一致

links


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

本文来自:Segmentfault

感谢作者:lidashuang

查看原文:golang nil slice & empty slice 笔记

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

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