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 []int = [...]int{, , , , }
//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[:]
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 []int = [...]int{, , , , }
s := a[:] //切片s是[2,3,4,5]
fmt.Printf("before len[%d],cap[%d]\n", len(s), cap(s))
s[] =
//%p 指针
fmt.Printf("s=%p a[1]=%p\n", s, &a[])
fmt.Println("before a:", a)
s = append(s, )
s = append(s, )
fmt.Printf("after len[%d] cap[%d]\n", len(s), cap(s))
s = append(s, )
s = append(s, )
s = append(s, )
s[] =
fmt.Println("after a:", a)
fmt.Println(s)
fmt.Printf("s=%p a[1]=%p\n", s, &a[])
//append的...用法
//append会扩容切片容量,默认cap的2倍
fmt.Println("-----分隔符-----(append的...用法)")
var a1=[]int{,,}
var b=[]int{,,}
a1=append(a1,b...)
fmt.Println(a1)
//切片拷贝,copy不会扩容
fmt.Println("-----分隔符-----(切片拷贝)")
s1:=[]int{,,,,}
s2:=make([]int,)
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[:]
fmt.Println(res1)
res2:=str[:]
fmt.Println(res2)
} //修改string的方法
//改中文字符一定要用rune,不能用byte
func testModifyString(){
fmt.Println("----分隔符----")
s:="我hello world"
s1:=[]rune(s) s1[]='你'
s1[]='我'
s1[]='他' str:=string(s1)
fmt.Println(str)
}
func main() {
testSlice()
testModifyString()
}

golang之切片的更多相关文章

  1. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...

  2. golang slice切片的原理以及内置函数cap, len

    golang中slice(切片)是常用的类型, slice是对数组进行封装 package main import ( "fmt" "strconv") fun ...

  3. golang slice 切片原理

    golang 中的 slice 非常强大,让数组操作非常方便高效.在开发中不定长度表示的数组全部都是 slice .但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果 ...

  4. 转 Golang 入门 : 切片(slice)

    https://www.jianshu.com/p/354fce23b4f0 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概 ...

  5. 菜鸟系列Golang学习 — 切片

    切片简介 切片也是一种数据类型,在Golang中,切片底层基于数组实现的. 我们定义切片如下 var slice []int 切片之所以出现,是为了更好的利用资源,管理数据,如果使用数组,则我们一开始 ...

  6. golang之切片与排序

    1.排序与查找操作 排序操作在sort包中,sort.Ints对整数进行排序,sort.Strings对字符串进行排序,sort.Float64对浮点数进行排序 package main import ...

  7. Golang 数组 切片 字典 基本知识点

    数组 数组的声明 var arrayName [arraySize]dataType eg: var array1 [5]int 在声明数组时,必须指定数组名,数组长度和数组元素的类型. 数组的初始化 ...

  8. GoLang数组切片

    1. 数组1.1 如何定义数组同java数组一样,数组是一组内存连续且类型相同的数据组成 //不初始化初始值默认为0 var arr1 = [5]int{} var arr2 = [5]int{1,2 ...

  9. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

随机推荐

  1. CNN中卷积层的计算细节

    原文链接: https://zhuanlan.zhihu.com/p/29119239 卷积层尺寸的计算原理 输入矩阵格式:四个维度,依次为:样本数.图像高度.图像宽度.图像通道数 输出矩阵格式:与输 ...

  2. name_save matlab

    file=dir('/home/wang/Desktop/trainset/num0/');for i=3:length(file)     path= strcat('/home/wang/Desk ...

  3. PyQt4 HardwareManager

    # PyQt4 HardwareManager # 声明: # 本软件主要是由于朋友说想要一个产品缺陷记录软件,主要用于记录产品缺陷, # 通过产品序列号进行插入.查询,本来想用VC++ 6.0做,但 ...

  4. HDU2870 最大窗口面积(单调队列优化)

    HDU1506 HDU2870 HDU4328 以前做的是单调队列的方法,现在试一试DP 注意的是对于i,向左延伸的L[i]到i不一定是单调的,比如1 3 2 1 2,对于i=4,L[i]=1而是2所 ...

  5. POI2011题解

    POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...

  6. flow 类型生成工具 flow-typed 简单使用

    flow 是一个javascript 的静态检查工具,flow-typed 为我们提供了三方类似type 的生成 安装flow-typed 使用全局安装 yarn global add flow-ty ...

  7. 写时复制和fork,vfork,clone

    写时复制 原理: 用了“引用计数”,会有一个变量用于保存引用的数量.当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时, ...

  8. pthread访问调用信号线程的掩码(pthread_sigmask )

    掩码: 信号掩码 在POSIX下,每个进程有一个信号掩码(signal mask).简单地说,信号掩码是一个"位图",其中每一位都对应着一种信号.如果位图中的某一位为1,就表示在执 ...

  9. 【转】Linux shell的&&和||

    原文网址:http://www.2cto.com/os/201302/189655.html Linux shell的&&和||   shell 在执行某个命令的时候,会返回一个返回值 ...

  10. socket测试远程地址能否连接并为连接设置超时(转)

    public   class TestConnect { string hostIp = ""; int port = 3314; public string recMsg = & ...