【面试题】Golang(第四篇)

目录

1.make和new的区别

2.Go语言当中值传递和地址传递(引用传递)如何运用?有什么区别?

3.Go语言中的数组和切片的区别?Go语言中数组和切片在传递时候的区别是什么?Go语言是如何实现切片扩容的?

4.Go Convey是什么?一般用来做什么?

5.defer的作用和特点是什么?

6.Go slice的底层实现? Go slice的扩容机制?

7.扩容前后的slice是否相同?

8.slice为什么是非线程安全的?


1.make和new的区别

区别:1、make只能用来分配及初始化类型为slice、map、chan的数据;而new可以分配任意类型的数据。

2、new分配返回的是指针,即类型“*Type”;而make返回引用,即Type。

3、new分配的空间会被清零;make分配空间后,会进行初始化。

2.Go语言当中值传递和地址传递(引用传递)如何运用?有什么区别?

值传递只会把参数的值复制一份放进对应的函数,两个变量的地址不同,不可相互修改。

地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变量进行值内容的修改。

3.Go语言中的数组和切片的区别?Go语言中数组和切片在传递时候的区别是什么?Go语言是如何实现切片扩容的?

数组:

数组固定长度数组长度是数组类型的一部分,所以[3]int 和[4]int 是两种不同的数组类型数组需要指定大小,不指定也会根据处初始化对的自动推算出大小,不可改变数组是通过值传递的

切片:

切片可以改变长度,切片是轻量级的数据结构,三个属性,指针,长度,容量不需要指定大小。切片是地址传递(引用传递)可以通过数组来初始化,也可以通过内置函数 make()来初始化,初始化的时候 len=cap,然后进行扩容。

数组是值类型,切片是引用类型;

数组的长度是固定的,而切片不是(切片是动态的数组)

切片的底层是数组

Go语言的切片扩容机制非常巧妙,它通过重新分配底层数组并将数据迁移至新数组来实现扩容。具体来说,当切片需要扩容时,Go语言会创建一个新的底层数组,并将原始数组中的数据拷贝到新数组中。然后,切片的指针指向新数组,长度更新为原始长度加上扩容的长度,容量更新为新数组的长度。

实现切片扩容:

go1.17

// src/runtime/slice.go
​
func growslice(et *_type, old slice, cap int) slice {
    // ...
​
    newcap := old.cap
    doublecap := newcap + newcap
    if cap > doublecap {
        newcap = cap
    } else {
        if old.cap < 1024 {
            newcap = doublecap
        } else {
            // Check 0 < newcap to detect overflow
            // and prevent an infinite loop.
            for 0 < newcap &&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱编程的小猴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值