Go语言学习(六)---Slice

slice(切片)类型,是Go语言中的一种引用类型,如果你将一个切片赋值给另外一个切片,这两个切片将引用同一个底层数组。这与传递一个指向底层数组的指针相类似。

确切地说,slice就是一个指向array的指针。

 

slice的创建:

复制代码
    //通过make直接创建
    s1 := make([]int, 10)
    fmt.Println(s1) //[0 0 0 0 0 0 0 0 0 0]

    
    // 这不是创建数组哦~~创建数组是[n]<type>或者[...]<type>
    s2 := []int{1, 2, 3, 4, 5}
    fmt.Println(s2) //[1 2 3 4 5]

   
复制代码

通过上述2中方式都可以直接创建slice。(引用类型一般都通过make来创建)

 

不过,如果给定一个array 或者其他slice,一个新slice 通过a[I:J] 的方式创建。

这会创建一个新的slice,指向a,从序号I 开始,结束在序号J之前。长度为J - I。即[I,J)

例如:

复制代码

a := [...]int{1, 2, 3, 4, 5}
fmt.Println(a) //[1 2 3 4 5]

s1 := a[2:4] //[3 4]
fmt.Println(s1)

//s1[0] = 99 //3--->99
//fmt.Println(s1)
//fmt.Println(a)

s2 := a[1:5] //[2 3 4 5]
fmt.Println(s2)

//这是a[0:len(a)]的简化写法
s3 := a[:] //[1 2 3 4 5]
fmt.Println(s3)

//这是a[0:4]的简化写法
s4 := a[:4] //[1 2 3 4]
fmt.Println(s4)

s5 := s2[:] //[2 3 4 5]
fmt.Println(s5)

复制代码

上面的代码中,创建的s1~s5都指向数组a,所以,通过s1~s5更改任意一个值,都会反映到数组a中。

也就是说,s1[0] = 99之后,s1~s5已经数组a里面的3都变成了99。

 

slice的扩展:

append:函数append 向slice s 追加零值或其他x 值,并且返回追加后的新的、与s 有相同类型的slice。

复制代码
package main

import "fmt"

func main() {
    s0 := make([]int, 10)

    for i := 0; i < 10; i++ {
        s0[i] = i
    }
    fmt.Println(s0)

    s1 := append(s0, 2) //追加一个元素
    fmt.Println(s1)

    s2 := append(s1, 3, 5, 7)  //追加多个元素
    fmt.Println(s2)

    s3 := append(s2, s0...) //追加一个slice,注意这三个点!!
    fmt.Println(s3)
}
复制代码

Copy:函数copy 从源slice src 复制元素到目标dst,并且返回复制的元素的个数。

复制代码
    var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
    var s = make([]int, 6)
    n1 := copy(s, a[0:]) //将a(从0开始)拷贝到s中,s长度只有6,所以拷贝[0 1 2 3 4 5]
    fmt.Println(n1)      //6
    fmt.Println(s)       //[0 1 2 3 4 5]
    
    n2 := copy(s, s[2:]) //将s(从2开始)拷贝到s中,只拷贝了[2 3 4 5]四个数,覆盖了s的前四个数
    fmt.Println(n2)      //4
    fmt.Println(s)       //[2 3 4 5 4 5]
复制代码

 

 

 

 

posted @   yejg1212  阅读(376)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示