Без итерации по всему массиву, как я могу проверить, если x
в массиве с помощью Go? У языка есть конструкция?
Как и Python: if "x" in array: ...
Без итерации по всему массиву, как я могу проверить, если x
в массиве с помощью Go? У языка есть конструкция?
Как и Python: if "x" in array: ...
strings.Index
) помогает сделать более понятным, что делает код. У меня создается впечатление, что, возможно, вы думаете, что Pythonin array:
делает что-то быстрое / волшебное. AFAIK это не так. Явное создание цикла помогает автору (и всем читателям) осознать и рассмотреть другие реализации (например, карту).Ответы:
В Go нет встроенного оператора для этого. Вам нужно перебрать массив. Вы можете написать свою собственную функцию, например:
Если вы хотите иметь возможность проверять членство без перебора всего списка, вам нужно использовать карту вместо массива или среза, например так:
источник
Другое решение, если список содержит статические значения.
Например: проверка допустимого значения из списка допустимых значений:
источник
Это цитата из книги «Программирование на ходу: создание приложений для 21-го века»:
https://play.golang.org/p/UIndYQ8FeW
источник
n*log(n) + log(n)
, так как это две последовательные независимые операцииПриведенный выше пример использования sort близок, но в случае строк просто используйте SearchString:
https://golang.org/pkg/sort/#SearchStrings
источник
sort.SearchStrings
.Просто у меня был похожий вопрос, и он решил попробовать некоторые из предложений в этой теме.
Я сравнил лучшие и худшие сценарии 3 типов поиска:
вот код функции:
в лучших случаях выбирают первый элемент в списках, в худших - несуществующее значение.
Вот результаты:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Переключатель выигрывает до конца, в худшем случае это намного быстрее, чем в лучшем случае. Карты являются худшими, и список ближе к переключению.
Итак, мораль такова: если у вас есть статичный, достаточно небольшой список, оператор switch - это путь.
источник
:
вместо вместо,
в выражении switch? Это делает это быстрее?case
утверждений вместо одного случая. Результаты практически одинаковы для обеих функций.Другой вариант - использовать карту как набор. Вы используете только ключи, и значение имеет что-то вроде логического значения, которое всегда верно. Тогда вы можете легко проверить, содержит ли карта ключ или нет. Это полезно, если вам нужно поведение набора, где, если вы добавляете значение несколько раз, оно входит в набор только один раз.
Вот простой пример, где я добавляю случайные числа в качестве ключей к карте. Если одно и то же число генерируется более одного раза, это не имеет значения, оно появится на итоговой карте только один раз. Затем я использую простую проверку, чтобы увидеть, есть ли ключ на карте или нет.
Вот она на ходу детская площадка
источник
Это как можно ближе к естественному ощущению оператора «in» в Python. Вы должны определить свой собственный тип. Затем вы можете расширить функциональность этого типа, добавив метод типа has, который ведет себя так, как вы надеетесь.
У меня есть служебная библиотека, в которой я определяю несколько общих вещей, подобных этой, для нескольких типов срезов, например, содержащих целые числа или другие мои собственные структуры.
Да, он работает за линейное время, но это не главное. Суть в том, чтобы спросить и узнать, какие общие языковые конструкции есть и нет у Go. Это хорошее упражнение. Является ли этот ответ глупым или полезным, зависит от читателя.
источник