golang-nil-slice-empty-slice-笔记

58次阅读

共计 1417 个字符,预计需要花费 4 分钟才能阅读完成。

示例代码

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

  • Arrays, slices (and strings): The mechanics of ‘append’ – The Go Blog
  • go – The zero value of a slice is not nil – Stack Overflow
  • A Tour of Go
  • https://time.geekbang.org/col…

正文完
 0