面试题答案
一键面试设计思路
- 使用闭包:闭包可以捕获并持有外部变量,通过在闭包内操作共享资源,实现对资源的封装。
- 函数式编程:利用函数式编程无副作用、纯函数的特性,将对共享资源的操作封装在函数中,使得操作具有确定性和可预测性。
- 并发安全:使用Go语言的
sync.Mutex
来保证在并发环境下对共享资源(计数器)的安全访问。
核心代码片段
package main
import (
"fmt"
"sync"
)
func NewSafeCounter() (func() int, func()) {
var count int
var mu sync.Mutex
increment := func() int {
mu.Lock()
count++
mu.Unlock()
return count
}
getCount := func() int {
mu.Lock()
defer mu.Unlock()
return count
}
return increment, getCount
}
你可以这样使用上述函数:
func main() {
increment, getCount := NewSafeCounter()
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Final count:", getCount())
}
在上述代码中,NewSafeCounter
函数返回了两个闭包函数,increment
用于增加计数器的值,getCount
用于获取当前计数器的值。在这两个闭包函数内,通过sync.Mutex
来保证对共享变量count
的并发安全访问。在main
函数中,模拟了10个并发操作来增加计数器的值,最后获取并打印最终的计数值。