Golang 笔试面试学习第三天之make

Golang 笔试面试学习第二天之make

Golang轻松学习


个人博客站点:
简书: 😽 猫轻王 https://www.jianshu.com/u/6cce817646be
掘金: 😽 猫轻王 https://juejin.cn/user/1640918680347453
CSDN: 😽 猫轻王 https://blog.csdn.net/moer0
个人项目主页:https://github.com/moercat


一、make 是什么?

Go 语言中 make 关键字主要用于初始化 slice、map 和 channel 并返回初始化之后的值,这个值并不是零值,也不是指针,而是经过初始化之后的 T 的引用。

二、详细代码

1.make slice的逻辑

代码如下(示例):

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

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

输出:

 [0 0 0 0 0 1 2 3]
 [1 2 3 4]

结果:
这道题其实考察的就是make的基本使用,当初始化切片时,
make([]int, a,b),其中a是该初始化切片的个数,b是该初始化切片的容量。
我们学习过,当go 中的切片扩容时,当容量小于1024时会直接翻倍,而超过时每次只会增加0.25倍,也就是 1n+0.25n,所以我们在初始时可以进行定容,使得切片不会超出容量不进行扩容。
该题主要的还是在 a 切片内元素个数,由于我们初始化个数不为零,也就是让切片其中初始存在 5 个数,初始的元素也就是切片的默认元素, 数值类型 int 就是 0,字符串就是 ““。而了解了这点,那么其实我们也就可以知道,make([]int, 5) 其实已经等于 [0 0 0 0 0 ] ,之后append 自然会出现
[0 0 0 0 0 1 2 3]。

2.make map 的逻辑

对 map 来说,make只用来初始化容量,而非key的个数。
由于map的扩容规则可能会改变存储地址,若我们也可以预估key的数量,也可以初始化容量,这也会节省我们的空间与时间,省去扩容行为。

2.make channel 的逻辑

channel 较为特殊,当我们对其make(chan int,0)时,也就是不设置缓冲区,那么当我们写入时 chan <- 将会阻塞直到另一个协程的读取 <- chan。而当我们设置缓冲区时make(chan int,1),意思就是我们可以预先存入几个元素,而不会阻塞。当缓冲区溢出时,我们存入第二个元素依然需要等待其他协程读取才可以继续存入。


总结

make在生产环境其实使用的很多,当切片在不初始化时都是nil,而非我们通常意义上的空数组 [],当chan make设置时,则可以用来作为计数器或协程处理其他业务需要。将串行任务一步步转化为并行任务。


希望这个博客能对你有所益处。我是轻王,我为自己代言。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫轻王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值