golang 之map妙用

31 阅读2分钟

go版本

go 1.22.2

1.优化字段组合逻辑

type ActivityInfo struct {
    Id             int64
    Name           string
    Image          string
    Desc           string
    StartTime      string
    EndTime        string
    HostUserId     int64
    HostUserName   string
    HostUserAvatar string
}

type UserInfo struct {
    Id     int64
    Name   string
    Avatar string
}


func GetActivityInfoDetailList() []ActivityInfo {
    var activityInfoList []ActivityInfo
    userInfoList := []UserInfo{
       {Id: 1011, Name: "Tom", Avatar: "https://xxxx.xx/xxxxx.png"},
       {Id: 1012, Name: "Joke", Avatar: "https://xxxx.xx/xxxxx.png"},
       {Id: 1013, Name: "Tone", Avatar: "https://xxxx.xx/xxxxx.png"},
    }

    activityInfoList = []ActivityInfo{
       {Id: 20, Name: "活动1", Image: "https://xxxx.xx/xxxxx.png", Desc: "活动1", StartTime: "2024-08-09", EndTime: "2024-08-10", HostUserId: 1011},
       {Id: 21, Name: "活动2", Image: "https://xxxx.xx/xxxxx.png", Desc: "活动2", StartTime: "2024-08-09", EndTime: "2024-08-10", HostUserId: 1012},
       {Id: 22, Name: "活动3", Image: "https://xxxx.xx/xxxxx.png", Desc: "活动3", StartTime: "2024-08-09", EndTime: "2024-08-10", HostUserId: 1013},
    }

    

    return activityInfoList
}

上面这个想要实现ActivityInfoDetail的拼接最简单的方法就是两个内嵌for循环直接完事 也可以用map去做些骚操作处理这个逻辑,代码如下所示:

func GetActivityInfoDetailList() []ActivityInfo {
    var activityInfoList []ActivityInfo
    userInfoList := []UserInfo{
       {Id: 1011, Name: "Tom", Avatar: "https://xxxx.xx/xxxxx.png"},
       {Id: 1012, Name: "Joke", Avatar: "https://xxxx.xx/xxxxx.png"},
       {Id: 1013, Name: "Tone", Avatar: "https://xxxx.xx/xxxxx.png"},
    }

    activityInfoList = []ActivityInfo{
       {Id: 20, Name: "活动1", Image: "https://xxxx.xx/xxxxx.png", Desc: "活动1", StartTime: "2024-08-09", EndTime: "2024-08-10", HostUserId: 1011},
       {Id: 21, Name: "活动2", Image: "https://xxxx.xx/xxxxx.png", Desc: "活动2", StartTime: "2024-08-09", EndTime: "2024-08-10", HostUserId: 1012},
       {Id: 22, Name: "活动3", Image: "https://xxxx.xx/xxxxx.png", Desc: "活动3", StartTime: "2024-08-09", EndTime: "2024-08-10", HostUserId: 1013},
    }

    userInfoMap := make(map[int64]UserInfo)

    for _, userInfo := range userInfoList {
       userInfoMap[userInfo.Id] = userInfo
    }

    for _, activityInfo := range activityInfoList {
       userInfo, ok := userInfoMap[activityInfo.HostUserId]
       if ok {
          activityInfo.HostUserName = userInfo.Name
          activityInfo.HostUserAvatar = userInfo.Avatar
       }
    }
    return activityInfoList
}

这种实现方式比直接使用for循环嵌套的时间复杂度低,特别是在处理数据量比较多的情况

2.map实现set数据结构

package main

//实现集合
import (
    "fmt"
    "sync"
)

var setLock = sync.RWMutex{}

type Set map[string]struct{}

func (s Set) Has(key string) bool {
    setLock.RLock()
    _, ok := s[key]
    setLock.RUnlock()
    return ok
}

func (s Set) Add(key string) {
    setLock.Lock()
    s[key] = struct{}{}
    setLock.Unlock()
}

func (s Set) Delete(key string) {
    setLock.Lock()
    delete(s, key)
    setLock.Unlock()
}

func main() {
    s := make(Set)
    s.Add("Tom")
    s.Add("Sam")
    fmt.Println(s.Has("Tom"))
    fmt.Println(s.Has("Jack"))
}

3.利用map去重

package main

import "fmt"

func main() {
    testList1 := []int{1, 2, 3, 3, 4, 4, 5, 6}
    testList2 := RemoveDuplicates(testList1)
    fmt.Println(testList2)
}

func RemoveDuplicates(nums []int) []int {
    var result []int
    tempMap := make(map[int]struct{})
    for _, val := range nums {
       if _, ok := tempMap[val]; ok {
          continue
       }
       tempMap[val] = struct{}{}
       result = append(result, val)
    }
    return result
}

上面的代码只是一个简单的去重功能只实现了int类型列表相关去重,我们可以再使用泛型优化一下,让其适用更多范围

func main() {
    testList1 := []int{1, 2, 3, 3, 4, 4, 5, 6}
    testList2 := RemoveDuplicates[int](testList1)
    fmt.Println(testList2)

    testList3 := []string{"a", "b", "c", "d", "a", "b"}
    testList4 := RemoveDuplicates[string](testList3)
    fmt.Println(testList4)
}

type mapKey interface {
    int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | uintptr | float32 | float64 | string
}

func RemoveDuplicates[T mapKey](nums []T) []T {
    var result []T
    tempMap := make(map[T]struct{})
    for _, val := range nums {
       if _, ok := tempMap[val]; ok {
          continue
       }
       tempMap[val] = struct{}{}
       result = append(result, val)
    }
    return result
}

如上所示mapKey里面的类型都可以使用该方法去重