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里面的类型都可以使用该方法去重