Solución:
La notación x.(T)
se llama una afirmación de tipo.
Por una expresión
x
de tipo de interfaz y un tipoT
, la expresión principalx.(T)
afirma quex
no esnil
y que el valor almacenado enx
es de tipoT
.
Tu ejemplo:
result["args"].(map[string]interface{})["foo"]
Significa que el valor de tu results
mapa asociado con la clave "args"
es de tipo map[string]interface{}
(otro mapa con string
claves y cualquier valor). Y desea acceder al elemento de ese mapa asociado con la clave "foo"
.
Si conoce el formato JSON de entrada, entonces sí, debe usar un genérico map[string]interface{}
escriba para procesarlo. Si conoce la estructura exacta del JSON de entrada, puede crear un struct
para que coincida con los campos esperados, y al hacerlo, puede desarmar un texto JSON en un valor de su personalizado struct
tipo, por ejemplo:
type Point struct {
Name string
X, Y int
}
func main() {
in := `{"Name":"center","X":2,"Y":3}`
pt := Point{}
json.Unmarshal([]byte(in), &pt)
fmt.Printf("Result: %+v", pt)
}
Producción:
Result: {Name:center X:2 Y:3}
Pruébelo en Go Playground.
Modelando su entrada
Su entrada JSON actual podría modelarse con este tipo:
type Data struct {
Args struct {
Foo string
}
}
Y accediendo Foo
(pruébalo en Go Playground):
d := Data{}
json.Unmarshal([]byte(in), &d)
fmt.Println("Foo:", d.Args.Foo)