go 数组和切片slice那些事儿

目录

  • 数组
    • 数组概念
    • 数组的初始化
  • 切片
    • slice概念
    • slice创建
    • slice追加
    • slice拼接问题
    • slice作为函数参数
    • slice的扩容
  • 数组和切片slice异同
  • 闲聊
  • 【迈莫coding】

数组

数组概念

Go语言数组中每个元素都是按照索引来访问的,索引从0到数组长度减一。Go语言中len()函数可以返回数组中的元素个数。

数组的初始化

  • 关键字 var 创建数组
package main

import "fmt"

func main() { 
  var a [3]int // 三个整数型数组 
  fmt.Println(a) 
  
  var b = [...]int{6, 7, 8} // 不声明长度
  fmt.Println(b) 
}

结果

[0 0 0]
[6 7 8]
  • 自动初始化
package main

import "fmt"

func main() {
  a := [4]int{2, 0, 2, 1}
  fmt.Println(a) // [2 0 2 1]
  
  b := [...]int{2, 0, 2, 1} // 不声明长度
  fmt.Println(b) // [2 0 2 1]
  
  c := [...]int{3:-1} // 指定索引位置值
  fmt.Println(c)
}

结果

[2 0 2 1]
[2 0 2 1]
[0 0 0 -1]

切片slice

slice概念

slice是一个结构体,它本身并非动态数组或数组指针。它内部通过指针引用底层数组,设定相关属性将数据读写操作限定在指定区域内。它包含三个成员:len,cap,array,分别表示切片的长度,切片的容量,切片的底层数组的地址。

slice创建

这里说一个比较难懂的切片创建及其原理

package main
import "fmt"

func main() {
  x := [...]int{10, 30, 20, 50, 80, 90, 100}
  fmt.Println(x[2:4:6])
}

属性示意图:

在这里插入图片描述

由图可知,x[2:4:6]表示的切片含义:slice的长度为2,容量为4的切片。

计算公式:

  • len: high - low,对应示例为(4 - 2 = 2)
  • cap: max - low,对应示例为(6 - 2 = 4)

slice追加

package  main

import "fmt"

func main() {
  s := make([]int, 5)
  s = append(s, 1, 2, 3)
  fmt.Println(s)
}

结果

[0 0 0 0 0 1 2 3] // make初始化默认为0

slice拼接问题

package main

import "fmt"

func main() {
  a := []int{1, 2, 3}
  b := []int{4, 5, 6}
  a = append(a, b...)
  fmt.Println(a)
}

注意
两个slice进行拼接时,记住要将第二个参数后面加上 ... ,否则会编译失败。

结果

[1 2 3 4 5 6]

slice作为函数参数

在go语言中,函数参数传递只有值传递,没有引用传递。

所以当slice作为函数参数传递时,他也是传递的是原切片的副本。如果直接传slice的话,实参不会被调用函数中的操作而改变;若传递的是slice指针的话,实参是会被影响的。

值得注意的是,不管是指针传递还是值传递,如果改变来slice底层数组中的值,
那么会影响到实参slice中的底层数据。

来一起看个例子:

package main 

import "fmt"

func copys(a []int) {
  // v只是一个副本,不能改变s中元素的值
  /* for _, v := range a {
    v++
  }
  */
  
  for i, _ := range a{
    a[i] += 1
  }

}

func main() {
  s := []int{1, 2, 3}
  copys(s)
  fmt.Println(s)
}

结果

[2 3 4]

slice的扩容

当调用append函数向切片尾部(slice[len])添加数据时,如超出cap限制,则会为新切片对象重新分配数组。

package main

import "fmt"

func main() {
  s := make([]int, 0, 100)
  s1 := s[:2:4]
  s2 := append(s1, 1, 2, 3, 4, 5, 6)
  
  fmt.Printf("s1: %p: %v\n", &s1[0], s1)
  fmt.Printf("s2: %p: %v\n", &s2[0], s2)
  
  fmt.Printf("s data: %v\n", s[:10])
  fmt.Printf("s1 cap: %d, s2 cap: %d\n", cap(s1), cap(s2))
  
}

结果

s1: 0xc000102000: [0 0]
s2: 0xc00001a040: [0 0 1 2 3 4 5 6] // 数组地址不同,确认新分配
s data: [0 0 0 0 0 0 0 0 0 0]       // append 并未向愿数组写入部分数组
s1 cap: 4, s2 cap: 8                // 新数组是新cap 的2倍

注意

  • 是超过切片cap限制,而非底层数组长度限制,因为cap可小于数组长度。
  • 当原slice容量小于1024时,新slice容量是原slice容量的2倍;原slice容量大于1024时,新slice容量大于等于原容量的2倍或1.25倍。

数组和切片slice异同

数组 切片slice
长度 初始化指定长度 长度动态 不固定
创建方式 make创建

闲聊

  • 读完文章,自己是不是和数组/slice的cp率又提高了
  • 我是迈莫,欢迎大家和我交流

文章也会持续更新,可以微信搜索「 迈莫coding 」第一时间阅读。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容