zoukankan      html  css  js  c++  java
  • 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]

     

  • 相关阅读:
    今日头条Go建千亿级微服务的实践
    Apache JServ Protocol
    tomcat servlet JSP common gateway interface 公共网关接口
    pollable event-driven Flume source
    kernel.panic
    Linux查找含有某字符串的所有文件
    深入理解Linux修改hostname
    px em rem
    这跟他们的前辈在原生应用程序或印刷出版物中做的设计或多或少有点类似。
    字符串等长切分 视频字幕换行
  • 原文地址:https://www.cnblogs.com/yejg1212/p/2983651.html
Copyright © 2011-2022 走看看