前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang之切片

golang之切片

作者头像
超蛋lhy
发布2018-08-31 15:42:26
3500
发布2018-08-31 15:42:26
举报
文章被收录于专栏:PythonistaPythonista

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

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

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

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

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

代码语言:javascript
复制
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创建切片

代码语言:javascript
复制
    var slice []type=make([]type,len)
    slice := make([]type,len)
    slice :=make([]type,len,cap)

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

append是双倍cap扩容

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

string底层布局

代码语言:javascript
复制
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()
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档