zoukankan      html  css  js  c++  java
  • golang之切片

    1.切片:切片是数组的一个引用,因此切片是引用类型

    2.切片的长度可以改变,因此,切片是个可变的数组。

    3.切片遍历方式和数组一样,可以用len()求长度

    4.cap可以求出slice最大的容量,0<=cap(slice)  <=len(array),其中array是slice引用的数组

    5.切片的定义:var 变量名 [ ]类型,例如:var str []string ,var arr [] int

    package main
    
    import "fmt"
    
    //slice,map,channel都是用make初始化
    func testSlice() {
        var slice []int
        //用数组初始化切片
        var arr [5]int = [...]int{1, 2, 3, 4, 5}
        //arr[start:end] 取头不取尾
        //arr[:] 复制一份数组
        //去掉切片最后一个元素可以写,slice[:len(slice)-1]
        //去掉第一个元素就是slice[1:]
        slice = arr[:]
        fmt.Println(slice)
        fmt.Println(len(slice))
        fmt.Println(cap(slice))
        fmt.Println()
        slice = slice[0:1]
        fmt.Println(len(slice))
        fmt.Println(cap(slice))
    
    }
    func main() {
        testSlice()
    }

    6.切片的内存布局。

    7.通过make创建切片

        var slice []type=make([]type,len)
        slice := make([]type,len)
        slice :=make([]type,len,cap)

    8.用append内置函数操作切片

    append是双倍cap扩容

    string底层就是一个byte的数组,也可以进行切片操作

    string底层布局

    package main
    
    import "fmt"
    
    func testSlice() {
        var a [5]int = [...]int{1, 2, 3, 4, 5}
        s := a[1:] //切片s是[2,3,4,5]
        fmt.Printf("before len[%d],cap[%d]
    ", len(s), cap(s))
        s[1] = 100
        //%p 指针
        fmt.Printf("s=%p a[1]=%p
    ", s, &a[1])
        fmt.Println("before a:", a)
        s = append(s, 10)
        s = append(s, 10)
        fmt.Printf("after len[%d] cap[%d]
    ", len(s), cap(s))
        s = append(s, 10)
        s = append(s, 10)
        s = append(s, 10)
        s[1] = 1000
        fmt.Println("after a:", a)
        fmt.Println(s)
        fmt.Printf("s=%p a[1]=%p
    ", s, &a[1])
        //append的...用法
        //append会扩容切片容量,默认cap的2倍
        fmt.Println("-----分隔符-----(append的...用法)")
        var a1=[]int{1,2,3}
        var b=[]int{4,5,6}
        a1=append(a1,b...)
        fmt.Println(a1)
        //切片拷贝,copy不会扩容
        fmt.Println("-----分隔符-----(切片拷贝)")
        s1:=[]int{1,2,3,4,5}
        s2:=make([]int,10)
        copy(s2,s1)//结果[1 2 3 4 5 0 0 0 0 0],以s1开头
        fmt.Println(s2)
        //string切片,string本身是不可改的
        fmt.Println("-----分隔符-----(string切片)")
        str:="hello world"
        res1:=str[0:5]
        fmt.Println(res1)
        res2:=str[6:]
        fmt.Println(res2)
    }
    
    //修改string的方法
    //改中文字符一定要用rune,不能用byte
    func testModifyString(){
        fmt.Println("----分隔符----")
        s:="我hello world"
        s1:=[]rune(s)
    
        s1[0]=''
        s1[1]=''
        s1[2]=''
    
        str:=string(s1)
        fmt.Println(str)
    }
    func main() {
        testSlice()
        testModifyString()
    }
  • 相关阅读:
    深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
    深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
    Elasticsearch 评分score计算中的Boost 和 queryNorm
    Docker 镜像构建的时候,应该小心的坑
    怎么给kibana加上权限?
    网站异常了,日志要怎么看?
    使用 Gradle 配置java项目
    Cassandra 类型转换限制
    Elasticsearch 排序插件的开发
    ElasticSearch 2.0以后的改动导致旧的资料和书籍需要订正的部分
  • 原文地址:https://www.cnblogs.com/pyyu/p/8158964.html
Copyright © 2011-2022 走看看