Príklady rozhraní Golang

Priklady Rozhrani Golang



V Go obsahuje sada podpisov metód rozhranie. Špecifikuje skupinu akcií, ktoré musí typ vykonať, aby sa určilo, že spĺňa dané rozhranie. Inými slovami, rozhranie špecifikuje metódy, ktoré typ musí mať, ale neposkytuje informácie o implementácii. Hoci rozhrania Go poskytujú výkonný mechanizmus na dosiahnutie polymorfného správania a na písanie opätovne použiteľného kódu. V tomto príspevku preskúmame myšlienku rozhraní v Go a ponúkneme príklady z reálneho sveta, aby sme ukázali, ako ich používať.

Príklad 1: Prázdne rozhranie Golang

Začnite s prázdnym rozhraním{}, ktoré sa v Go označuje ako rozhranie. Označuje typ, ktorý môže uložiť akúkoľvek hodnotu. Nasleduje zdrojový kód pre prázdne rozhranie v Go:

balík Hlavná
importovať 'fmt'
typu MarksCalculator rozhranie {}
func Hlavná () {
bol m Kalkulačka známok
fmt . Println ( m )
}

Tu uvádzame kód, kde rozhranie „MarksCalculator“ nemá žiadne špecifikované podpisy metód, pretože je prázdne. V dôsledku toho neposkytuje žiadne funkcie. Ďalej tu máme funkciu main() tohto prázdneho rozhrania, kde je deklarovaná premenná „m“ typu MarksCalculator. Keďže rozhranie je prázdne, „m“ môže obsahovať akúkoľvek hodnotu akéhokoľvek typu. V tomto prípade je „m“ neinicializované, takže má pre svoj typ nulovú hodnotu, ktorá je pre rozhrania „nulová“. Keď sa „m“ vytlačí pomocou „fmt.Println“, do konzoly sa vypíše „nula“.







Výstup, ktorý sa získa, je „nulový“, ako sa očakávalo z predchádzajúceho zdrojového kódu:





Príklad 2:  Implementácia rozhrania Golang

Táto časť demonštruje implementáciu rozhrania Golang. Typ musí ponúkať implementáciu pre každú zo špecifikovaných metód v rozhraní, aby ju mohol implementovať v Go. Nasleduje uvedený zdrojový kód pre implementáciu rozhrania:





balík Hlavná
importovať (
'fmt'
)
typu Samohlásky rozhranie {
SearchVowels () [] runa
}
typu MyStr reťazec
func ( st MyStr ) SearchVowels () [] runa {
bol samohlásky [] runa
pre _ , runa := rozsah sv {
ak runa == 'a' || runa == 'To je' || runa == 'ja' || runa == 'O' || runa == 'in' {
samohlásky = priložiť ( samohlásky , runa )
}
}
vrátiť samohlásky
}

func Hlavná () {
NewString := MyStr ( 'Rozhrania GoLang' )
bol v1 Samohlásky
v1 = NewString
fmt . Printf ( 'Samohlásky sú %c' , v1 . SearchVowels ())
}

Kód tu definuje rozhranie s názvom „Vowels“, ktoré špecifikuje jedinú metódu SearchVowels(), ktorá vráti časť runy (napíšte int32). Rozhranie umožňuje každému typu, ktorý implementuje tento podpis metódy, priradiť premennej typu rozhrania. Potom sa deklaruje nový typ „MyStr“, ktorý je aliasom pre reťazec základného typu. To znamená, že „MyStr“ zdedí všetky metódy reťazca, ale ide o odlišný typ.

Potom implementujeme metódu SearchVowels() pre typ „MyStr“. Táto metóda skenuje vstupný reťazec znak po znaku a kontroluje, či každý znak je samohláska („a“, „e“, „i“, „o“ alebo „u“). Ak je znakom samohláska, pripojí sa k výseku samohlásky.



Vo funkcii main() sa vytvorí premenná „NewString“ typu „MyStr“ s hodnotou „GoLang Interfaces“. Ďalej je deklarovaná premenná „v1“ typu „Samohlásky“. Keďže „MyStr“ implementuje metódu SearchVowels(), ktorá je definovaná v rozhraní „Samohlásky“, „NewString“ možno priradiť k „v1“.

Výstup zobrazuje všetky pole samohlások, ktoré sa nachádzajú v zadanom reťazci:

Príklad 3: Rozhranie Golang Stringer

Golang má navyše preddefinované rozhranie „Stringer“ v balíku „fmt“. Umožňuje vlastnému typu ovládať reprezentáciu reťazca pri formátovaní pomocou slovesa „%v“ v tlačových funkciách balíka „fmt“. Nasleduje príklad kódu pre stringer rozhranie Go:

balík Hlavná
importovať (
'fmt'
)
typu Študent štrukturovať {
názov reťazec
Titul reťazec
}
func ( s Študent ) Reťazec () reťazec {
vrátiť fmt . Sprintf ( '%s je (n) %s' , s . názov , s . Titul )
}
func Hlavná () {
s1 := Študent { 'Elena Gilbert' , 'Počítačová veda' }
s2 := Študent { 'Caroline Candice' , 'BBA' }
fmt . Println ( s1 )
fmt . Println ( s2 )
}

Tu kód najprv naimportuje potrebný balík, ktorý je „fmt“ na tlač do konzoly. Potom definujeme typ štruktúry „Študent“ s dvoma poľami: „Meno“ a „Stupeň“. Táto štruktúra predstavuje informácie o študentovi. Ďalej sa vytvorí metóda String() pre typ „Student“. Táto metóda má prijímač typu „Student“ a vracia reťazec. Metóda „String()“ je špeciálna metóda v Go, ktorá sa používa na prispôsobenie reťazcovej reprezentácie objektu pri jeho tlači. V tomto prípade metóda „String()“ naformátuje a vráti reťazec, ktorý obsahuje meno a titul študenta.

Ďalej tu máme funkciu main(), kde sú deklarované a inicializované dve premenné, s1 a s2 typu „Student“ a inicializované informáciami o študentovi. Nakoniec kód používa funkciu fmt.Println() na vytlačenie hodnôt s1 a s2. Keďže metóda String() je definovaná pre typ „Student“, Go automaticky volá túto metódu pri tlači objektu „Student“. Metóda String() naformátuje informácie študenta pomocou funkcie „fmt.Sprintf()“ a vráti naformátovaný reťazec.

Nasledujúci výstup vypíše objekt typu „Student“ rozhrania stringer:

Príklad 4: Rozhranie prepínača typu Golang

Potom prichádza rozhranie na prepínanie typov Go. Typový prepínač je riadiaca štruktúra, ktorá nám umožňuje kontrolovať dynamický typ hodnoty rozhrania. Postupujte podľa zdrojového kódu rozhrania prepínača typu:

balík Hlavná
importovať 'fmt
func MyFunction(rozhranie F1{}) {
prepínač F1. (typ) {
case int:
fmt.Println('
Typ : int , Hodnota : ', F1. (vy))
reťazec prípadu:
fmt.Println('
\nZadajte : reťazec , Hodnota : ', F1.(reťazec))
puzdro float64:
fmt.Println('
\nZadajte : plavák64 , Hodnota : ', F1.(float64))
predvolene:
fmt.Println('
\nTyp nie je platný ')
}
}
func main() {
MyFunction('
Návod na rozhranie Golang ')
MyFunction (89,7)
MyFunction (pravda)
}

Tu poskytnutý kód definuje funkciu „MyFunction“, ktorá preberá parameter „F1“ typu „rozhranie{}“. To znamená, že „F1“ môže prijať hodnotu akéhokoľvek typu. Vo vnútri funkcie sa používa príkaz switch s „F1.(type)“ na kontrolu typu hodnoty, ktorá sa odovzdáva do „MyFunction“. Syntax „.(type)“ sa používa v prepínači typu na získanie základného dynamického typu hodnoty rozhrania. Všimnite si, že prípady prepínačov tu spracovávajú tri špecifické typy: „int“, „string“ a „float64“. Ak sa typ „F1“ zhoduje s jedným z týchto prípadov. Vypíše príslušný typ a hodnotu pomocou tvrdení typu (F1.(int), F1.(reťazec), F1.(float64)). Ak typ „F1“ nezodpovedá žiadnemu z definovaných prípadov, vykoná sa predvolený prípad, ktorý vypíše „Typ nie je platný“.

Potom sa v rámci funkcie main() volá „MyFunction“ trikrát s rôznymi hodnotami: reťazec, float64 a boolean (ktorý nie je spracovaný v príkaze switch).

Výstup zobrazuje demonštráciu rozhrania prepínača s typovými tvrdeniami:

Príklad 5: Viacnásobné rozhrania Golang

Go navyše ponúka viacero rozhraní, ktoré mu umožňujú poskytovať rôzne súbory správania v závislosti od kontextu. Táto funkcia sa nazýva „viaceré rozhrania“ alebo „zloženie rozhrania“. Nasledujúci kód demonštruje implementáciu viacerých rozhraní:

balík Hlavná
importovať 'fmt'
typu vtákov rozhranie {
dýchať ()
lietať ()
}

typu vtákov rozhranie {
krmivo ()
}
typu Kde štrukturovať {
Vek int
}
func ( d kde ) dýchať () {
fmt . Println ( 'Holubica dýcha' )
}
func ( d kde ) lietať () {
fmt . Println ( 'holubica lieta' )
}
func ( d kde ) krmivo () {
fmt . Println ( 'Holubica vychováva deti' )
}
func Hlavná () {
bol b vtáky
d := Kde {}
b = d
b . dýchať ()
b . lietať ()
bol vtákov
a = d
a . krmivo ()
}

Tu definujeme dve rozhrania: „vtáky“ a „vtáky“. Rozhranie „birds“ deklaruje dve metódy: breathe() a fly(). Zatiaľ čo rozhranie „avians“ deklaruje metódu feed(). Potom štruktúra „holubica“ implementuje všetky metódy rozhrania „vtáky“ aj „vtáky“. Poskytuje implementácie pre breathe(), fly() a feed().

Ďalej deklarujeme premennú „b“ typu „birds“ v rámci funkcie main(). Vytvorí sa inštancia „holubice“ a priradí sa k „b“ pomocou priradenia b = d. Keďže „holubica“ implementuje všetky metódy rozhrania „vtáky“, toto priradenie je platné.

Potom sa metódy breathe() a fly() zavolajú na „b“, ktoré je typu „birds“. Podobne je deklarovaná premenná „a“ typu „avians“ a priradená inštancii „holubica“ pre „d“. Keďže „dove“ implementuje metódu feed(), ktorá je definovaná v rozhraní „avians“, toto priradenie je tiež platné. Metóda feed() sa volá na „a“, ktoré je typu „vtáctvo“. Keďže „a“ obsahuje inštanciu „holubica“, vykoná sa metóda feed(), ktorú implementuje „holubica“.

Výstup ukazuje, že metódy rozhraní sa vykonávajú správne:

Záver

Naučili sme sa základy rozhraní Go a poskytli sme praktické príklady na ilustráciu ich použitia. Definovaním rozhraní a ich implementáciou rôznymi typmi môžeme vytvárať flexibilné a rozšíriteľné programy.