Go-Slice


本文摘自网络,作者,侵删。

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语言开篇

Go 语言中的一些非常规优化

Go语言基础语法

Go设计模式之工厂模式浅谈2

Go - httpclient 常用操作

Go - 使用 defer 函数 要注意的几个点

一周 Go world 新鲜事

Golang "github.com/pkg/errors" 包使用的正确姿势

Go interface 入门

手撸Golang 创建型设计模式 简单工厂

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...