Golang备忘录

由于最近在学习golang,记录一下学习这么久遇到的小坑以及容易忘记的点。学过C/C++/JAVA,了解过PHP/Python,但都不精通,有时候也因为知识太杂了而混淆,因此需要备忘录来记录知识点。之前是记录在自己的文档里,但文档很久没看就不知道丢哪去了,不如本着开源精神分享给大家,有什么错误的地方欢迎大家指正。

1)参数传递部分

golang中所有变量均以值的形式传递,均以直接复制的形式传递参数。最明显的,以常用的数组修改为例:

可以看到函数将数组以地址的形式直接传递(即指针),但需要注意的是,与C语言不同,golang不支持直接对地址进行修改,也就是说,C语言中通过数组首地址进行相加得到数组元素的方式在golang中行不通。

如果用append,结果可能就不会同步修改,因为append 可能会造成底层数组的扩容,导致传入的参数指向其他的地址,这样的话如果不将修改后的slice地址返回,则达不到修改效果;即使不进行扩容,修改也不会保存,是因为slice 在golang中的实现是一个结构体,分别有 len 和capacity 两个变量,只能访问len 长度内的数据,append 的部分为 len 之外,也无法正常访问。

对结构体的传递也是直接复制整个结构体(如下图),因此当结构体较大时,尽量使用指针的形式来传递结构体参数,但修改会涉及到原结构体中的内容,需要斟酌。

2)map实现原理

底层实现为数组+链表,每个数组下标处存储的是一个bucket,这个bucket的类型在实现中用bmap表示,每个bucket中可以存储8个kv键值对

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值