我有一个像A = B& C = D& E = F的字符串,如何在golang中将其解析为地图?
这是关于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]);
}
答案 0 :(得分:8)
也许您真正想要的是解析HTTP查询字符串,而url.ParseQuery
就是这样做的。 (更确切地说,它返回的是url.Values
为每个键存储[]string
,因为URL有时每个键有多个值。)它执行解析HTML转义({{1}只是拆分不会。如果您在the source of url.go
中搜索,可以找到它的实现。
但是,如果你做真的想要像{J}那样分开%0A
和&
,那么那里有所有概念和工具的Go类似物:
map[string]string
是Go的模拟=
strings.Split
可以为您分割Map<String, String>
。 SplitN
限制分割成的片段数,就像Java中的&
的双参数版本一样。请注意,可能只有一个部分,因此您应该在尝试访问split()
之前检查len(pieces)
。for _, piece := range pieces
将迭代您分割的部分。pieces[1]
不使用它们,但strings.TrimSpace
做了类似你想要的东西(具体来说,从两边剥离各种Unicode空格)。我将离开实际的实现给你,但也许这些指针可以让你开始。
答案 1 :(得分: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]
}
这将做你想要的。
答案 2 :(得分:1)
golang net/url
软件包本身提供了一种非常简单的方法。
更改您的字符串以使其成为带有查询参数text := "method://abc.xyz/A=B&C=D&E=F";
的url
现在只需将此字符串传递给Parse
提供的net/url
函数。
import (
netURL "net/url"
)
u, err := netURL.Parse(textURL)
if err != nil {
log.Fatal(err)
}
现在u.Query()
将返回一个包含查询参数的地图。这也适用于复杂类型。
答案 3 :(得分: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]]
}
}