Пакет strings
не предоставляет вам такой функции, но на практике это редко требуется. Часто функция strings.Split()
используется для простого разделения строк на токены / части.
Но если вам это нужно: вы можете просто слайс a string
, что эффективно (копия не создается, результат делит память с исходным значением string
).
Так что эффективная функция, которую вы ищете, будет выглядеть так:
func Index(s, substr string, offset int) int {
if len(s) < offset {
return -1
}
if idx := strings.Index(s[offset:], substr); idx >= 0 {
return offset + idx
}
return -1
}
Пример использования:
s := "something.value=something=end"
index1 := strings.Index(s, "value=")
fmt.Println(index1) // prints 10
index2 := Index(s, "=", index1+len("value="))
fmt.Println(index2) // prints 25
Вывод (попробуйте на Go Playground ):
10
25
Обратите внимание, что при разрезании строки и offset
вы должны передать нашей функции Index()
байтовый индекс, а не rune
(символьный) индекс. Они равны до тех пор, пока у вас есть символы с менее чем 128
кодовыми точками, но помимо этого индекс байтов будет больше, чем индекс rune
, потому что эти кодовые точки отображаются в несколько байтов в кодировке UTF-8 (то есть, как хранит Go Строки в памяти). strings.Index()
возвращает вам байтовый индекс, а len(s)
также возвращает вам байтовую длину, поэтому пример будет работать со всеми строками должным образом.
Ваша исходная задача с использованием strings.Split()
может выглядеть так:
s := "something.value=something=end"
parts := strings.Split(s, "=")
fmt.Println(parts)
Какие выходы (попробуйте на Go Playground ):
[something.value something end]
Значение, которое вы хотите проанализировать, находится в parts[1]
.