Go-Slice

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

golang 切片(Slice)

切片为引用类型,切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装,支持自动扩容。

切片的本质就是对底层数组的封装,由三个重要部分构成:

  • 底层数组的指针
  • 切片的长度(len)
  • 和切片的容量(cap)

创建切片

func main() {
    // 声明切片类型
    var a []string              //声明一个字符串切片
    var b = []int{}             //声明一个整型切片并初始化
    var c = []bool{false, true} //声明一个布尔切片并初始化
    var d = []bool{false, true} //声明一个布尔切片并初始化
    fmt.Println(a)              //[]
    fmt.Println(b)              //[]
    fmt.Println(c)              //[false true]
    fmt.Println(a == nil)       //true
    fmt.Println(b == nil)       //false
    fmt.Println(c == nil)       //false
    // fmt.Println(c == d)   //切片是引用类型,不支持直接比较,只能和nil比较
}

切片的长度&容量

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    s := a[1:3]
    fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s)) 
    // Out: s:[2 3] len(s):2 cap(s):4
}

通过make动态创建切片

func main() {
    // 创建一个内部为int类型,长度为2,容量为10的切片
    a := make([]int, 2, 10)
    fmt.Println(a)      //[0 0]
    fmt.Println(len(a)) //2
    fmt.Println(cap(a)) //10
}

切片的比较

切片之间是不能进行直接比较的,要判断一个切片是否是空的,要是用len(s) == 0来判断,不应该使用s == nil来判断。一个nil值的切片,并没有底层数组,长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil

var s1 []int         //len(s1)=0;cap(s1)=0;s1==nil
s2 := []int{}        //len(s2)=0;cap(s2)=0;s2!=nil
s3 := make([]int, 0) //len(s3)=0;cap(s3)=0;s3!=nil

追加元素

ps: append之后要赋值到原切片才添加成功

func main(){
    var s []int
    s = append(s, 1)        // [1]
    s = append(s, 2, 3, 4)  // [1 2 3 4]
    s2 := []int{5, 6, 7}  
    s = append(s, s2...)    // [1 2 3 4 5 6 7]
}

删除元素

func main() {
    // 从切片中删除索引为2的元素
    a := []int{30, 31, 32, 33, 34, 35, 36, 37}
    // 也就是把索引为2以后的所有元素追加到索引为2以前的切片里面
    a = append(a[:2], a[3:]...)
    fmt.Println(a) //[30 31 33 34 35 36 37]
}

copy复制切片

相当于对切片进行深拷贝

func main() {
    // copy()复制切片
    a := []int{1, 2, 3, 4, 5}
    c := make([]int, 5, 5)
    copy(c, a)     //使用copy()函数将切片a中的元素复制到切片c
    fmt.Println(a) //[1 2 3 4 5]
    fmt.Println(c) //[1 2 3 4 5]

    c[0] = 1000
    fmt.Println(a) //[1 2 3 4 5]
    fmt.Println(c) //[1000 2 3 4 5]
}

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

本文来自:简书

感谢作者:SodaCrush

查看原文:Go-Slice

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

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