go 高级使用

1.切片 VS 数组

列表 数组 切片
类型 值类型 引用类型
长度 初始化后长度是固定的 长度可以变化
初始化方法① [5] int {1,2} s :=make([]int,len,cap) //内置函数make()初始化 .初始化时len=cap,在追加元素时如果容量cap不足时将按len的2倍扩容
初始化方法② [...] int {1,2,3,4,5};//有....自动计算 s :=[] int {1,2,3 } //直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
初始化方法③ [5] int { 2:1,3:2,4:3}; s := arr[startIndex:endIndex] //将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
初始化方法④ [...] int {2:1,4:3}//长度为5的数组,起元素值依次为:0,0,1,0,3。由于指定了最大索引4对应的值3,根据初始化的元素个数确定其长度为5赋值与使用 xx
访问方法① 通过下标访问元素,可修改其元素值:arr[1] 同左
访问方法② 通过for遍历数组元素:for index, value := range arr 同左
其他 你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份(匿名拷贝)改变原值,则新值不会变 添加:①s :=append(s,1,2,3,4);②s :=append(s,s1...)

切片本身并不是动态数组或者数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似数组指针的一种封装。

切片三要素:
指针:指向地址
长度:len
容量:cap

切片初始化,len=cap
切片是引用类型(新地址,指向原地址上的值),最大的特点是,引用的地址上值改变,切片也会改变

slice := []int{1, 2, 3} //刚开始len=cap
newSlice := append(slice, 4, 5) //扩容,触发了拷贝(新建地址)
newnewSlice := slice[:] //切片的引用
slice[0] = 88
fmt.Printf("slice:%+v, newSlice:%+v, newnewSlice:%+v\n", slice, newSlice, newnewSlice)
//slice:[88 2 3], newSlice:[1 2 3 4 5], newnewSlice:[88 2 3]

另外,数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针。
所以函数中对数组改变,返回后数组不会改变

A(arr)

func A(arr []int){
  arr[0]=9
}

1.切片vs数组
2.切片是引用传递,所以它们不需要使用额外的内存并且比使用数组更有效率
3.空切片 vs nil切片
4.切片扩容:
4.1 扩容策略

如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。上面那个例子也验证了这一情况,总容量从原来的4个翻倍到现在的8个。
一旦元素个数超过 1024 个元素,那么增长因子就变成 1.25 ,即每次增加原来容量的四分之一。(××××××××××错,发现了1,2,4,6,8规律)
注意:扩容扩大的容量都是针对原来的容量而言的,而不是针对原来数组的长度而言的。

4.2扩容是生成全新的内存地址还是在原来的地址后追加?
4.2.1 slice创建方法一:【分扩容情况,是否扩容】
slice := []int{10, 20, 30, 40}
newSlice := append(slice, 50)
Go 默认会先开一片内存区域,把原来的值拷贝过来,然后再执行 append() 操作。这种情况丝毫不影响原数组。

4.2.2 切片字面量创建【新地址】
由于原数组还有容量可以扩容,所以执行 append() 操作以后,会在原数组上直接操作,所以这种情况下,扩容以后的数组还是指向原来的数组。
array := [4]int{10, 20, 30, 40}
slice := array[0:2]
newSlice := append(slice, 50)

详细参考链接

func main() {
    arrayA := [2]int{100, 200}
    testArrayPoint(&arrayA)   // 1.传数组指针
    arrayB := arrayA[:]
    testArrayPoint(&arrayB)   // 2.传切片 ****
    fmt.Printf("arrayA : %p , %v\n", &arrayA, arrayA)
}

func testArrayPoint(x *[]int) {
    fmt.Printf("func Array : %p , %v\n", x, *x)
    (*x)[1] += 100
}

打印结果:

func Array : 0xc4200b0140 , [100 200]
func Array : 0xc4200b0180 , [100 300]
arrayA : 0xc4200b0140 , [100 400]

并非所有时候都适合用切片代替数组,因为切片底层数组可能会在堆上分配内存,而且小数组在栈上拷贝的消耗也比make 消耗小

2. map

学习链接

sync/atomic的使用
Go之 unsafe.Pointer

  1. context
    学习链接

总结:

    1. 关于cancel
      withCance 会传递 cancel信号到子context中。
      如果某层context cancel了,则会向它的所有子值(或者说子节点)传达撤销信号。这些子值会如法炮制,把撤销信号继续传播下去。最后,这个Context值会断开它与其父值之间的关联。
  • 2.关于context 中的value
    设置传递时,会传递到所有子context中。
    取值key时,回去查找本context,如果没找到key,会向上去查找所有父的context查找

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

推荐阅读更多精彩内容

  • 切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开...
    一缕殇流化隐半边冰霜阅读 11,262评论 21 55
  • 线性结构是计算机最常用的数据结构之一。无论是数组(arrary)还是链表(list),在编程中不可或缺。golan...
    _二少爷阅读 6,615评论 5 13
  • 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合。切片是围绕动态...
    小孩真笨阅读 1,074评论 0 1
  • 原文地址:深入理解 Go Slice 是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特...
    EDDYCJY阅读 1,210评论 0 12
  • 1.感赏老公尽量早做晚饭,为我们多学习创造我条件;感赏老公为我和儿子营造温馨安静的学习氛围.感赏认真学习教材和书,...
    玫瑰铿锵阅读 502评论 0 6