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()
    }
  • 相关阅读:
    Python 实现扫码二维码登录
    深入理解Python生成器(Generator)
    EasyUI DataGrid 结合Java 各种技巧大综合,你值得拥有。
    C#中读取XML错误解决: System.Xml.XmlException: “Element”是无效的 XmlNodeType。
    CSS3学习系列
    关于java中文乱码问题,我有话要说。
    表格的相关操作
    动态生成列
    开发随笔
    在ASP页面进行参数化 使用access数据库
  • 原文地址:https://www.cnblogs.com/pyyu/p/8158964.html
Copyright © 2011-2022 走看看