Je suis relativement nouveau en golang, et je voulais créer un moyen d'appeler simultanément plusieurs URL et de parser les documents JSON. Cependant, je ne suis pas sûr si j'utilise correctement les go routines et les channels. À ce stade, je ne sais pas si je ne "pense pas en Go" correctement ou si ma compréhension/approche des go routines et des channels n'est pas précise.
De plus, lors du parsing, je souhaite parser la propriété results
du corps, qui est un tableau, et chaque élément dans results
contient une propriété doc
que je souhaite filtrer.
L'objectif est d'effectuer plusieurs fetches, simultanément et de parser les réponses pour obtenir uniquement la propriété doc
à l'intérieur d'un tableau de résultats de corps.
J'apprécierais certainement tout aperçu ou suggestion pour mieux comprendre les choses. Merci d'avance.
package operations
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
)
// CouchbaseDoc analyse la propriété .doc des documents sync gateway
type CouchbaseDoc struct {
Doc map[string]string `json:"doc"`
}
// Results décompose... results est une propriété de body, et est un tableau d'objets
type Results struct {
Results []byte `json:"results"`
}
func createURLs(channels []string) map[string]string {
urlMap := make(map[string]string)
domain := "swap" + strings.TrimSpace(os.Getenv("env"))
bucket := strings.TrimSpace(os.Getenv("bucket"))
for _, doctype := range channels {
urlMap[doctype] = fmt.Sprintf("https://%s.endpoint.com/%s/_changes?filter=sync_gateway/bychannel&channels=%s&include_docs=true", domain, bucket, doctype)
}
return urlMap
}
func getChangesFeed(url string, ch chan map[string]string) {
resp, _ := http.Get(url)
body, _ := ioutil.ReadAll(resp.Body)
go parseBody(body, ch)
}
func parseBody(body []byte, ch chan map[string]string) {
var results Results
var doc CouchbaseDoc
json.Unmarshal(body, &results)
json.Unmarshal(results.Results, &doc)
// écrire vers les réponses
ch <- doc.Doc
}
func fetchDocs(channels []string) {
urls := createURLs(channels)
// Le channel de réponse est l'endroit où toutes les go routines feront le travail
responses := make(chan map[string]string)
for _, url := range urls {
go getChangesFeed(url, responses)
}
// Lire du channel des réponses
docs := <-responses
for doc := range docs {
fmt.Println(doc) // Cela devrait afficher les résultats ??
}
}