将字符串解析为map(地图) Golang

9
我有一个像A=B&C=D&E=F的字符串,如何在golang中将其解析为map?
这里有一个Java的示例,但我不理解这个“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]);
}

2
我认为你真正想要的是url.ParseQuery - twotwotwo
4个回答

11
也许你真正想要的是解析HTTP查询字符串,url.ParseQuery可以做到这一点。更确切地说,它返回一个url.Values,为每个键存储一个[]string,因为URL有时会有多个值对应一个键。它还可以解析HTML转义字符(例如%0A等),这是普通分割方法所做不到的。如果需要,您可以在url.go的源代码中找到它的实现
然而,如果你确实只想像那个Java代码一样简单地按&=进行分割,Go有与其中所有概念和工具相仿的东西:
  • map[string]string是Go中Map<String, String>的相似物。
  • strings.Split可以帮你按&进行分割。SplitN就像Java的两个参数版本的split()一样,可以限制分割成的片段数量。请注意有时可能只有一个片段,因此您应该在尝试访问pieces[1]之前检查len(pieces)
  • for _, piece := range pieces将遍历分割出的片段。
  • 这段Java代码似乎依赖于正则表达式来修剪空格。Go的Split没有使用它们,但是strings.TrimSpace会执行类似你想要的操作(具体地,从两端剥离各种Unicode空白字符)。
  • 我将实际的实现留给您,但也许这些提示可以帮助您入手。


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

    这将完成您想要的功能。

    1
    与原始Java有一些不同:1)当项目缺少=时,这将崩溃并显示索引超出范围,2)它不会去除定界符周围的空格,3)值部分中=后面的任何内容都将被删除。可以做类似的事情而不是完全相同,但需要注意所有细节(特别是崩溃)。 - twotwotwo

    0

    golang的net/url包提供了一种非常简单的方法。

    将您的字符串更改为带有查询参数的url text := "method://abc.xyz/A=B&C=D&E=F";

    现在只需将此字符串传递给net/url提供的Parse函数即可。

    import (
        netURL "net/url"
    )
    

    u, err := netURL.Parse(textURL)
            if err != nil {
                log.Fatal(err)
            }
    

    现在,u.Query()将返回一个包含查询参数的映射。这也适用于复杂类型。

    0

    这里是几种方法的演示:

    package main
    
    import (
       "fmt"
       "net/url"
    )
    
    func main() {
       {
          q, e := url.ParseQuery("west=left&east=right")
          if e != nil {
             panic(e)
          }
          fmt.Println(q) // map[east:[right] west:[left]]
       }
       {
          u := url.URL{RawQuery: "west=left&east=right"}
          q := u.Query()
          fmt.Println(q) // map[east:[right] west:[left]]
       }
    }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接