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()
    }
  • 相关阅读:
    【Leetcode】23. Merge k Sorted Lists
    【Leetcode】109. Convert Sorted List to Binary Search Tree
    【Leetcode】142.Linked List Cycle II
    【Leetcode】143. Reorder List
    【Leetcode】147. Insertion Sort List
    【Leetcode】86. Partition List
    jenkins 配置安全邮件
    python 发送安全邮件
    phpstorm 同步远程服务器代码
    phpUnit 断言
  • 原文地址:https://www.cnblogs.com/pyyu/p/8158964.html
Copyright © 2011-2022 走看看