Проверка палиндрома с помощью дженериков в Go 1.18

Проверка палиндрома с помощью дженериков в 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).



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE