strings.Contains()
сообщает, содержится ли в строке подстрока.Он не проверяет границы слов, поэтому ожидаемое поведение ожидается.
Вместо этого вам нужно распознавать каждое слово как слово.Уже есть функция strings.Fields()
для разделения текста по пробелам.Простая реализация может выглядеть так:
func main() {
source := `
hello
world
kingdom
foo
`
check := "gdo"
words := strings.Fields(strings.ToLower(source))
for _, w := range words {
if w == check {
fmt.Println("found", check)
break
}
}
}
Я использовал strings.Fields()
, потому что я не знаю содержимого вашего words.txt
файла.Вы также можете использовать strings.Split()
, если вы знаете, что разделитель всегда представляет собой одну новую строку или один пробел.
Это будет медленным, если вы выполняете много поисков, так как он зацикливается на массиве words
для каждого поиска.Более быстрый метод - сохранить его на карте:
func main() {
source := `
hello
world
kingdom
foo
`
check := "gdo"
words := make(map[string]struct{})
for _, w := range strings.Fields(strings.ToLower(source)) {
words[w] = struct{}{}
}
_, ok := words[check]
if ok {
fmt.Println("found", check)
}
}
Если вы выполняете только один поиск, первый метод будет быстрее (так как этот метод карты всегда должен будет зацикливать весь массив вхотя бы один раз для построения карты).
Я использовал несколько странно выглядящую пустую структуру для значения карты, поскольку это не выделяет никакой памяти (words[w] = true
будет).