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 切片小记的更多相关文章

  1. golang切片和数组的区别

    好久的没有写博客了,这段时间没事研究了下go这门语言. 我们先介绍下go中的数组和切片的区别和用法 说了这么多 我们先来看段代码吧 var arr1 [3]int var arr2 [3]int = ...

  2. golang切片slice

    切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, ...

  3. golang切片数据结构解释

    1. 切片:切片是数组的一个引用,因此切片是引用类型 func main() { var arr = [6]int{1, 2, 3, 4, 5} var slice = arr[1:] fmt.Pri ...

  4. Golang切片的三种简单使用方式及区别

    概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...

  5. golang切片类型

    切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 ...

  6. golang 切片和数组在for...range中的区别

    切片是引用类型,而数组是值类型,并且for...range有以下规则: range表达式只会在for语句开始执行时被求值一次,无论后边会有多少次迭代 range表达式的求值结果会被复制,也就是说,被迭 ...

  7. golang 切片和map查询比较

    package main import ( "fmt" "time" ) var testTimeSlice = []string{"aa" ...

  8. golang 切片扩容, 时间复杂度

    在切片扩容时,如果原来的底层数组足够大,能放的下 append 的数据,就不会新建底层数组.而如果不够的话,则会分配一个新的数组.也因此是 O(n) 的时间复杂度

  9. golang切片

    切片与数组 go的数组是这样的 array := [3]int{1,2,3} array := [...]int{1,2,3} go的切片 array := []int{1,2,3} //1 arra ...

随机推荐

  1. Linux 下LNMP环境搭建_【all】

    LNMP = Linux + Nginx + Mysql + PHP 1.0 Linux环境搭建 Linux 系统安装[Redhat] 1.1. FastCGI介绍 1.什么是CGI(common g ...

  2. 内置的HTTP服务器【Modern PHP】

    目录 启动服务器 配置服务器 路由器脚本 判断是否为内置的服务器 PHP5.4.0起,PHP内置了Web服务器.对本地开发是个极好的工具,便捷,无需安装WAMP.XAMP或大新那个web服务器,就能在 ...

  3. HDU 1542 矩形面积并

    推荐阅读这篇文章 这里仅根据上述文章进行一些补充.主要是注意这里线段树点的意义变成了“边”.比如+-----+-----+,看作3个点abc和两条边e1和e2,那么线段树中点a代表e1,点b代表e2. ...

  4. Foj 2299 Prefix(AC自动机、DP)

    Foj 2299 Prefix 题意 给定串s.正整数n,问有多少长度为n的字符串t满足:s[0...i]是t的子串,s[0...i+1]不是. 题解 求有多少长度为n的字符串t满足:s[0...i] ...

  5. 本机未装Oracle数据库时Navicat for Oracle 报错:Cannot create oci environment 原因分析及解决方案

    因为要更新数据库加个表,远程桌面又无法连接...所以就远程到另外一台电脑,然后用navicat通过内网修改目标数据库. 一直用着navicat操作数据库,所以很速度的弄好然后新建连接进入数据库. 然而 ...

  6. echarts仪表盘配置参数

    require.config({ paths:{ echarts:"js/chart" } }); require([ 'echarts', 'echarts/chart/gaug ...

  7. R基础-适合于纯小白

    #说明 文中‘test’均为模拟名称,原始编码为GKB方式###1.R语言介绍#### 偏统计 ###2.Rstudio和R的基本操作#### #2.1查看R语言自带的数据集#### data() # ...

  8. [USACO09MAR]Look Up

    嘟嘟嘟 题面说的有点问题,应该是向后看齐. 于是我们维护一个单调递减栈,如果当前a[i]比栈顶元素大,就执行pop操作,然后把pop出来的元素的答案都用 i 更新即可. #include<cst ...

  9. Kali-linux创建密码字典

    所谓的密码字典主要是配合密码破解软件所使用,密码字典里包括许多人们习惯性设置的密码.这样可以提高密码破解软件的密码破解成功率和命中率,缩短密码破解的时间.当然,如果一个人密码设置没有规律或很复杂,未包 ...

  10. php is_callable()与method_exists()函数

    总结就是 method_exists()检查方法是否存在 is_callable()是否存在并可在当前作用域是否可调用