Parse string into map Golang
Solution 1
Maybe what you really want is to parse an HTTP query string, and url.ParseQuery
does that. (What it returns is, more precisely, a url.Values
storing a []string
for every key, since URLs sometimes have more than one value per key.) It does things like parse HTML escapes (%0A
, etc.) that just splitting doesn't. You can find its implementation if you search in the source of url.go
.
However, if you do really want to just split on &
and =
like that Java code did, there are Go analogues for all of the concepts and tools there:
-
map[string]string
is Go's analog ofMap<String, String>
-
strings.Split
can split on&
for you.SplitN
limits the number of pieces split into like the two-argument version ofsplit()
in Java does. Note that there might only be one piece so you should checklen(pieces)
before trying to accesspieces[1]
say. -
for _, piece := range pieces
will iterate the pieces you split. - The Java code seems to rely on regexes to trim spaces. Go's
Split
doesn't use them, butstrings.TrimSpace
does something like what you want (specifically, strips all sorts of Unicode whitespace from both sides).
I'm leaving the actual implementation to you, but perhaps these pointers can get you started.
Solution 2
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]
}
This will do what you want.
Admin
Updated on July 23, 2022Comments
-
Admin almost 2 years
I have a string like A=B&C=D&E=F, how to parse it into map in golang?
Here is example on Java, but I don't understand this
split
partString 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]); }
-
twotwotwo about 8 yearsA few differences from the original Java: 1) this will crash with index out of range when an item is missing a
=
, 2) this doesn't strip spaces around the delimiters, 3) anything after an=
in the value part is dropped. Fine to do something similar rather than identical, just all bears noting (especially the crash).