Sorry to keep revising, but I've managed to come up with an example with all the cruft taken out:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type Foo struct {
Bar string
Baz string
}
func main() {
f := Foo{"Hello", "World"}
result, err := json.Marshal(f)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(result))
// create a Foo directly
dir := Foo{}
// create a Foo via reflect
t := reflect.TypeOf(f)
ref := reflect.New(t).Elem().Interface()
fmt.Printf("Direct before unmarshal type: %v, kind: %v, value: %v\n", reflect.TypeOf(dir), reflect.TypeOf(dir).Kind(), dir)
fmt.Printf("Reflect before unmarshal type: %v, kind: %v, value: %v\n", reflect.TypeOf(ref), reflect.TypeOf(ref).Kind(), dir)
err = json.Unmarshal(result, &dir)
if err != nil {
fmt.Println(err)
}
err = json.Unmarshal(result, &ref)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Direct after unmarshal type: %v, kind: %v, value: %v\n", reflect.TypeOf(dir), reflect.TypeOf(dir).Kind(), dir)
fmt.Printf("Reflect after unmarshal type: %v, kind: %v, value: %v\n", reflect.TypeOf(ref), reflect.TypeOf(ref).Kind(), dir)