我想找到相似的条目并想将它们存储在相同的id下
options = [
{"ABC": [opt1, opt2]}, // opt1 and opt2 have the same id
{"DEF": [opt3]}
]
输入看起来像这样
input = [opt1, opt2, opt3, opt4] // opt1.id = opt2.id == "ABC"
基于
type Priceoption struct {
Option string `json:"prnumber"`
Price string `json:"price"`
Setting string `json:"setting"`
Origin string `json:"Origin"`
}
func GetPriceOptions() []Priceoption {
opts := []Priceoption{
{Option: "ABC", Price: "11.00", Setting: "foo", Origin: "201"},
{Option: "DEF", Price: "27.00", Setting: "bar", Origin: "198"},
{Option: "XYZ", Price: "41.00", Setting: "zap", Origin: "E"},
{Option: "DEF", Price: "27.00", Setting: "bar", Origin: "198"},
{Option: "ABC", Price: "n/a", Setting: "foo", Origin: "201"},
}
return opts
}
还有这个
func main() {
opts := GetPriceOptions()
sort.Slice(opts, func(i, j int) bool {
if opts[i].Option != opts[j].Option {
return opts[i].Option < opts[j].Option
}
return opts[i].Price < opts[j].Price
})
fmt.Printf("Sorted Options List: %v\n", opts)
opts = slices.Compact(opts) // works if every property has the same value
fmt.Printf("Compacted List: %v\n", opts)
}
这适用于每个属性中具有相同值的每个结构(仅上面
{DEF 27.00 bar 198}
)。但我想找到一个属性具有相同值的结构。
以这两个为例
opt1 = {"Option": "ABC", "Price": "11.00", "Setting": "foo", "Origin": "201"}
opt2 = {"Option": "ABC", "Price": "n/a", "Setting": "bar", "Origin": "E"}
我尝试调整检查结构中是否存在值并将其保存在另一个数组中来解决我的问题
但是我的演示代码被困住了。
恐慌:运行时错误:无效的内存地址或 nil 指针 取消引用 [信号 SIGSEGV:分段违规代码=0x1 addr=0x20 pc=0x4577ff]
goroutine 1 [运行]: main.main() /tmp/sandbox1376546491/prog.go:50 +0x23f
失败的行是我想向地图添加选项的行
optiongroup.Options = append(optiongroup.Options, opt)
这里是
main
func main() {
priceoptions := GetPriceOptions()
optiongroups := make(map[string]*OptionGroup) // map
for _, opt := range priceoptions {
optId := opt.Option
optiongroup, ok := optiongroups[optId]
if !ok {
optiongroup := &OptionGroup{OptId: optId, Options: []Priceoption{}}
optiongroups[optId] = optiongroup
}
// Append option fails
optiongroup.Options = append(optiongroup.Options, opt)
}
println("optiongroups", len(optiongroups))
}
map["ABC"].Add(option)
?如果您从 !ok 条件内的选项组中删除 := ,则追加应该可以工作。
if !ok {
optiongroup = &OptionGroup{OptId: optId, Options: []Priceoption{}}
optiongroups[optId] = optiongroup
}