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]\n", len(s), cap(s))
    s[1] = 100
    //%p 指针
    fmt.Printf("s=%p a[1]=%p\n", s, &a[1])
    fmt.Println("before a:", a)
    s = append(s, 10)
    s = append(s, 10)
    fmt.Printf("after len[%d] cap[%d]\n", 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\n", 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()
}

 

posted @ 2017-12-31 20:49  py鱼  阅读(453)  评论(0编辑  收藏  举报
点我回主页