MST

星途 面试题库

面试题:Go闭包在并发场景下与函数式编程的协作

在Go语言的并发编程场景中,如何利用闭包与函数式编程的结合来实现一个安全的共享资源访问机制,例如一个并发安全的计数器。请详细阐述设计思路并给出核心代码片段。
21.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用闭包:闭包可以捕获并持有外部变量,通过在闭包内操作共享资源,实现对资源的封装。
  2. 函数式编程:利用函数式编程无副作用、纯函数的特性,将对共享资源的操作封装在函数中,使得操作具有确定性和可预测性。
  3. 并发安全:使用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个并发操作来增加计数器的值,最后获取并打印最终的计数值。