Как показывает ответ ishaan , вы можете назначить data
другой переменной среза для каждого поиска, а затем повторно вставлять эту переменную после каждого соответствия.Назначение копирует только длину, емкость и указатель.Изменение только изменяет длину и указатель на переменную слайса: это не повлияет на базовый массив и не является новым распределением.Я добавил этот ответ, чтобы прояснить эффективность использования памяти и продемонстрировать, что вы все еще можете использовать bytes.Index
и использовать его в качестве отправной точки и инкремента в традиционном цикле for:
package main
import (
"bytes"
"fmt"
)
func findAllOccurrences(data []byte, searches []string) map[string][]int {
results := make(map[string][]int)
for _, search := range searches {
searchData := data
term := []byte(search)
for x, d := bytes.Index(searchData, term), 0; x > -1; x, d = bytes.Index(searchData, term), d+x+1 {
results[search] = append(results[search], x+d)
searchData = searchData[x+1 : len(searchData)]
}
}
return results
}
func main() {
fmt.Println(findAllOccurrences([]byte(`foo foo hey foo`), []string{`foo`, `hey`, ` `}))
}
print
map[foo:[0 4 12] hey:[8] :[3 7 11]]