007.golang 切片slice

切片Slice

  • 其本身并不是数组,它指向底层的数组
  • 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型
  • 可以直接创建或从底层数组获取生成
  • 使用len()获取元素个数,cap()获取容量
  • 一般使用make()创建
  • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
  • make([]T, len, cap)
    • 其中cap可以省略,则和len的值相同
    • len表示存数的元素个数,cap表示容量

package main

import (
    "fmt"
)

func main() {
    //空的slice
    var s1 []int
    fmt.Println(s1)
    //创建一个数组
    a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    fmt.Println(a)
    //获取索引从5到9的元素
    s2 := a[5:10] //包含开始索引,不包含结束索引
    fmt.Println(s2)
    //获取第七个以后所有的元素
    s3 := a[7:]
    fmt.Println(s3)
    //获取刚开始的前三个元素
    s4 := a[:3]
    fmt.Println(s4)
    //获取数组的所有元素 等价于 =
    s5 := a[:]
    s6 := a
    fmt.Println(s5)
    fmt.Println(s6)
}


package main

import (
    "fmt"
)

func main() {
    //表示此切片初始容量为3,
    //可以容纳为10
    //如果超过10就会自动扩容+10
    s1 := make([]int, 3, 10)
    fmt.Println(s1)
    fmt.Println(len(s1), cap(s1))

    a := []byte{'a', 'b', 'c', 'd', 'd', '.', 'w', 'r', 'v', '4', '3', '2'}
    s2 := a[2:4]
    fmt.Println(string(s2))
}

Reslice

  • Reslice时索引以被slice的切片为准
  • 索引不可以超过被slice的切片的容量cap()值
  • 索引越界不会导致底层数组的重新分配而是引发错误
package main

import (
    "fmt"
)

func main() {

    a := []byte{'a', 'b', 'c', 'd', 'd', '.', 'w', 'r', 'v', '4', '3', '2'}
    s2 := a[2:4]
    s3 := s2[1:2]
    s4 := s2[1:8]
    fmt.Println(string(s2))
    fmt.Println(string(s3))
    fmt.Println(string(s4))
}

Append

  • 可以在slice尾部追加元素
  • 可以将一个slice追加在另一个slice尾部
  • 如果最终长度未超过追加到slice的容量则返回原始slice
  • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
package main

import (
    "fmt"
)

func main() {

    s1 := make([]int, 3, 6)
    fmt.Printf("%p\n", s1)
    s1 = append(s1, 1, 2, 3)
    fmt.Printf("%v %p\n", s1, s1)
    s1 = append(s1, 1, 2, 3)
    fmt.Printf("%v %p\n", s1, s1)
}

package main

import (
    "fmt"
)

func main() {

    a := []int{1, 2, 3, 4, 5}
    fmt.Println(a)
    //指向底层的数组
    s1 := a[2:5]
    s2 := a[1:3]
    s3 := a[1:3]

    fmt.Println(s1, s2)
    //如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
    s3 = append(s3, 1, 1, 1, 1, 1, 1, 1, 1)
    //更改元素后,底层数组相应的也会更改
    s1[0] = 9
    fmt.Println(s1, s2)
    fmt.Println(s3)
    fmt.Println(a)
}

Copy

package main

import (
    "fmt"
)

func main() {

    s1 := []int{1, 2, 3, 4, 5, 6}
    s2 := []int{7, 8, 9}
    s3 := []int{7, 8, 9}

    copy(s2, s1)
    copy(s1, s3)
    fmt.Println(s2)
    fmt.Println(s1)

}

package main

import (
    "fmt"
)

func main() {

    s1 := []int{1, 2, 3, 4, 5, 6}
    s2 := []int{7, 8, 9, 10, 11}

    copy(s2[2:4], s1[4:6])
    fmt.Println(s2)
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

javascript之DOM操作

http://www.cnblogs.com/kissdodog/archive/2012/12/25/2833213.html

10420
来自专栏技术墨客

React 深入说明JSX语法与Props特性

我们可以将JSX理解为React.createElement(component, props, ...children)方法的语法糖。JSX的代码:

11530
来自专栏Golang语言社区

Golang语言社区--标准库分析之strconv包

大家好,我是Golang语言社区主编彬哥,这篇是给大家转载的关于Go语言的strconv 包相关的知识。

93070
来自专栏Python研发

jQuery的基本操作

7720
来自专栏Golang语言社区

go语言数组的拷贝

go语言的数组与c语言的数据有一点不太一样的地方,go语言的赋值是值拷贝 package main import "fmt" func main...

42690
来自专栏Pythonista

Golang之fmt格式“占位符”

16630
来自专栏柠檬先生

jquery 操作DOM元素(1)

.clone()   创建一个匹配的元素集合的深度拷贝。   .clone([withDataAndEvents])     ...

22650
来自专栏河湾欢儿的专栏

css3选择器

属性选择器 E[attr]只使用属性名,但没有确定任何属性值 E[type="text"]指定属性名,并指定了该属性的属性值 E[attr~="value...

11920
来自专栏阮一峰的网络日志

CSS 的空格处理

上面是一行 HTML 代码,文字的前部、内部和后部各有两个空格。为了便于识别,这里使用半圆形符号◡表示空格。

19220
来自专栏柠檬先生

jquery属性值选择器

$("[attribute|='value']") 选择指定属性值等于给定字符串或改字符串为前缀(该字符串后跟一个连字符“-”)的元素。 attribut...

23560

扫码关注云+社区

领取腾讯云代金券