为了账号安全,请及时绑定邮箱和手机立即绑定

初始化地图问题

初始化地图问题

Go
波斯汪 2023-05-08 18:04:38
我正在开发一个项目,我需要声明以下内容:mapDataPayload := make(map[string][]*dataPayload)如果我向它附加数据,它会正常工作。mapDataPayload := make(map[string][]*dataPayload)for {    select {    case rcvData := <-ch:        mapDataPayload[rcvData.Topic] = append(            mapDataPayload[rcvData.Topic],            &dataPayload{Message: rcvData.Message},        )    }}但是,我想设置一个大小限制。随着追加,它会不停地增长。我想要实现的是当达到限制(最大值:100)时,它会覆盖索引 0、1、2 ...mapDataPayload[rcvData.Topic][0]mapDataPayload[rcvData.Topic][1]我尝试用以下方法初始化以下内容:make(map[string][]*dataPayload, 100)for {    select {    case rcvData := <-ch:        mapDataPayload[rcvData.Topic][0] = &dataPayload{Message: rcvData.Message}    }}但是,如果我检查长度,它将返回 0。用直接初始化 (mapDataPayload[rcvData.Topic][0]) 替换 append 会立即导致错误。所以,我想要做的是用一个限制填充 map[string][]*dataPayload,例如这个数据:{  "test1": {    "0": {      "Message": "Heasdllo"    },    "1": {      "Message": "Hel132lo"    },    "2": {      "Message": "Hedsallo"    }  },  "testanother": {    "0": {      "Message": "adsad"    },    "1": {      "Message": "Helwqe2lo"    },    "2": {      "Message": "Hel21321lo"    },    "3": {      "Message": "Hel21321lo"    }  }}当它达到数字 100 时,我想回到数字 0、1、2...
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

您可以像这样为循环缓冲区实现数据结构


package main


import (

    "fmt"

)


type Circle struct  {

   Size int

   Contents []interface{}

   Pointer int

}


func (c *Circle) Setup(n int) {

   (*c).Size=n

   (*c).Contents=make([]interface{},n)

}


func (c *Circle) Add(value interface{}) {

   (*c).Contents[(*c).Pointer] = value

   (*c).Pointer = ((*c).Pointer+1) % (*c).Size

}



func main() {

        mapDataPayload := make(map[string]*Circle)

        mapDataPayload["aaa"]=&Circle{}

        mapDataPayload["aaa"].Setup(10)

    for i:=0; i<9999; i++ {

      mapDataPayload["aaa"].Add(i)

    }

    mapDataPayload["aaa"].Add("banana")

    fmt.Println(mapDataPayload["aaa"].Contents)


}

更新为使用 interface{} 以便可以使用任何类型的数据


查看完整回答
反对 回复 2023-05-08
?
aluckdog

TA贡献1847条经验 获得超7个赞

像这样使用:


for {

    select {

    case rcvData := <-ch:


        _, exists := mapDataPayload[rcvData.Topic]

        if !exists {

            mapDataPayload[rcvData.Topic] = []*dataPayload{}

        }

        if len(mapDataPayload[rcvData.Topic]) < 100 {

            mapDataPayload[rcvData.Topic] = append(

                mapDataPayload[rcvData.Topic],

                &dataPayload{Message: rcvData.Message},

            )

        } else {

            mapDataPayload[rcvData.Topic][len(mapDataPayload[rcvData.Topic]) % 100] = &dataPayload{Message: rcvData.Message}

        }

    }

}


查看完整回答
反对 回复 2023-05-08
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信