Примери за интерфейси на Golang

Primeri Za Interfejsi Na Golang



В Go набор от сигнатури на методи включва интерфейс. Той определя група от действия, които типът трябва да предприеме, за да бъде определен, за да изпълни този интерфейс. С други думи, интерфейсът определя методите, които даден тип трябва да има, но не предоставя информация за изпълнение. Въпреки това интерфейсите на Go предоставят мощен механизъм за постигане на полиморфно поведение и писане на код за многократна употреба. В тази публикация ще разгледаме идеята за интерфейси в Go и ще предложим примери от реалния свят, за да покажем как да ги използваме.

Пример 1: Празен интерфейс на Golang

Започнете с празния интерфейс {}, който се нарича интерфейс в Go. Той показва тип, който може да съхранява всякакъв вид стойност. Следното е изходният код за празния интерфейс в Go:

пакет основен
импортиране 'fmt'
Тип MarksCalculator интерфейс {}
функ основен () {
беше m Маркс Калкулатор
fmt . Println ( м )
}

Тук предоставяме кода, където интерфейсът „MarksCalculator“ няма определени сигнатури на метода, защото е празен. В резултат на това не предоставя никаква функционалност. След това имаме функцията main() на този празен интерфейс, където е декларирана променлива „m“ от тип MarksCalculator. Тъй като интерфейсът е празен, 'm' може да съдържа всяка стойност от всякакъв тип. В този случай „m“ е неинициализирано, така че има нулева стойност за своя тип, която е „нула“ за интерфейси. Когато „m“ се отпечата с помощта на „fmt.Println“, той извежда „nil“ на конзолата.







Резултатът, който се извлича, е „нула“, както се очаква от предишния изходен код:





Пример 2:  Имплементация на интерфейс на Golang

Този раздел демонстрира изпълнението на интерфейса Golang. Типът трябва да предложи изпълнението за всеки от посочените методи в интерфейс, за да го внедри в Go. По-долу е даден изходният код за реализацията на интерфейса:





пакет основен
импортиране (
'fmt'
)
Тип гласни интерфейс {
Търсене на гласни () [] руна
}
Тип MyStr низ
функ ( st MyStr ) Търсене на гласни () [] руна {
беше гласни [] руна
за _ , руна := диапазон ул {
ако руна == 'а' || руна == 'То е' || руна == 'аз' || руна == 'О' || руна == 'вътре' {
гласни = добавям ( гласни , руна )
}
}
връщане гласни
}

функ основен () {
NewString := MyStr ( „GoLang интерфейси“ )
беше v1 гласни
v1 = NewString
fmt . Printf ( „Гласните са %c“ , v1 . Търсене на гласни ())
}

Тук кодът дефинира интерфейс, наречен „Vowels“, който определя един метод SearchVowels(), който връща част от руната (тип int32). Интерфейсът позволява всеки тип, който прилага този подпис на метода, да бъде присвоен на променлива от типа интерфейс. След това се декларира нов тип „MyStr“, който е псевдоним за низа на основния тип. Това означава, че „MyStr“ наследява всички методи на низ, но е отделен тип.

След това прилагаме метода SearchVowels() за типа „MyStr“. Този метод сканира въведения низ символ по знак и проверява дали всеки знак е гласна („a“, „e“, „i“, „o“ или „u“). Ако знакът е гласна, той се добавя към частта на гласната.



Във функцията main() се създава променлива „NewString“ от тип „MyStr“ със стойността „GoLang Interfaces“. След това се декларира променлива „v1“ от тип „Гласни“. Тъй като „MyStr“ имплементира метода SearchVowels(), който е дефиниран в интерфейса „Vowels“, „NewString“ може да бъде присвоен на „v1“.

Резултатът показва целия масив от гласни, които се намират в посочения низ:

Пример 3: Интерфейс на Golang Stringer

Освен това Golang има предварително дефиниран интерфейс „Stringer“ в пакета „fmt“. Той позволява на персонализиран тип да контролира представянето на низ, когато е форматиран с глагола „%v“ във функциите за печат на пакета „fmt“. Следва примерният код за стрингер интерфейса на Go:

пакет основен
импортиране (
'fmt'
)
Тип Студент структура {
Име низ
Степен низ
}
функ ( s Студент ) низ () низ {
връщане fmt . Sprintf ( „%s е(n) %s“ , с . Име , с . Степен )
}
функ основен () {
s1 := Студент { 'Елена Гилбърт' , 'Информатика' }
s2 := Студент { 'Каролайн Кандис' , 'BBA' }
fmt . Println ( s1 )
fmt . Println ( s2 )
}

Тук кодът първо импортира необходимия пакет, който е „fmt“ за отпечатване на конзолата. След това дефинираме тип структура „Студент“ с две полета: „Име“ и „Степен“. Тази структура представлява информация за ученик. Освен това се създава метод String() за типа „Студент“. Този метод има приемник от тип „Студент“ и връща низ. Методът „String()“ е специален метод в Go, който се използва за персонализиране на низовото представяне на обект, когато се отпечата. В този случай методът „String()“ форматира и връща низ, който включва името и степента на студента.

След това имаме функцията main(), където две променливи, s1 и s2 от тип „Студент“, се декларират и инициализират с информация за студента. И накрая, кодът използва функцията fmt.Println() за отпечатване на стойностите на s1 и s2. Тъй като методът String() е дефиниран за типа „Студент“, Go автоматично извиква този метод, когато отпечатва обекта „Студент“. Методът String() форматира информацията за ученика с помощта на функцията „fmt.Sprintf()“ и връща форматирания низ.

Следният изход отпечатва обекта от типа „Студент“ на интерфейса на стрингера:

Пример 4: Интерфейс за превключване тип Golang

След това идва интерфейсът за превключване на типа на Go. Тип превключвател е контролна структура, която ни позволява да инспектираме динамичния тип на стойността на интерфейса. Следвайте изходния код на интерфейса за превключване на типа:

пакет основен
импортиране 'fmt
func MyFunction(интерфейс F1{}) {
превключвател F1.(тип) {
case int:
fmt.Println('
Тип : вътр , Стойност : ', F1. (вие))
случайен низ:
fmt.Println('
\nТип : низ , Стойност : ', F1. (низ))
case float64:
fmt.Println('
\nТип : float64 , Стойност : ', F1. (float64))
по подразбиране:
fmt.Println('
\nТипът не е валиден ')
}
}
func main() {
MyFunction('
Урок за интерфейси на Golang ')
MyFunction (89.7)
MyFunction(true)
}

Тук предоставеният код дефинира функция „MyFunction“, която приема параметър „F1“ от тип „интерфейс{}“. Това показва, че „F1“ може да приеме стойност от всякакъв тип. Вътре във функцията се използва израз за превключване с „F1.(type)“, за да се провери типа на стойността, която се предава на „MyFunction“. Синтаксисът „.(тип)“ се използва в превключвател на тип, за да се получи основният динамичен тип на стойност на интерфейс. Имайте предвид, че случаите на превключване тук обработват три специфични типа: „int“, „string“ и „float64“. Ако типът „F1“ съответства на един от тези случаи. Той отпечатва съответния тип и стойност, като използва твърденията за тип (F1.(int), F1.(string), F1.(float64)). Ако типът „F1“ не съответства на нито един от дефинираните случаи, се изпълнява случайът по подразбиране, който отпечатва „Типът не е валиден“.

След това в рамките на функцията main() „MyFunction“ се извиква три пъти с различни стойности: низ, float64 и булева стойност (която не се обработва в оператора за превключване).

Изходът показва демонстрацията на интерфейса на превключвателя с твърденията за тип:

Пример 5: Множество интерфейси на Golang

Освен това Go предлага множество интерфейси, които му позволяват да предоставя различни набори от поведения в зависимост от контекста. Тази функция се нарича „множество интерфейси“ или „композиция на интерфейс“. Следният код демонстрира внедряването на множество интерфейси:

пакет основен
импортиране 'fmt'
Тип птици интерфейс {
дишам ()
летя ()
}

Тип птици интерфейс {
фураж ()
}
Тип Където структура {
възраст вътр
}
функ ( г къде ) дишам () {
fmt . Println ( 'Гълъб диша' )
}
функ ( г къде ) летя () {
fmt . Println ( 'Гълъбова муха' )
}
функ ( г къде ) фураж () {
fmt . Println ( „Гълъбът отглежда бебета“ )
}
функ основен () {
беше б птици
д := Където {}
b = д
b . дишам ()
b . летя ()
беше птици
а = д
а . фураж ()
}

Тук дефинираме два интерфейса: „птици“ и „птици“. Интерфейсът „birds“ декларира два метода: breathe() и fly(). Докато интерфейсът „avians“ декларира метода feed(). След това структурата „dove“ имплементира всички методи както на интерфейсите „birds“, така и на „avians“. Той предоставя имплементациите за breathe(), fly() и feed().

След това декларираме променливата „b“ от тип „birds“ в рамките на функцията main(). Създава се екземпляр на „гълъб“ и се присвоява на „b“ с помощта на присвояването b = d. Тъй като „dove“ изпълнява всички методи на интерфейса „birds“, това присвояване е валидно.

След това методите breathe() и fly() се извикват на „b“, което е от тип „birds“. По подобен начин променлива „a“ от тип „avians“ се декларира и се присвоява с екземпляра „dove“ на „d“. Тъй като „dove“ имплементира метода feed(), който е дефиниран в интерфейса „avians“, това присвояване също е валидно. Методът feed() се извиква на „a“, който е от тип „avians“. Тъй като „a“ съдържа екземпляра „dove“, се изпълнява методът feed(), който е имплементиран от „dove“.

Резултатът показва, че методите на интерфейсите се изпълняват правилно:

Заключение

Научихме основите на Go интерфейсите и предоставихме практически примери, за да илюстрираме тяхното използване. Като дефинираме интерфейси и ги внедряваме с различни типове, можем да създаваме гъвкави и разширяеми програми.