✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
10. Go 当中同步锁有什么特点?作用是什么?
在 Go 语言中,同步锁是一种常用的并发编程技术,用于保证多个 Goroutine 之间的共享数据的安全访问。Go 语言中的同步锁是通过 sync 包提供的 Mutex 类型实现的。
同步锁的特点如下:
- 互斥性:同一时刻只能有一个 Goroutine 持有锁,其他 Goroutine 需要等待锁的释放才能获取锁。
- 阻塞性:如果一个 Goroutine 尝试获取一个已经被其他 Goroutine 持有的锁,它会被阻塞,直到锁被释放。
- 公平性:锁的获取是公平的,即锁会按照申请的先后顺序分配给等待的 Goroutine,避免某些 Goroutine 永远无法获取锁的情况。
同步锁的作用是保护共享数据,避免多个 Goroutine 同时对共享数据进行修改而导致的竞争条件和数据竞争问题。在需要保证共享数据的安全访问时,可以使用同步锁来对临界区进行加锁,以避免并发修改数据产生的问题。在使用同步锁时,需要注意避免死锁和饥饿等问题的发生,同时需要合理地设计锁的粒度和作用域,避免锁的竞争导致性能下降。
实例
假设有一个全局变量 counter,多个 Goroutine 都要对其进行修改,为了保证对其安
全访问,可以使用同步锁来实现:
import ("fmt""sync"
)var counter int
var mutex sync.Mutexfunc increment() {mutex.Lock() // 获取锁counter = counter + 1 // 修改共享变量mutex.Unlock() // 释放锁
}func main() {var wg sync.WaitGroupfor i := 0; i < 100; i++ {wg.Add(1)go func() {defer wg.Done()increment() // 调用共享变量修改函数}()}wg.Wait()fmt.Println("Counter:", counter)
}
在上面的例子中,使用 sync.Mutex 类型的变量 mutex 来保护共享变量 counter 的安全访问。在 increment 函数中,首先通过调用 mutex.Lock() 方法获取锁,然后对 counter 进行修改,最后通过调用 mutex.Unlock() 方法释放锁。这样,在任意时刻只能有一个 Goroutine 获取到锁,从而保证了共享变量的安全访问。
11. Go 语言中 cap 函数可以作用于哪些内容?
在 Go 语言中,cap() 函数可以用于以下类型的数据:
- 数组:cap() 函数返回数组的长度,因为数组的长度在创建时就已经确定了。
- 切片:cap() 函数返回切片的容量,即切片底层数组的长度,它可能大于或等于切片的长度。切片容量的大小是在切片创建时自动分配的,也可以通过对切片使用 append() 函数来改变容量大小。
- Channel:cap() 函数返回 Channel 的容量,即 Channel 缓冲区的大小,只有在创建带缓冲的 Channel 时,才有意义。
注意:cap() 函数只能作用于包含指针的数据类型,如数组、切片和 Channel,而不能用于值类型的数据类型,如整型、浮点型等。
12. Go Convey 是什么?一般用来做什么?
Go Convey 是一个基于 BDD(行为驱动开发)的测试框架,可以用于 Go 语言的单元测试和集成测试。它的主要特点是使用简单、易于阅读、易于编写和可扩展性强。
Go Convey 的主要用途是在编写测试时提供更好的可读性和可维护性,因为它可以将测试代码直接嵌入到源代码中,并在运行时自动生成测试报告。此外,它还提供了可视化界面来展示测试结果,可以帮助开发人员更直观地了解测试情况。
Go Convey 的使用非常简单,只需要在项目中导入相应的包并编写测试代码即可。它支持多种测试样式,包括表格测试、单元测试、集成测试等,还可以与其他测试框架集成使用,如 Go Test、Ginkgo 等。