Esimerkkejä Golang-liitännöistä

Esimerkkeja Golang Liitannoista



Go:ssa joukko menetelmäallekirjoituksia sisältää rajapinnan. Se määrittää ryhmän toimintoja, jotka tyypin on suoritettava, jotta se voidaan määrittää täyttämään kyseisen rajapinnan. Toisin sanoen rajapinta määrittää menetelmät, jotka tyypillä on oltava, mutta se ei tarjoa toteutustietoja. Go-rajapinnat tarjoavat kuitenkin tehokkaan mekanismin polymorfisen käyttäytymisen saavuttamiseksi ja uudelleenkäytettävän koodin kirjoittamiseksi. Tässä viestissä tarkastelemme Go-käyttöliittymien ideaa ja tarjoamme todellisia esimerkkejä niiden käyttämisestä.

Esimerkki 1: Golangin tyhjä käyttöliittymä

Aloita tyhjästä käyttöliittymästä{}, jota kutsutaan Go-käyttöliittymäksi. Se osoittaa tyypin, joka voi tallentaa minkä tahansa arvon. Seuraava on Go:n tyhjän käyttöliittymän lähdekoodi:

paketti pää
tuonti 'fmt'
tyyppi Marks Calculator käyttöliittymä {}
func pää () {
oli m MarksLaskin
fmt . Println ( m )
}

Tässä annamme koodin, jossa 'MarksCalculator' -liittymässä ei ole määritettyjä menetelmäallekirjoituksia, koska se on tyhjä. Tämän seurauksena se ei tarjoa mitään toimintoja. Seuraavaksi meillä on tämän tyhjän käyttöliittymän main()-funktio, jossa ilmoitetaan MarksCalculator-tyyppinen muuttuja 'm'. Koska käyttöliittymä on tyhjä, 'm' voi sisältää minkä tahansa tyyppisen arvon. Tässä tapauksessa 'm' on alustamaton, joten sen tyypin arvo on nolla, joka on 'nolla' liitännöille. Kun 'm' tulostetaan käyttämällä 'fmt.Println', se tulostaa 'nolla' konsoliin.







Haettu tulos on 'nolla', kuten edellisestä lähdekoodista odotettiin:





Esimerkki 2:  Golangin käyttöliittymän toteutus

Tämä osa esittelee Golang-käyttöliittymän toteutuksen. Tyypin on tarjottava toteutus kullekin määritetylle menetelmälle rajapinnassa, jotta se voidaan toteuttaa Gossa. Seuraavassa on annettu käyttöliittymän toteutuksen lähdekoodi:





paketti pää
tuonti (
'fmt'
)
tyyppi Vokaalit käyttöliittymä {
SearchVowels () [] riimu
}
tyyppi MyStr merkkijono
func ( st MyStr ) SearchVowels () [] riimu {
oli vokaalit [] riimu
varten _ , riimu := alue st {
jos riimu == 'a' || riimu == 'Se on' || riimu == 'minä' || riimu == 'o' || riimu == 'sisään' {
vokaalit = liittää ( vokaalit , riimu )
}
}
palata vokaalit
}

func pää () {
Uusi String := MyStr ( 'GoLang-liittymät' )
oli v1 vokaalit
v1 = Uusi String
fmt . Printf ( 'Vokaalit ovat %c' , v1 . SearchVowels ())
}

Tässä koodi määrittelee käyttöliittymän nimeltä 'Vowels', joka määrittää yhden menetelmän SearchVowels(), joka palauttaa osan riimusta (tyyppi int32). Liitäntä mahdollistaa minkä tahansa tyypin, joka toteuttaa tämän menetelmän allekirjoituksen, määrittämisen liitäntätyypin muuttujalle. Sitten ilmoitetaan uusi 'MyStr'-tyyppi, joka on alias taustalla olevalle tyyppimerkkijonolle. Tämä tarkoittaa, että 'MyStr' perii kaikki merkkijonomenetelmät, mutta on erillinen tyyppi.

Tämän jälkeen toteutamme SearchVowels()-metodin 'MyStr'-tyypille. Tämä menetelmä skannaa syötemerkkijonon merkki kerrallaan ja tarkistaa, onko jokainen merkki vokaali ('a', 'e', 'i', 'o' tai 'u'). Jos merkki on vokaali, se liitetään vokaaliviipaleeseen.



Main()-funktion sisällä luodaan 'MyStr'-tyyppinen 'NewString'-muuttuja 'GoLang Interfaces' -arvolla. Seuraavaksi ilmoitetaan 'Vowels'-tyyppinen 'v1'-muuttuja. Koska 'MyStr' toteuttaa SearchVowels()-metodin, joka on määritelty 'Vowels'-rajapinnassa, 'NewString' voidaan määrittää 'v1'.

Tulos näyttää kaikki vokaalit, jotka löytyvät määritetystä merkkijonosta:

Esimerkki 3: Golang Stringer -liitäntä

Lisäksi Golangilla on ennalta määritetty 'Stringer'-käyttöliittymä 'fmt'-paketissa. Sen avulla mukautettu tyyppi voi hallita merkkijonoesitystään, kun se on alustettu '%v' -verbillä 'fmt'-paketin tulostustoiminnoissa. Seuraava on esimerkkikoodi Gon stringer-käyttöliittymälle:

paketti pää
tuonti (
'fmt'
)
tyyppi Opiskelija struct {
Nimi merkkijono
Tutkinto merkkijono
}
func ( s Opiskelija ) merkkijono () merkkijono {
palata fmt . Sprintf ( '%s on (n) %s' , s . Nimi , s . Tutkinto )
}
func pää () {
s1 := Opiskelija { 'Elena Gilbert' , 'Tietokone Tiede' }
s2 := Opiskelija { 'Caroline Candice' , 'BBA' }
fmt . Println ( s1 )
fmt . Println ( s2 )
}

Täällä koodi tuo ensin tarvittavan paketin, joka on 'fmt' tulostettavaksi konsoliin. Sitten määritämme rakennetyypin 'Student', jossa on kaksi kenttää: 'Nimi' ja 'Tutkinto'. Tämä rakenne edustaa opiskelijan tietoja. Lisäksi luodaan String()-menetelmä 'Opiskelija'-tyypille. Tällä menetelmällä on 'Student'-tyyppinen vastaanotin ja se palauttaa merkkijonon. String()-menetelmä on Go:n erityinen menetelmä, jota käytetään mukauttamaan objektin merkkijonoesitystä tulostettaessa. Tässä tapauksessa 'String()' -menetelmä muotoilee ja palauttaa merkkijonon, joka sisältää opiskelijan nimen ja tutkinnon.

Seuraavaksi meillä on main()-funktio, jossa kaksi muuttujaa, s1 ja s2 tyyppiä 'Student', ilmoitetaan ja alustetaan opiskelijatiedoilla. Lopuksi koodi käyttää fmt.Println()-funktiota s1:n ja s2:n arvojen tulostamiseen. Koska String()-menetelmä on määritetty 'Student'-tyypille, Go kutsuu tätä menetelmää automaattisesti tulostettaessa 'Student'-objektia. String()-menetelmä muotoilee opiskelijan tiedot 'fmt.Sprintf()'-funktiolla ja palauttaa muotoillun merkkijonon.

Seuraava tulos tulostaa stringer-rajapinnan 'Student'-tyypin objektin:

Esimerkki 4: Golang Type Switch -liitäntä

Sitten tulee Go:n tyyppikytkinliittymä. Tyyppikytkin on ohjausrakenne, jonka avulla voimme tarkastaa liitäntäarvon dynaamisen tyypin. Noudata kytkimen käyttöliittymän lähdekoodia:

paketti pää
tuonti 'fmt
func MyFunction(F1-käyttöliittymä{}) {
kytkin F1.(tyyppi) {
case int:
fmt.Println('
Tyyppi : int , Arvo : ', F1. (sinä))
tapausmerkkijono:
fmt.Println('
\nTyyppi : merkkijono , Arvo : ', F1.(merkkijono))
case float64:
fmt.Println('
\nTyyppi : kellua64 , Arvo : ', F1.(float64))
oletus:
fmt.Println('
\nTyyppi ei kelpaa ')
}
}
func main() {
MyFunction('
Golang-rajapintojen opetusohjelma ')
MyFunction(89.7)
Oma toiminto (tosi)
}

Tässä annettu koodi määrittelee 'MyFunction'-funktion, joka ottaa 'interface{}'-tyypin 'F1'-parametrin. Tämä osoittaa, että 'F1' voi hyväksyä minkä tahansa tyypin. Funktiossa käytetään kytkinkäskyä 'F1.(type)':n kanssa tarkistamaan 'MyFunction'-funktioon välitetyn arvon tyyppi. '.(type)'-syntaksia käytetään tyyppikytkimessä saadakseen liitäntäarvon taustalla olevan dynaamisen tyypin. Huomaa, että tässä kytkinkotelot käsittelevät kolmea tiettyä tyyppiä: 'int', 'string' ja 'float64'. Jos 'F1'-tyyppi vastaa jotakin näistä tapauksista. Se tulostaa vastaavan tyypin ja arvon käyttämällä tyyppiväitteitä (F1.(int), F1.(string), F1.(float64)). Jos 'F1'-tyyppi ei vastaa mitään määritetyistä tapauksista, suoritetaan oletustapaus, joka tulostaa 'Tyyppi ei kelpaa'.

Sen jälkeen main()-funktiossa 'MyFunction' kutsutaan kolme kertaa eri arvoilla: merkkijono, float64 ja Boolean (jota ei käsitellä kytkinkäskyssä).

Tulos näyttää kytkimen käyttöliittymän esittelyn tyyppiväitteillä:

Esimerkki 5: Golangin useita käyttöliittymiä

Lisäksi Go tarjoaa useita käyttöliittymiä, joiden avulla se voi tarjota erilaisia ​​​​käyttäytymissarjoja kontekstista riippuen. Tätä ominaisuutta kutsutaan 'useita liitäntöjä' tai 'rajapinnan kokoonpanoa'. Seuraava koodi esittelee useiden rajapintojen toteutuksen:

paketti pää
tuonti 'fmt'
tyyppi lintuja käyttöliittymä {
hengittää ()
lentää ()
}

tyyppi linnut käyttöliittymä {
syöttää ()
}
tyyppi Missä struct {
ikä int
}
func ( d missä ) hengittää () {
fmt . Println ( 'Kyhky hengittää' )
}
func ( d missä ) lentää () {
fmt . Println ( 'Kyhkynen lentää' )
}
func ( d missä ) syöttää () {
fmt . Println ( 'Kyhkyset kasvattavat vauvoja' )
}
func pää () {
oli b lintuja
d := Missä {}
b = d
b . hengittää ()
b . lentää ()
oli lintuja
a = d
a . syöttää ()
}

Tässä määrittelemme kaksi käyttöliittymää: 'linnut' ja 'linnut'. 'Linnut'-käyttöliittymä ilmoittaa kaksi menetelmää: breathe() ja fly(). 'Avians'-rajapinta ilmoittaa feed()-menetelmän. Sitten 'kyyhkynen' -rakenne toteuttaa kaikki sekä 'lintujen' että 'lintujen' rajapintojen menetelmät. Se tarjoaa toteutukset funktioille breathe(), fly() ja feed().

Seuraavaksi julistamme main()-funktion sisällä 'birds' -tyypin muuttujan 'b'. 'Kyhyn' esiintymä luodaan ja osoitetaan 'b':lle käyttämällä b = d -tehtävää. Koska 'kyyhkynen' toteuttaa kaikki 'lintujen' käyttöliittymän menetelmät, tämä tehtävä on voimassa.

Sitten hengitys()- ja fly()-menetelmiä kutsutaan 'b':ssä, joka on 'lintuja'. Samoin 'avians'-tyyppinen muuttuja 'a' ilmoitetaan ja sille osoitetaan 'd'-esiintymä 'kyyhkynen'. Koska 'kyyhky' toteuttaa feed()-metodin, joka on määritelty 'avians'-rajapinnassa, tämä tehtävä on myös voimassa. Feed()-menetelmää kutsutaan 'a', joka on 'avians'-tyyppinen. Koska 'a' sisältää 'dove'-instanssin, 'kyyhkysen' toteuttama feed()-menetelmä suoritetaan.

Tulos osoittaa, että rajapintojen menetelmät suoritetaan oikein:

Johtopäätös

Opimme Go-rajapintojen perusteet ja esitimme käytännön esimerkkejä niiden käytön havainnollistamiseksi. Määrittelemällä rajapintoja ja toteuttamalla niitä eri tyypeillä voimme luoda joustavia ja laajennettavia ohjelmia.