Как разделить строку разделителем в Golang

# #go #split

Вопрос:

Я хочу разделить строку разделителем, и результатом должен быть срез.

Например:

Данная строка может быть такой:

  foo := "foo=1amp;bar=2amp;amp;a=8"
 

Результат должен быть таким

  result := []string{
    "foo=1",
    "bar=2amp;",
    "a=8"
}
 

Я имею в виду, что я могу использовать strings.split(foo, "amp;") для разделения, но результат не соответствует моим требованиям.

  // the result with strings.split()
 result := []string{
    "foo=1",
    "bar=2",
    "",
    "a=8"
}
 

Комментарии:

1. если вы действительно хотите bar=2amp; — символ amp; нужно будет экранировать перед обработкой, так как он соответствует разделителю. В URL-запросе он будет представлен в виде &

2. Как упоминал @colm.anseo, задачи, которую вы хотите решить, обычно не существует. Если символ-разделитель может быть частью данных, его необходимо экранировать. Иначе даже не очевидно, где оно должно находиться: оно может быть проанализировано либо как bar=2amp; a=8 , либо bar=2 как amp;a=8 .

Ответ №1:

Почему бы не использовать url.ParseQuery. Если вам нужно, чтобы специальные символы, такие как amp; (который является разделителем), не рассматривались как таковые, то их необходимо экранировать ( & ):

 //m, err := url.ParseQuery("foo=1amp;bar=2amp;amp;a=8")
m, err := url.ParseQuery("foo=1amp;bar=2&a=8") // escape bar's amp; as &


fmt.Println(m) // map[a:[8] bar:[2amp;] foo:[1]]
 

https://play.golang.org/p/zG3NEL70HxE


Вы обычно кодируете параметры по URL-адресу следующим образом:

 q := url.Values{}

q.Add("foo", "1")
q.Add("bar", "2amp;")
q.Add("a", "8")

fmt.Println(q.Encode()) // a=8amp;bar=2&foo=1
 

https://play.golang.org/p/hSdiLtgVj7m

Комментарии:

1. На самом деле результат все равно не соответствует моим требованиям. Значение ключевого «бара» должно быть » 2amp;», а не только «2».

2. Обновленный ответ для ясности о том, как работает кодирование URL-адресов, экранирование и синтаксический анализ,