2016-02-26 40 views
5

A = B & C = D & E = F gibi bir dizgim var, onu golang'da nasıl ayrıştırmalıyım? İşteHaritaya dizgi ayrıştırma Golang

Java üzerinde örnektir ama

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

Gerçekten istediğiniz şeyi düşünüyorum: ['url.ParseQuery'] (https://golang.org/pkg/net/url/#ParseQuery). – twotwotwo

cevap

5

Belki gerçekten bulmak istediğiniz bir HTTP sorgu dizesi ayrıştırmak için bu split part anlamıyorum ve url.ParseQuery bunu yapmaz. (Ne de olsa, her anahtar için url.Values bir url.Values saklamaktır, çünkü URL'ler bazen anahtar başına birden fazla değere sahiptir.) Ayrıştırma yapmadan HTML ayrıştırması (%0A, vb.) Gibi şeyler yapar. Uygulamanızı the source of url.go numaralı telefondan arıyorsanız bulabilirsiniz.

  • map[string]string ait Go analog şudur: yapmak eğer

    Ancak gerçekten bu Java kodu yaptığı gibi, orada kavram ve orada tüm araçları için Git analoglarıdır sadece & ve = üzerinde bölmek istediğiniz Map<String, String>

  • strings.Split sizin için &'a bölünebilir. SplitN, Java'da split()'un iki argümanlı sürümüne bölünmüş parça sayısını sınırlar. Sadece tek bir parça olabileceğini unutmayın, bu nedenle pieces[1] numarasına erişmeye çalışmadan önce len(pieces)'u kontrol etmelisiniz.
  • for _, piece := range pieces, ayırdığınız parçaları yineleyecektir.
  • Java kodu, boşlukları kesmek için normal ifadelere dayanıyor gibi görünüyor. Go's Split bunları kullanmaz, ancak strings.TrimSpace istediğiniz gibi bir şey yapmaz (özellikle her iki taraftaki Unicode boşluğunu keser).

Asıl uygulamayı size bırakıyorum, ancak belki de bu işaretçiler başlamanıza neden olabilir.

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

Bu sizin istediğiniz şeyi yapacak.

+0

Orijinal Java'dan birkaç farklılık: 1) bu, bir öğe eksik olduğunda aralığın indeksiyle kilitlenecektir '=', 2) bu, sınırlayıcıların etrafındaki boşlukları kesmez, 3) '=' in Değer kısmı düştü. Aynı şey yerine benzer bir şey yapmak güzel, sadece tüm ayıların dikkatini çeker (özellikle çarpışma). – twotwotwo