Наиболее эффективным, вероятно, будет итерация по срезу и добавление, если вы его не найдете.
func AppendIfMissing(slice []int, i int) []int {
for _, ele := range slice {
if ele == i {
return slice
}
}
return append(slice, i)
}
Это просто и очевидно и быстро для небольших списков.
Кроме того, это всегда будет быстрее, чем ваше текущее решение на основе карт.Основанное на карте решение перебирает весь срез независимо от того, что;это решение немедленно возвращается, когда обнаруживает, что новое значение уже присутствует.Оба решения сравнивают элементы по мере их повторения.(Каждый оператор присваивания карты, безусловно, выполняет по крайней мере одно внутреннее сравнение ключей карты.) Карта была бы полезна, только если вы могли бы поддерживать ее во многих вставках.Если вы перестраиваете его при каждой вставке, все преимущества теряются.
Если вам действительно нужно эффективно обрабатывать большие списки, рассмотрите возможность сохранения списков в отсортированном порядке.(Я подозреваю, что порядок не имеет значения для вас, потому что ваше первое решение добавляется в начале списка, а ваше последнее решение добавляется в конце.) Если вы всегда сохраняете списки отсортированными, то вы можете использовать функцию sort.Search дляделать эффективные двоичные вставки.