Day18-Go面试题整理基础篇 | 青训营笔记

78 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天

1、Go 语言中 cap 函数可以作用于哪些内容?

可以作用于的类型有:

  • array(数组)
  • slice(切片)
  • channel(通道)

2、Go Convey 是什么?一般用来做什么?

  • go convey 是一个支持 Golang 的单元测试框架
  • go convey 能够自动监控文件修改并启动测试,并可以将测试结果实时输出到 Web 界面
  • go convey 提供了丰富的断言简化测试用例的编写

3、Go 语言当中 new 的作用是什么?

new 创建一个该类型的实例,并且返回指向该实例的指针。new 函数是内建函数,函数定义:

func new(Type) *Type
  1. 使用 new 函数来分配空间
  2. 传递给new 函数的是一个类型,而不是一个值
  3. 返回值是指向这个新分配的地址的指针13

4、Go 语言中 make 的作用是什么?

make 的作用是为 slice, map or chan 的初始化 然后返回引用 make 函数是内建函数,函数定义:

func make(Type, size IntegerType) Type

make(T, args)函数的目的和 new(T)不同 仅仅用于创建 slice, map,channel 而且返回类型是实例

5、Printf(),Sprintf(),FprintF() 都是格式化输出,有什么不同?

虽然这三个函数,都是格式化输出,但是输出的目标不一样

  • Printf 是标准输出,一般是屏幕,也可以重定向。
  • Sprintf()是把格式化字符串输出到指定的字符串中。
  • Fprintf()是把格式化字符串输出到文件中。

6、Go 语言当中数组和切片的区别是什么?

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

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

7、Go 语言当中值传递和地址传递(引用传递)如何运用?有什么区别?举例说明

  • 值传递只会把参数的值复制一份放进对应的函数,两个变量的地址不同,不可相互修改。
  • 地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变量进行值内容的修改。

8、Go 语言当中数组和切片在传递的时候的区别是什么?

  1. 数组是值传递
  2. 切片看上去像是引用传递,但其实是值传递

19、Go 语言是如何实现切片扩容的?

func main() {
    arr := make([]int, 0)
    for i := 0; i < 2000; i++ {
        fmt.Println("len 为", len(arr), "cap 为", cap(arr))
        arr = append(arr, i)
    }
}

//结果依次是

0,1,2,4,8,16,32,64,128,256,512,1024

但到了 1024 之后,就变成了

1024,1280,1696,2304

每次都是扩容了四分之一左右

10、看下面代码的 defer 的执行顺序是什么? defer 的作用和特点是什么?

defer 的作用是:

只需要在调用普通函数或方法前加上关键字 defer,就完成了 defer 所需要的语法。当 defer 语句被执行时,跟在 defer 后面的函数会被延迟执行。直到包含该 defer 语句的函数执行完毕时,defer 后的函数才会被执行,不论包含defer 语句的函数是通过 return 正常结束,还是由于 panic 导致的异常结束。你可以在一个函数中执行多条 defer 语句,它们的执行顺序与声明顺序相反。

defer 的常用场景:

  • defer 语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。
  • 通过 defer 机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。
  • 释放资源的 defer 应该直接跟在请求资源的语句后。