这是我参与「第五届青训营 」伴学笔记创作活动的第 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
- 使用
new函数来分配空间 - 传递给
new函数的是一个类型,而不是一个值 - 返回值是指向这个新分配的地址的指针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 语言当中数组和切片在传递的时候的区别是什么?
- 数组是值传递
- 切片看上去像是引用传递,但其实是值传递
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 应该直接跟在请求资源的语句后。