Sto cercando di creare una funzione che poteva accettare seguendointerfaccia Converti {} per mappare in Golang
*struct
[]*struct
map[string]*struct
Qui struct potrebbe essere qualsiasi non struct solo uno specifico. La conversione dell'interfaccia in *struct
o []*struct
funziona correttamente. Ma dando errore per la mappa.
Dopo aver riflettuto mostra che è map [] ma che genera un errore quando tenta di scorrere su un intervallo.
Ecco il codice
package main
import (
"fmt"
"reflect"
)
type Book struct {
ID int
Title string
Year int
}
func process(in interface{}, isSlice bool, isMap bool) {
v := reflect.ValueOf(in)
if isSlice {
for i := 0; i < v.Len(); i++ {
strct := v.Index(i).Interface()
//... proccess struct
}
return
}
if isMap {
fmt.Printf("Type: %v\n", v) // map[]
for _, s := range v { // Error: cannot range over v (type reflect.Value)
fmt.Printf("Value: %v\n", s.Interface())
}
}
}
func main() {
b := Book{}
b.Title = "Learn Go Language"
b.Year = 2014
m := make(map[string]*Book)
m["1"] = &b
process(m, false, true)
}
Esiste un modo per convertire interface{}
per mappare e iterare o scarica di elementi.
Bello. Ho aggiunto il 'MapKeys' alla mia parte di risposta mentre stavi postando la tua! – cnicutar
Funzionante assolutamente bene. Molte grazie. – SamTech