golang 切片小记
1 切片初始化
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d underlying array:%p, %v\n", len(s), cap(s), s, s)
}
func sliceInit() {
var s1 []int //声明s1,并没有初始化,此时s1是nil切片,没有分配底层数组
if s1 == nil {
fmt.Println("s1 is nil")
}
s2 := []int{}
if s2 == nil {
fmt.Println("s2 is nil")
}
s3 := make([]int, )
if s3 == nil {
fmt.Println("s3 is nil!")
}
printSlice(s1)
printSlice(s2)
printSlice(s3)
}
func main(){
sliceInit()
}
Out:
s1 is nil
len= cap= underlying array:0x0, []
len= cap= underlying array:0x55c988, []
len= cap= underlying array:0x55c988, []
2 切片长度与容量
切片的长度就是它所包含的元素个数。
切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数
func main() {
s := []int{, , , , , }
printSlice(s)
// Slice the slice to give it zero length.
s = s[:]
printSlice(s)
// Extend its length.
s = s[:]
printSlice(s)
// Drop its first two values.
s = s[:]
printSlice(s)
}
Out:
len= cap= underlying array:0xc04200a2a0, [ ]
len= cap= underlying array:0xc04200a2a0, []
len= cap= underlying array:0xc04200a2a0, [ ]
len= cap= underlying array:0xc04200a2b0, [ ]
3 赋值与传参
func sliceT() {
arrayA := []int{, , , , }
fmt.Printf("arrayA: %p, %v\n", arrayA, arrayA)
fmt.Printf("arrayA: %p, %v\n", &arrayA, arrayA)
fmt.Printf("arrayA: %p, %v\n", &arrayA[], arrayA)
fmt.Printf("arrayA: %p, %v\n", &arrayA[], arrayA)
fmt.Printf("arrayA: %p, %v\n", &arrayA[], arrayA)
fmt.Printf("arrayA: %p, %v\n", &arrayA[], arrayA)
fmt.Printf("arrayA: %p, %v\n", &arrayA[], arrayA)
slice := arrayA[::]
fmt.Printf("slice: %p, %v\n", slice, slice)
fmt.Printf("slice: %p, %v\n", &slice[], slice)
fmt.Printf("slice: %p, %v\n", &slice[], slice)
slice[] =
fmt.Printf("slice: %p, %v\n", slice, slice)
fmt.Printf("arrayA: %p, %v\n", &arrayA, arrayA)
}
Out
arrayA: %!p([]int=[ ]), [ ]
arrayA: 0xc04206c030, [ ]
arrayA: 0xc04206c030, [ ]
arrayA: 0xc04206c038, [ ]
arrayA: 0xc04206c040, [ ]
arrayA: 0xc04206c048, [ ]
arrayA: 0xc04206c050, [ ]
13 slice: 0xc04206c038, [ ]
14 slice: 0xc04206c038, [ ]
15 slice: 0xc04206c040, [ ]
slice: 0xc04206c038, [ ]
arrayA: 0xc04206c030, [ ]
2~4
一个数组变量表示整个数组,它不是指向第一个元素的指针(不像 C 语言的数组)因此数组名通过%p 无法打印地址。 当一个数组变量被赋值或者被传递的时候,实际上会复制整个数组。 (为了避免复制数组,可以传递一个指向数组的指针)
6~9
int 在64机器上占8个字节
12~15
切片语法 a[ low:high:cap ]; cap 表示切片容量
切片名通过%p 打印,输出的是切片所引用的底层数组的地址
18~19
改变切片元素值就是改变其引用的数组的对应元素值
func sliceT() {
s := []int{,,,,}
fmt.Printf("underlying array: %p, slice addr: %p\n", s, &s)
changeSlice(s)
fmt.Println(s)
}
func changeSlice(s []int) {
fmt.Printf("underlying array: %p, param slice addr: %p\n", s, &s)
s[] = -
}
Out:
underlying array: 0xc04206c030, slice addr: 0xc04204a3a0
underlying array: 0xc04206c030, param slice addr: 0xc04204a400
[ - ]
func sliceT1() {
s := []int{,,,,}
fmt.Printf("underlying array: %p, slice addr: %p\n", s, &s)
changeSlice1(s)
fmt.Println(s)
}
func changeSlice1(s []int) {
fmt.Printf("underlying array: %p, param slice addr: %p\n", s, &s)
s = append(s, )
}
Out:
underlying array: 0xc04200a2a0, slice addr: 0xc0420023e0
underlying array: 0xc04200a2a0, param slice addr: 0xc042002440
[ ]
切片作为函数参数传递时是值传递,会拷贝一个切片,但形参和实参,拥有相同的底层数组引用。
更多内容: https://blog.go-zh.org/go-slices-usage-and-internals
https://www.jianshu.com/p/030aba2bff41
golang 切片小记的更多相关文章
- golang切片和数组的区别
好久的没有写博客了,这段时间没事研究了下go这门语言. 我们先介绍下go中的数组和切片的区别和用法 说了这么多 我们先来看段代码吧 var arr1 [3]int var arr2 [3]int = ...
- golang切片slice
切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, ...
- golang切片数据结构解释
1. 切片:切片是数组的一个引用,因此切片是引用类型 func main() { var arr = [6]int{1, 2, 3, 4, 5} var slice = arr[1:] fmt.Pri ...
- Golang切片的三种简单使用方式及区别
概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...
- golang切片类型
切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 ...
- golang 切片和数组在for...range中的区别
切片是引用类型,而数组是值类型,并且for...range有以下规则: range表达式只会在for语句开始执行时被求值一次,无论后边会有多少次迭代 range表达式的求值结果会被复制,也就是说,被迭 ...
- golang 切片和map查询比较
package main import ( "fmt" "time" ) var testTimeSlice = []string{"aa" ...
- golang 切片扩容, 时间复杂度
在切片扩容时,如果原来的底层数组足够大,能放的下 append 的数据,就不会新建底层数组.而如果不够的话,则会分配一个新的数组.也因此是 O(n) 的时间复杂度
- golang切片
切片与数组 go的数组是这样的 array := [3]int{1,2,3} array := [...]int{1,2,3} go的切片 array := []int{1,2,3} //1 arra ...
随机推荐
- [tools]excel转lua的python实现
time:2015/04/13 描述:需要将excel表格内容转成lua,并且作为工具使用,能够批量转换 步骤: (1)文章[1]已经做了大部分的内容,而且也已经能够使用了 (2)根据自己新的需求: ...
- Python初学者第二十一天 函数(4)-内置函数
21day 内置函数: 1.abs()绝对值函数 2.dict()创建一个字典 3.help()获取帮助信息 4.min()从一个列表中取出最小的数 5.max()从一个列表中取出最大值 6.bool ...
- 10分钟开始.Net Core
.Net Core 2.0发布了,API也越来越多.此时不用.Net Core,更待何时? 安装.Net Core SDK 首先,我们当然要先装.Net Core SDK,在这里下载( ...
- Django路由系统---Django重点之url别名
django重点之url别名[参数名必须是name,格式是name="XXX] 不论后台路径如何进行修改路径,前台访问的路径不变,永远是alias, 这样方便开发 前台根据 {{ url & ...
- Java Web项目部署
打包 使用Eclipse打包JAVA Web项目 如下 在项目上单击右键选择Export-选择JavaEE文件夹-选择WAR file(MyEclipse),单击Next>如图所示,选择存放打包 ...
- 延期年金(deferred annuity)
含义:推迟m个时期后才开始付款的年金. 延期年金现值为 二.永续年金(Perpetuity) 永续年金:无限期支付下去的年金. 为期末付永续年金(perpetuity-immediate)的现值 表示 ...
- IDEA中配置Scala开发编译环境
安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK. 安装Scala Windows安装Scala编译器 访问Scala官网http://www.scala-lang ...
- Echarts 嵌套饼图实现,内环点击控制外环显示
Echarts有交互事件,但是如果用其进行图形变更,恐怕就只有重新修改配置了. 如图,我想要实现,内圈的数据控制外圈的图形,当点击内环的某一块时,就可以实现,更改外环的目的. 起初我想能不能直接修改o ...
- BZOJ2208:[JSOI2010]连通数(DFS)
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图 ...
- 30、springboot与检索(2)
项目中进行整合: 1.整合 新建项目加入依赖(NoSql) springboot默认使用SpringDate ElasticSearch模块进行操作 查看自动配置类: SpringBoot默认支持 ...