MST

星途 面试题库

面试题:Go语言Map复杂条件过滤与并发处理

假设有一个`map[string]map[string]int`类型的数据结构,外层键表示用户ID,内层键表示商品ID,值表示购买数量。现在要求实现一个并发处理的函数,该函数需要过滤出购买数量大于5且商品ID长度大于10的所有键值对,同时将满足条件的用户ID和商品ID记录到一个共享的结果集中。在实现过程中,请处理好并发安全问题,确保结果的正确性。请给出完整的实现代码和必要的注释说明。
50.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

// FilterAndCollect 过滤并收集符合条件的键值对
func FilterAndCollect(data map[string]map[string]int, result *sync.Map) {
    var wg sync.WaitGroup
    for userId, userData := range data {
        wg.Add(1)
        go func(uId string, uData map[string]int) {
            defer wg.Done()
            for productId, count := range uData {
                if count > 5 && len(productId) > 10 {
                    // 使用sync.Map的Store方法将符合条件的用户ID和商品ID存储到共享结果集中
                    result.Store(uId, productId)
                }
            }
        }(userId, userData)
    }
    wg.Wait()
}

你可以使用以下方式调用这个函数:

func main() {
    data := map[string]map[string]int{
        "user1": {
            "product1": 3,
            "product123456789012": 6,
        },
        "user2": {
            "product123456789": 4,
            "product1234567890123": 7,
        },
    }
    var result sync.Map
    FilterAndCollect(data, &result)

    // 遍历结果集
    result.Range(func(key, value interface{}) bool {
        fmt.Printf("UserID: %s, ProductID: %s\n", key, value)
        return true
    })
}

代码说明

  1. FilterAndCollect函数

    • 参数data是类型为map[string]map[string]int的数据结构,即外层键是用户ID,内层键是商品ID,值是购买数量。
    • 参数result是指向sync.Map的指针,用于存储符合条件的用户ID和商品ID。
    • 使用sync.WaitGroup来等待所有的goroutine完成。
    • 遍历外层的用户ID和内层的商品ID及购买数量,在goroutine中进行条件判断:购买数量大于5且商品ID长度大于10。
    • 如果符合条件,使用sync.MapStore方法将用户ID和商品ID存储到共享结果集中。
  2. main函数

    • 初始化一个示例数据data
    • 创建一个sync.Map实例result
    • 调用FilterAndCollect函数进行过滤和收集。
    • 使用sync.MapRange方法遍历结果集并打印符合条件的用户ID和商品ID。