Golang (новичок): избегание дублирования функций для работы со строками или целыми числами

#go

#Вперед

Вопрос:

Я начал изучать Go сегодня, так что это может быть глупый вопрос. Я привык к PHP, в котором мне не нужно объявлять типы переменных.

В настоящее время я конвертирую некоторые из моих часто используемых функций PHP в функции Go. У меня есть функция, которая преобразует массив в хеш-таблицу для быстрого поиска позже (намного быстрее, чем перебирать массив, чтобы увидеть, существует ли значение, вместо этого значения становятся ключами.)

Мне кажется, что мне нужно создать две отдельные функции, одну для строк и одну для целых чисел ( uint поскольку мне не нужны целые числа со знаком). Ради обслуживания я бы предпочел иметь одну функцию, которая может принимать либо string или uint и возвращать то же самое, т. Е. Она работает и возвращает все, что я первоначально передал функции.

В настоящее время у меня есть это:

 //  Array2Map_string makes a map out of an array of strings: word=>false
func Array2Map_string(a []string) map[string]bool {
    mc := make(map[string]bool)
    for _,tok := range a {
         mc[tok]=false
        }
    return mc
}

//  Array2Map_int makes a map out of an array of integers: int=>false
func Array2Map_int(a []uint) map[uint]bool {
    mc := make(map[uint]bool)
    for _,tok := range a {
         mc[tok]=false
        }
    return mc
}
  

Я хотел бы иметь единственную функцию, которая создаст и вернет хэш-таблицу на основе строк, если я отправлю массив строк в функцию, или хэш-таблицу на основе uint, если я отправлю массив uint в функцию. Пример:

 //  Array2Map makes a map out of an array of strings whereby the key is
func Array2Map(a []whatever) map[whatever]bool {
    mc := make(map[whatever]bool)
    for _,tok := range a {
         mc[tok]=false
        }
    return mc
}
  

Возможно ли это?

Комментарии:

1. Короткий ответ: golang.org/doc/effective_go.html#interface_conversions — и назовите это SliceToMap , потому что []uint или []string — это срез в Go. Ваша функция примет интерфейс {}, введите его assert , создайте новую карту и измените ее на старую, чтобы скопировать каждое значение в новое, прежде чем возвращать новую карту в качестве интерфейса {}. Вызывающему абоненту необходимо будет ввести assert the map перед проверкой ключей.

2. Похоже, это может быть сложнее, чем просто использовать две отдельные функции.

3. Ознакомьтесь с проектом gen для получения идей, чтобы сделать это менее болезненным, если вам нужно больше, чем два.

Ответ №1:

Дженериков в Go пока не существует (хотя об этом много говорят. На данный момент я думаю, что ваше текущее направление — ваш единственный вариант.