Go语言for循环向map存数据仅显示最后一条该如何解决
问题原因
你代码的问题主要有两点:
- 每次循环都对
chunks["label"]执行赋值操作,同一个map key被重复赋值时会直接覆盖旧值,所以最终map里只会保留最后一次循环创建的Stream实例 - 你每次创建
Stream时,Entries字段都被初始化为仅包含当前line的单元素切片,没有将新数据追加到已有切片中
额外注意:你提供的代码存在语法错误,切片中嵌入结构体字面量需要额外加一层{},正确写法为[]Entry{{Timestamp: time.Now(), Line: line.Logmsg}},否则会直接编译失败。
修复后的代码
for _, line := range Lines { fmt.Println(line.Logmsg) // 先校验对应key的Stream是否存在 stream, ok := chunks["label"] if !ok { // 不存在则初始化Stream并存入map stream = &Stream{ Labels: "label", Entries: []Entry{}, } chunks["label"] = stream } // 往已有的Entries切片追加新的Entry stream.Entries = append(stream.Entries, Entry{ Timestamp: time.Now(), Line: line.Logmsg, }) } fmt.Println(chunks)
修复后首次循环会初始化chunks["label"]对应的Stream实例,后续循环都复用这个实例,把每一行的日志追加到Entries切片中,不会再出现数据覆盖的问题。
内容的提问来源于stack exchange,提问作者Rajib Mitra
相关产品推荐
相关产品推荐

