Se você veio já criou um ou usou algum webservice baseado em REST, sabe a importância de trabalhar com JSON. Não há mistério algum neste formato de dados, se você tem alguma dúvida ou não conhece bem. Recomendo dar uma olhada neste link: Mozilla Glossary.
A forma de trabalhar com esses dados muda de acordo com a linguagem. Em Javascript é tão natural ler um JSON, que você pode interpretar o JSON como objeto sem nenhum esforço. Em Python e Ruby também não há muitas dificuldades. Mas em GoLang a forma de trabalhar com essa notação é um pouco diferente.
Vamos lá!
Primeiro, vamos levantar um server em Go para gerar os dados em JSON. Uma simples rota com uma resposta estática de um JSON deve bastar:
package main
import (
    "net/http"
)
func Desenvolvedores(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    jsonStr := `[{"Nome":"Raphael","Idade":19,"Especialidade":"JavaScript"},
                {"Nome":"Gabriel","Idade":24,"Especialidade":"GoLang"},
                {"Name":"Marco","Idade":23,"Especialidade":"BitCoin"}]`
    w.Write([]byte(jsonStr))
}
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/devs", Desenvolvedores)
    http.ListenAndServe(":5000", mux)
}
Dê um build e rode o programa em background.
Abra seu navegador em ‘127.0.0.1:5000/devs’ e deve retornar:
[ 
  {Nome: "Raphael",Idade: 19, Especialidade: "JavaScript"},
  {Nome: "Gabriel", Idade: 24, Especialidade: "GoLang"}, 
  {Name: "Marco", Idade: 23, Especialidade: "BitCoin"}
]
Agora vamos escrever um client que faça um request dos dados em JSON e converta isso em uma struct:
package main
import (
   "encoding/json"
   "fmt"
   "io/ioutil"
   "net/http"
)
type Desenvolvedor struct {
   Nome string
   Idade int
   Especialidade string
}
func main() {
   // A url irá retornar:
   // [ 
   //   {Nome: "Raphael",Idade: 19, Especialidade: "JavaScript"},
   //   {Nome: "Gabriel", Idade: 24, Especialidade: "GoLang"}, 
   //   {Name: "Marco", Idade: 23, Especialidade: "BitCoin"}
   // ]
   url := "http://127.0.0.1:5000/devs"
   
   response, erro := http.Get(url)
   if erro != nil {
      panic(erro)
   }
   // lendo o json do response do http request
   responseJson, erro := ioutil.ReadAll(response.Body)
   
   if erro != nil {
      panic(erro)
   }
   var dadosJson []Desenvolvedor
   erro = json.Unmarshal(responseJson, &dadosJson) // aqui acontece a magica!
   if erro != nil {
      panic(erro)
   }
   // testando a estrutura de dados
   fmt.Println(dadosJson)
}
Se tudo ir bem, quando executar o client.go você deve receber essa linha:
[{Raphael 19 JavaScript} {Gabriel 24 GoLang} { 23 BitCoin}]
Uma boa referência para projetos mais complexos e avançados é a documentação oficial dos pacotes de Json e http do Go. Esse artigo é baseado em um artigo da socketloop; “Golang : Unmarshal JSON from http response”.
Isso é tudo, galera! A ideia era mostrar como é fácil trabalhar com JSON em Go. Se você tiver qualquer crítica, dúvida ou sugestão sobre o artigo ou a aplicação do código, será bastante bem vinda.



