How to make a row as map[string]map[string]interface{}
cannot use s.ID (type string) as type map[string]interface {} in assignment
var row = make(map[string]map[string]interface{})
Listservers
func ListServers() (map[string]map[string]interface{}, error) {
listOptions := servers.ListOpts{}
pager := servers.List(GetClientCompute(), listOptions)
err := pager.EachPage(func(page pagination.Page) (bool, error) {
serverList, err := servers.ExtractServers(page)
if err != nil {
fmt.Println(err)
}
for _, s := range serverList {
row["ID"] = s.ID <---- error is here
row["Name"] = s.Name <---- error is here
if s.Addresses["public"] != nil {
for _, i := range s.Addresses["public"].([]interface{}) {
temp := i.(map[string]interface{})
if temp["version"].(float64) == 4 {
row["IP"] = temp["addr"]
}
}
}
t, _ := time.Parse(time.RFC3339, s.Created)
row["Flavor"] = s.Flavor
row["Created"] = time.Now().Sub(t) <---- error is here
row["Status"] = s.Status <---- error is here
}
return false, nil
})
// fmt.Println(lists)
return row, err
}
The row
is a SLICE of map[string]interface{}
. You need to provide the length when you initialize the slice like this:
row := make([]map[string]interface{}, 0)
The index of a slice MUST be an integer, That's why you encounter the second problem mentioned in your comment.
Let's suppose serverList
is a slice. You code may be modified as:
rows := make([]map[string]interface{}, 0) // create a slice
// ... codes omitted
for _, s := range serverList {
row := make(map[string]interface{}) // create an item
row["ID"] = s.ID
row["Name"] = s.Name
// ... codes omitted
row["Flavor"] = s.Flavor
row["Created"] = time.Now().Sub(t)
row["Status"] = s.Status
rows = append(rows, row) // append the item to the slice
}
return rows, err