Go cannot exceed <my var> (type interface {})
I am in the childhood stage, trying to plunge into the move. I am currently simulating an API request that returns a JSON string containing an array of objects. I am trying to find the most suitable way to iterate over each record and access each field. Ultimately, each field will be written to an Excel spreadsheet, but for now I just want to print each key and field value.
Here's what I have (I would provide it on the Go playground, but HTTP requests are not supported):
response, err := http.Get("http://go-proto.robwilkerson.org/demo.json") failOnError(err, "Uh oh") defer response.Body.Close() var view []interface{} json.NewDecoder(response.Body).Decode(&view) log.Printf(" [x] Pulled JSON: %s", view) for _, record := range view { log.Printf(" [===>] Record: %s", record) for key, val := range record { log.Printf(" [========>] %s = %s", key, val) } } Everything works fine until the nested loop tries to iterate over map , which contains the properties of each record:
cannot range over record (type interface {}) I have two questions, I think:
- Is a nested loop the most efficient / effective way to access each property of each record?
- What do I need to do to get around this error?
UPDATE
When I upload data that is decoded into the view variable, this is the result of the registration:
[ map[id:ef14912f-8031-42b3-8c50-7aa612287534 avatar:http://placehold.it/32x32 name:Vilma Hobbs email: vilmahobbs@exiand.com phone:+1 (886) 549-3522 address:471 Dahill Road, Jacksonwald, Alabama, 6026] map[id:1b7bf182-2482-4b8b-8210-9dc9ee51069e avatar:http://placehold.it/32x32 name:Anne Dalton email: annedalton@exiand.com phone:+1 (994) 583-2947 address:660 Macdougal Street, Ticonderoga, Alaska, 7942] map[id:f8027852-f52e-4bbb-bc9d-fb5e34929b40 avatar:http://placehold.it/32x32 name:Amie Ray email: amieray@exiand.com phone:+1 (853) 508-3649 address:878 Kane Street, Derwood, Minnesota, 3826] map[id:b9842ab7-5053-48b4-a991-f5c63af8fb7e avatar:http://placehold.it/32x32 name:Hope Benton email: hopebenton@exiand.com phone:+1 (938) 542-2232 address:396 Osborn Street, Rowe, Massachusetts, 702] map[id:8f9f6d8d-d14e-4ddc-acb2-eb96d3c3d7a8 avatar:http://placehold.it/32x32 name:Janine Kidd email: janinekidd@exiand.com phone:+1 (877) 474-2633 address:173 Manhattan Court, Hall, Virginia, 7376] map[avatar:http://placehold.it/32x32 name:Kristen Yang email: kristenyang@exiand.com phone:+1 (862) 469-3446 address:203 Doughty Street, Westmoreland, Rhode Island, 849 id:210a6ae6-8227-4f26-a47c-448c400f26e9] map[name:Murray Sosa email: murraysosa@exiand.com phone:+1 (814) 549-2536 address:811 Kingsland Avenue, Shepardsville, Hawaii, 9117 id:05f4f6af-19af-4b76-9aa8-9352281cf7d9 avatar:http://placehold.it/32x32] map[phone:+1 (918) 476-2264 address:176 Underhill Avenue, Ebro, Washington, 8099 id:9d21268d-067c-4b16-a6cd-42d184c4c059 avatar:http://placehold.it/32x32 name:Paige Stanton email: paigestanton@exiand.com ] map[id:9946c19f-c226-4ff3-b578-57a249f8d0c7 avatar:http://placehold.it/32x32 name:Melisa Oconnor email: melisaoconnor@exiand.com phone:+1 (908) 429-3915 address:768 Wallabout Street, Cotopaxi, Florida, 3388] map[id:ee0b82cb-4990-428b-ba36-088287a404ba avatar:http://placehold.it/32x32 name:Monique Poole email: moniquepoole@exiand.com phone:+1 (925) 564-2690 address:232 Hubbard Place, Islandia, Michigan, 3722] ] By default, which json packet will decode when the type is not declared:
bool, for JSON booleans float64, for JSON numbers string, for JSON strings []interface{}, for JSON arrays map[string]interface{}, for JSON objects nil for JSON null Since each record is (in your example) a json object, you can claim each of them as map[string]interface{} like this:
for _, record := range view { log.Printf(" [===>] Record: %s", record) if rec, ok := record.(map[string]interface{}); ok { for key, val := range rec { log.Printf(" [========>] %s = %s", key, val) } } else { fmt.Printf("record not a map[string]interface{}: %v\n", record) } }