2016-02-26 21 views
5

Ho una stringa come A = B & C = D & E = F, come analizzare la mappa in golang?Analizza stringa nella mappa Golang

Ecco ad esempio su Java, ma non capisco questa parte split

String text = "A=B&C=D&E=F"; 
Map<String, String> map = new LinkedHashMap<String, String>(); 
for(String keyValue : text.split(" *& *")) { 
    String[] pairs = keyValue.split(" *= *", 2); 
    map.put(pairs[0], pairs.length == 1 ? "" : pairs[1]); 
} 
+1

Penso che quello che vuoi veramente sia ['url.ParseQuery'] (https://golang.org/pkg/net/url/#ParseQuery). – twotwotwo

risposta

5

Forse quello che si vuole veramente è quello di analizzare una stringa di query HTTP, e url.ParseQuery fa. (Quello che restituisce è, più precisamente, un url.Values che memorizza un []string per ogni chiave, poiché gli URL a volte hanno più di un valore per chiave.) Fa cose come l'escape di HTML (%0A, ecc.) Che solo la divisione non fa. Puoi trovare la sua implementazione se cerchi in the source of url.go.

Tuttavia, se si fai vuole veramente solo dividere il & e = del genere il codice Java ha fatto, ci sono analoghi Go per tutti i concetti e strumenti di là:

  • map[string]string è analogico di Go di Map<String, String>
  • strings.Split può essere diviso per & per voi. SplitN limita il numero di pezzi suddivisi in come la versione a due argomenti di split() in Java. Si noti che potrebbe esserci solo un pezzo quindi è necessario controllare len(pieces) prima di provare ad accedere a pieces[1] dire.
  • for _, piece := range pieces itererà i pezzi che hai diviso.
  • Il codice Java sembra fare affidamento sulle regex per tagliare gli spazi. Go's Split non li usa, ma strings.TrimSpace fa qualcosa di simile a quello che vuoi (in particolare, elimina tutti i tipi di spazi bianchi Unicode da entrambi i lati).

Lascio l'implementazione effettiva a voi, ma forse questi suggerimenti possono farvi iniziare.

5
import ("strings") 

var m map[string]string 
var ss []string 

s := "A=B&C=D&E=F" 
ss = strings.Split(s, "&") 
m = make(map[string]string) 
for _, pair := range ss { 
    z := strings.Split(pair, "=") 
    m[z[0]] = z[1] 
} 

Questo farà quello che vuoi.

+0

Alcune differenze rispetto al Java originale: 1) questo si bloccherà con l'indice fuori intervallo quando a un elemento manca un '=', 2) questo non elimina gli spazi attorno ai delimitatori, 3) nulla dopo un '=' in la parte del valore è stata eliminata. Va bene fare qualcosa di simile piuttosto che identico, solo tutti gli orsi notano (specialmente l'incidente). – twotwotwo