# #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
Комментарии:
1. На самом деле результат все равно не соответствует моим требованиям. Значение ключевого «бара» должно быть » 2amp;», а не только «2».
2. Обновленный ответ для ясности о том, как работает кодирование URL-адресов, экранирование и синтаксический анализ,