
Проверка палиндрома с помощью дженериков в Go 1.18
27 апреля 2022 г.Прочитав несколько статей и просмотрев несколько видеороликов об дженериках в Go 1.18, я заинтересовался их использованием для создания функции проверки палиндрома, которая может принимать как строки, так и целые числа.
Сначала я создал новый проект под названием палиндром и новый пакет (также называемый палиндром). Затем я создал ограничения с именем signedOrString , которые могут принимать подписанные (int, int8, int16, int32 и int64) или строки. Далее я создал функцию для проверки палиндром это или нет.
```иди
введите интерфейс signedOrString {
ограничения. Подписано | нить
func palindrome [input signedOrString] (sliceInput [] input) bool {
длина: = длина (sliceInput)
для i:=0;i<длина/2;i++{
если sliceInput[i] != sliceInput[длина-1-i] {
вернуть ложь
вернуть истину
Это действительно хорошая функция, потому что нам не нужно заново создавать функции, которые делают одно и то же для каждого типа данных.
Затем я хочу обновить функцию проверки палиндрома непосредственно из слова или числа, а не из среза. Я снова попытался использовать функцию дженериков и на этот раз споткнулся, потому что, когда мы вводим строку типа в функцию, мы можем использовать встроенную функцию разделения, чтобы преобразовать ее в срез, тогда как для преобразования целого типа в срез нам нужно создать нашу собственную функцию. .
Как мы можем отличить поток между строкой и подписанным (целым числом)?
У меня возникла идея преобразовать его в тип interface{} , а затем разделить поток функцией switch. Давайте посмотрим на код.
```иди
func IsPalindromeinput signedOrString bool {
return func (toInterface interface {}) bool {
var sliceInt []int
переключатель newType := toInterface.(type){
строка случая:
вернуть палиндром (strings.Split (newType, ""))
случай инт:
sliceInt = sliceInteger (новый тип)
случай int8:
sliceInt = sliceInteger (новый тип)
случай int16:
sliceInt = sliceInteger (новый тип)
случай int32:
sliceInt = sliceInteger (новый тип)
случай int64:
sliceInt = sliceInteger (новый тип)
вернуть палиндром (sliceInt)
}(первый ввод)
func sliceIntegerсо знаком ограничения.Signed (slice []int) {
для ввода > 0 {
срез = добавить (срез, int (вход% 10))
ввод/=10
возврат
Функция sliceInteger для преобразования любого знакового (целого) значения в целое число среза по-прежнему является хорошей практикой для использования дженериков, но для функции IsPalindrome дженерики не предназначены для выполнения таких задач.
После этого мы можем вызвать функцию IsPalindrome из main.go и проверить, является ли входная переменная палиндромом или нет.
```иди
основной пакет
импорт (
"ФМТ"
"палиндром/палиндром"
основная функция () {
fmt.Println(palindrome.IsPalindrome("AAAB")) // false
fmt.Println(palindrome.IsPalindrome("ABABA")) // true
fmt.Println(palindrome.IsPalindrome(10001)) // правда
fmt.Println(palindrome.IsPalindrome(10110)) // ложь
Вывод
Go 1.18 Generics удобен для создания функции, которая имеет точно такой же поток независимо от типа ввода, например функции palindrome и sliceInteger выше.
Функция ForIsPalindrome – другие разработчики, вызывающие эту функцию, считают, что ее можно вводить только с использованием строкового или знакового (целочисленного) типа.
Я надеюсь, что некоторые из вас найдут это полезным. Если вам интересно увидеть весь исходный код, вы можете найти его на https://github.com/yudaph/palindrome.
Благодарю вас!
Также опубликовано [здесь] (https://medium.com/@yudaph/palindrome-using-generics-in-go-1-18-715496e8deff).
Оригинал