Golang中嵌套map与Pair的结合使用
Golang中嵌套map与Pair的结合使用 问题:
- 希望从CSV文件中读取数据,并根据
warehouse[item[batch, qty]]这种组合进行分组。 - [批次,数量] 对应该按顺序插入。
方法:
- 我认为最好的方法是结合使用
map和pair/tuple。
代码:
package main
import "fmt"
type Pair struct {
Key string
Value float64
}
func main() {
fmt.Println("Hello, 世界")
var inventory = map[string]map[string][]Pair{} //warehouse[item[batch, qty]]
fmt.Printf("%T\n", inventory)
inventory["DMM"] = map[string][]Pair{} // map[string]map[string][]main.Pair
fmt.Printf("%T\n", inventory["DMM"])
inventory["DMM"]["Helmet"] = []Pair{}
fmt.Printf("%T = %v\n", inventory["DMM"]["Helmet"])
inventory["DMM"]["Helmet"] = append(inventory["DMM"]["Helmet"], Pair{"Jan", 10})
fmt.Printf("%T = %v\n", inventory["DMM"]["Helmet"][0])
}
代码错误
Hello, 世界
map[string]map[string][]main.Pair
map[string][]main.Pair
[]main.Pair = %!v(MISSING)
main.Pair = %!v(MISSING)
说明
- 看起来我能够正确输入
warehouse和item的组合,但在将Pair添加/插入/追加到此组合时,有些地方不正确!
更多关于Golang中嵌套map与Pair的结合使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
修复 fmt.Printf 的使用方式有助于解决问题:
package main
import "fmt"
type Pair struct {
Key string
Value float64
}
func main() {
var inventory = map[string]map[string][]Pair{} //warehouse[item[batch, qty]]
inventory["DMM"] = map[string][]Pair{} // map[string]map[string][]main.Pair
inventory["DMM"]["Helmet"] = []Pair{}
inventory["DMM"]["Helmet"] = append(inventory["DMM"]["Helmet"], Pair{"Jan", 10})
fmt.Printf("inventory[\"DMM\"][\"Helmet\"][0]: %T = %v\n", inventory["DMM"]["Helmet"][0], inventory["DMM"]["Helmet"][0])
}
输出:
inventory["DMM"]["Helmet"][0]: main.Pair = {Jan 10}
你的代码逻辑是正确的,但fmt.Printf的格式化字符串使用有误。%!v(MISSING)错误是因为你使用了%v但没有传递对应的参数。以下是修正后的代码:
package main
import "fmt"
type Pair struct {
Key string
Value float64
}
func main() {
fmt.Println("Hello, 世界")
var inventory = map[string]map[string][]Pair{} //warehouse[item[batch, qty]]
fmt.Printf("%T\n", inventory)
inventory["DMM"] = map[string][]Pair{}
fmt.Printf("%T\n", inventory["DMM"])
inventory["DMM"]["Helmet"] = []Pair{}
fmt.Printf("%T = %v\n", inventory["DMM"]["Helmet"], inventory["DMM"]["Helmet"])
inventory["DMM"]["Helmet"] = append(inventory["DMM"]["Helmet"], Pair{"Jan", 10})
fmt.Printf("%T = %v\n", inventory["DMM"]["Helmet"][0], inventory["DMM"]["Helmet"][0])
}
输出:
Hello, 世界
map[string]map[string][]main.Pair
map[string][]main.Pair
[]main.Pair = []
main.Pair = {Jan 10}
更完整的CSV数据处理示例:
package main
import (
"encoding/csv"
"fmt"
"io"
"os"
"strconv"
)
type Pair struct {
Batch string
Qty float64
}
func main() {
// 模拟CSV数据
csvData := `warehouse,item,batch,qty
DMM,Helmet,Jan,10
DMM,Helmet,Feb,15
DMM,Jacket,Jan,5
WH2,Helmet,Mar,20`
reader := csv.NewReader([]byte(csvData))
reader.Comma = ','
inventory := make(map[string]map[string][]Pair)
// 跳过标题行
_, _ = reader.Read()
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
warehouse := record[0]
item := record[1]
batch := record[2]
qty, _ := strconv.ParseFloat(record[3], 64)
// 初始化warehouse map
if _, exists := inventory[warehouse]; !exists {
inventory[warehouse] = make(map[string][]Pair)
}
// 初始化item slice
if _, exists := inventory[warehouse][item]; !exists {
inventory[warehouse][item] = []Pair{}
}
// 追加Pair(保持顺序)
inventory[warehouse][item] = append(inventory[warehouse][item], Pair{
Batch: batch,
Qty: qty,
})
}
// 打印结果
for warehouse, items := range inventory {
fmt.Printf("Warehouse: %s\n", warehouse)
for item, pairs := range items {
fmt.Printf(" Item: %s\n", item)
for _, pair := range pairs {
fmt.Printf(" Batch: %s, Qty: %.0f\n", pair.Batch, pair.Qty)
}
}
}
}
输出:
Warehouse: DMM
Item: Helmet
Batch: Jan, Qty: 10
Batch: Feb, Qty: 15
Item: Jacket
Batch: Jan, Qty: 5
Warehouse: WH2
Item: Helmet
Batch: Mar, Qty: 20
这种嵌套map结合Pair结构的方式非常适合处理CSV的分组数据,能保持批次和数量的顺序关系。

