2016-02-26 27 views
5

Mam ciąg jak A = B & C = D & E = F, jak przeanalizować go na mapie w golang?Parse string na mapę Golang

Oto przykład na Javie, ale ja tego nie rozumiem split part

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

Myślę, że to, czego naprawdę chcesz, to ['url.ParseQuery'] (https://golang.org/pkg/net/url/#ParseQuery). – twotwotwo

Odpowiedz

5

Może to, czego naprawdę chcę to do analizowania ciąg zapytań HTTP i url.ParseQuery robi. (To, co zwraca, to dokładniej: url.Values przechowywanie []string dla każdego klucza, ponieważ adresy URL mają czasami więcej niż jedną wartość na klucz.) Robi to, jak parsowanie ucieczek HTML (%0A, itp.), Które tylko dzielenie nie robi. Możesz znaleźć jego implementację, jeśli wyszukasz w the source of url.go.

Jednak jeśli zrobić naprawdę chcesz po prostu podzielić na & i = takiego kodu Java nie istnieje analogi Go dla wszystkich pojęć i narzędzi tam:

  • map[string]string jest analogowa Go od Map<String, String>
  • strings.Split może dla ciebie podzielić na &. SplitN ogranicza liczbę elementów podzielonych na takie, jakie ma wersja dwuargumentowa split() w języku Java. Zauważ, że może być tylko jedna część, więc powinieneś sprawdzić len(pieces) zanim spróbujesz uzyskać dostęp do pieces[1] powiedzieć.
  • for _, piece := range pieces będzie iterować podzielone kawałki.
  • Kod Java wydaje się opierać na wyrażeń regularnych, aby przyciąć spacje. Go to Split nie używa ich, ale strings.TrimSpace robi coś takiego, jak chcesz (w szczególności usuwa wszystkie rodzaje białych znaków Unicode z obu stron).

Zostawiam faktyczne wdrożenie, ale być może te wskazówki pomogą ci zacząć.

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] 
} 

To zrobi, co chcesz.

+0

Kilka różnic w stosunku do oryginalnej Javy: 1) nastąpi awaria z indeksem poza zakresem, gdy elementowi brakuje "=", 2) nie powoduje to usunięcia spacji wokół ograniczników, 3) niczego po "=" w część wartości została usunięta. W porządku, aby zrobić coś podobnego, a nie identyczne, po prostu zauważają wszystkie niedźwiedzie (zwłaszcza katastrofa). – twotwotwo