Учитывая, что вы делаете проверку длины, я собираюсь предположить, что они 1: 1, просто упорядочены по-разному.
Вы можете сделать это за один проход (каждый)используя map[string]bool
, чтобы проверить существование в обоих.При этом используется тот факт, что map
возвращает нулевое значение bool
, то есть false
, когда ключ отсутствует.
Отказ от ответственности: Технически это порядокO (N) * O (карта). Спецификация языка программирования Go не дает никаких гарантий производительности для типов карт.
https://play.golang.org/p/2LUjN5LkXLL
func unorderedEqual(first, second []string) bool {
if len(first) != len(second) {
return false
}
exists := make(map[string]bool)
for _, value := range first {
exists[value] = true
}
for _, value := range second {
if !exists[value] {
return false
}
}
return true
}
Если вы хотите немного разборчивы в использовании памяти, вы можете сэкономить, храня кучу bool
с (что обычно незначительно, но каждому свое), используя map[string]struct{}
(пустую структуру), и вы просто проверяете существование немного по-другому, как в этом примере
https://play.golang.org/p/MjwP_wCtYZV
Набор
exists[value] = struct{}{}
Чек
if _, ok := exists[value]; !ok {
return false
}