Golang中嵌套map与Pair的结合使用

Golang中嵌套map与Pair的结合使用 问题:

  • 希望从CSV文件中读取数据,并根据 warehouse[item[batch, qty]] 这种组合进行分组。
  • [批次,数量] 对应该按顺序插入。

方法:

  • 我认为最好的方法是结合使用 mappair/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)

说明

  • 看起来我能够正确输入 warehouseitem 的组合,但在将 Pair 添加/插入/追加到此组合时,有些地方不正确!

更多关于Golang中嵌套map与Pair的结合使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢

更多关于Golang中嵌套map与Pair的结合使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


修复 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}

https://play.golang.org/p/xtxzPQdWuo8

你的代码逻辑是正确的,但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的分组数据,能保持批次和数量的顺序关系。

回到顶部