Во-первых, я предпочитаю использовать другой идентификатор в качестве ключа карты. В этом примере я использую device.ID в качестве ключа карты
package main
import (
"fmt"
"strings"
)
type Device struct {
ID int64
Drives []Drive
}
type Drive struct {
Name string
Status string
}
func main() {
devices := []Device{
{
ID: 1,
Drives: []Drive{
{
Name: "Drive1.1",
Status: "ONLINE",
},
{
Name: "Drive1.2",
Status: "OFFLINE",
},
},
},
{
ID: 2,
Drives: []Drive{
{
Name: "Drive2.1",
Status: "OFFLINE",
},
{
Name: "Drive2.2",
Status: "OFFLINE",
},
},
},
{
ID: 3,
Drives: []Drive{
{
Name: "Drive3.1",
Status: "OFFLINE",
},
{
Name: "Drive3.2",
Status: "ONLINE",
},
},
},
}
faults := make(map[int64][]Drive)
for _, device := range devices {
for _, drive := range device.Drives {
if !strings.EqualFold(drive.Status, "ONLINE") {
// Check if this is the first fault for this device
if _, set := faults[device.ID]; !set {
// other stuff snipped for brevity
faults[device.ID] = make([]Drive, 0)
}
faults[device.ID] = append(faults[device.ID], drive)
}
}
}
fmt.Printf("%+v", faults)
}
При использовании этого подхода есть некоторые преимущества:
- Более быстрое считывание карты
- Подробнеечитаемый код
Но, если вы по-прежнему предпочитаете использовать указатель в качестве ключа карты, вы должны получить доступ к срезу. Цикл будет таким:
faults := make(map[*Device][]Drive)
for i := range devices {
for _, drive := range devices[i].Drives {
if !strings.EqualFold(drive.Status, "ONLINE") {
// Check if this is the first fault for this device
if _, set := faults[&devices[i]]; !set {
// other stuff snipped for brevity
faults[&devices[i]] = make([]Drive, 0)
}
faults[&devices[i]] = append(faults[&devices[i]], drive)
}
}
}