go切片操作

slice 是 go的里数组 一个view 。类似于指针显示一个数组的部分内容或者全部内容。

如图:
go切片操作

比如 slice1 指向arr1 数组,slice1修改2元素。对应的 arr1里面数据也会改变的。 slice有 ptr cap len len属性。 len代表slice长度也就是元素个数 ,cap是数组的边界

ptr指向slice开头的那个元素

len slice的长度是多少,用于判断slice长度,比如越界会根据len来判断的。

cap 是代表arr1的slice开头位置ptr到cap的整个长度。 只要不超过cap就有就能一直向后扩展,slice不能向前扩展。cap还有一个作用,比如append增加元素。如果长度超过cap。go语言中cap不会增加。而是重新开辟一个内建空间 cap 以*2的方式增加。具体看 go源码 https://github.com/golang/go/blob/master/src/runtime/slice.go#L95 扩充策略应该是综合扩充成本,内存消耗,数据分析,经验等的最终选择。

go切片操作

package main

import "fmt"

func updateSlice(s []int) {
    s[0] = 100
}

func main() {
    arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
    fmt.Println("arr[2:6] =", arr[2:6])
    fmt.Println("arr[:6] =", arr[:6])
    s1 := arr[2:]
    fmt.Println("arr[2:] s1=", s1)
    s2 := arr[:]
    fmt.Println("arr[:] s2=", s2)
    fmt.Println("After updateSlice(s1)") //slice 类型不是值传递,是类似引用传递,arr的一个视图,在视图view上修改值  arr 也会进行改变的。
    updateSlice(s1)
    fmt.Println(s1)
    fmt.Println(arr)
    fmt.Println("After updateSlice(s2)")
    updateSlice(s2)
    fmt.Println(s2)
    fmt.Println(arr)
    fmt.Println("Reslice")
    fmt.Println(s2)
    s2 = s2[:5]
    fmt.Println(s2)
    s2 = s2[2:]
    fmt.Println(s2)

    fmt.Println("Extending slice")
    arr[0], arr[2] = 0, 2
    s1 = arr[2:6]
    s2 = s1[3:5]
    fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%d\n", s1, len(s1), cap(s1))
    fmt.Println("s2=", s2)

    s3 := append(s2, 10)
    s4 := append(s3, 11)
    s5 := append(s4, 12)
    fmt.Println("s3,s4,s5=", s3, s4, s5)
    fmt.Println("arr=", arr)
}
package main

import "fmt"

func printSlice(s []int) {//打印slice
    fmt.Printf("%vlen = %d,cap=%d,\n", s, len(s), cap(s))
}

func main() {
    fmt.Println("Creating Slice") //创建slice
    var s []int                   //类型slice

    for i := 0; i < 100; i++ {
        printSlice(s)
        s = append(s, 2*i+1)
    }
    fmt.Println(s)
    s1 := []int{2, 4, 6, 8}

    printSlice(s1)
    s2 := make([]int, 16)
    printSlice(s2)
    s3 := make([]int, 10, 32)
    printSlice(s3)

    fmt.Println("Copying slice") //拷贝slice
    copy(s2, s1)
    printSlice(s2)

    fmt.Println("Deleting elements from slice") //删除slice 元素
    s2 = append(s2[:3], s2[4:]...)              //删除slice 中间元素
    printSlice(s2)
    fmt.Println("Popping from front") //去掉slice头部元素
    front := s2[0]
    s2 = s2[1:]
    println(front)
    printSlice(s2)
    fmt.Println("Popping from back") //去掉slice尾部元素
    tail := s2[len(s2)-1]
    s2 = s2[:len(s2)-1]
    fmt.Println(tail)
    printSlice(s2)

}

原创文章,作者:星辰,如若转载,请注明出处:http://www.z88j.com/307.html

(10)
打赏 微信扫一扫 微信扫一扫
上一篇 2021年6月16日 下午5:38
下一篇 2021年6月16日 下午10:07

相关推荐

发表回复

登录后才能评论

Warning: error_log(/www/wwwroot/www.z88j.com/wp-content/plugins/spider-analyser/#log/log-2305.txt): failed to open stream: No such file or directory in /www/wwwroot/www.z88j.com/wp-content/plugins/spider-analyser/spider.class.php on line 2900