Mitä on heijastus Golangissa

Mita On Heijastus Golangissa



Reflection in Golang mahdollistaa ohjelman tutkia ja muokata tietorakenteita, tyyppejä ja arvoja ajon aikana. Se tarjoaa joukon toimintoja, joiden avulla voimme tutkia minkä tahansa muuttujan tyyppiä ja arvoa ajon aikana, luoda uusia tyyppejä ja muokata olemassa olevien muuttujien arvoja. Tämä artikkeli kattaa erilaiset Golang-toiminnot heijastuspaketissa.

Sisällysluettelo

Go on staattisesti kirjoitettu kieli, joten muuttujan tyyppi on tiedettävä käännöshetkellä. Tietyissä skenaarioissa voi kuitenkin olla tarpeen käsitellä arvoja, joiden tyyppejä ei voida määrittää ennen kuin ohjelma on suoritettu.







Saatamme esimerkiksi joutua kirjoittamaan funktion, joka voi toimia erityyppisten argumenttien kanssa, tai meidän on ehkä sarjoitava ja desarjoitava tuntemattomien tyyppisten tietojen kanssa. Tässä käytetään heijastuspakettia Golangissa.



Reflect Package in Go

Reflektori-paketti tarjoaa joukon toimintoja, joiden avulla voimme tarkastaa ja muokata arvoja ajon aikana niiden tyypeistä riippumatta. Näiden funktioiden avulla voimme saada tietoa minkä tahansa muuttujan tyypistä ja arvosta, luoda uusia tyyppejä ja muokata olemassa olevien muuttujien arvoja.



Golangin heijastuspaketti sisältää kaksi tyyppiä: Tyyppi ja arvo. Tyyppi edustaa Go-tyyppiä, kuten int, merkkijono tai mukautettu rakenne. Arvo edustaa tietyn tyyppistä arvoa, kuten 42 tai 'hei'.





Reflection-paketti sisältää myös joukon toimintoja, joiden avulla voimme saada Type- ja Value-objekteja muuttujista. Esimerkiksi reflektio.TypeOf()-funktio palauttaa Type-objektin, joka edustaa muuttujan tyyppiä, kun taas reflektio.Arvo()-funktio antaa Value-objektin, joka näyttää muuttujan arvon.

Seuraavissa osissa tutkimme joitain reflektiopaketin yleisesti käytettyjä toimintoja.



reflektoi.Copy()-funktio

Reflektoripaketin reflektoi.Copy()-funktiota käytetään kopioimaan yhden viipaleen arvot toiseen viipaleen. Se vaatii kaksi parametria, dst ja src, joiden molempien on oltava slice-arvoja samalla elementtityypillä. Funktio kopioi arvot src-lohkosta dst-viipaleeseen ja palauttaa kopioitujen elementtien määrän.

Reflektor.Copy()-funktio on esitetty seuraavassa esimerkissä:

paketti pää

tuonti (

'fmt'
'heijastaa'
)
func pää () {
src := [] int { 1 , 2 , 3 , 4 , 5 }
dst := tehdä ([] int , vain ( src ))
n := heijastaa . Kopio ( heijastaa . Jonkin arvo ( dst ), heijastaa . Jonkin arvo ( src ))
fmt . Println ( n ) // Tulos: 5
fmt . Println ( dst ) // Tulos: [1 2 3 4 5]


}

Tässä esimerkissä luomme lähdeviipaleen src joillakin kokonaislukuarvoilla ja kohdelohkon dst, jonka pituus on sama kuin src. Kutsumme sitten reflektoi.Copy() kopioidaksemme arvot src:stä dst:hen ja tulostaaksemme kopioitujen elementtien määrän (n) ja dst-lohkon sisällön.

reflektoi.DeepEqual()-funktio

Reflektoripaketin reflektoi.DeepEqual()-funktiota käytetään kahden tasa-arvon vertaamiseen. Tällä funktiolla on kaksi syöttöparametria, jotka ovat a ja b, joilla molemmilla voi olla mikä tahansa arvo minkä tahansa tyyppistä. Funktio palauttaa tosi, jos a ja b ovat syvästi yhtä suuret, mikä tarkoittaa, että niiden taustalla olevat arvot ovat rekursiivisesti yhtä suuret. Muuten se osoittautuu vääräksi.

Seuraava esimerkki näyttää kuinka reflektor.DeepEqual():

paketti pää

tuonti (

'fmt'
'heijastaa'
)
func pää () {
a := [] int { 1 , 2 , 3 }
b := [] int { 1 , 2 , 3 }
jos heijastaa . DeepEqual ( a , b ) {
fmt . Println ( 'a ja b ovat yhtä suuret' )
} muu {
fmt . Println ( 'a ja b eivät ole samat' )
}


}

Tässä esimerkissä luomme kaksi siivua a ja b samoilla kokonaislukuarvoilla. Kutsumme sitten reflektio.DeepEqual() vertaamaan a:ta ja b:tä tasa-arvoa varten ja tulostamaan tuloksen.

reflektoi.Swapper()-funktio

Reflektoripaketin reflektoi.Swapper()-funktiota käytetään palauttamaan funktio, joka voi vaihtaa viipaleen elementtejä. Se vaatii yhden parametrin, v, jonka on oltava slice-arvo. Funktio palauttaa funktion, joka ottaa kaksi kokonaislukuparametria, i ja j, ja vaihtaa viipaleen elementit paikoissa i ja j.

Reflektorin.Swapper() käyttö voidaan osoittaa seuraavan esimerkin avulla:

paketti pää

tuonti (

'fmt'
'heijastaa'
)
func pää () {
s := [] int { 1 , 2 , 3 , 4 , 5 }
vaihtaa := heijastaa . Vaihtaja ( s )
vaihtaa ( 1 , 3 )
fmt . Println ( s ) // Tulos: [1 4 3 2 5]


}

Tässä esimerkissä loimme s-nimisen lohkon, jossa on joitakin kokonaislukuarvoja. Kutsumme sitten reflektoria.Swapper() saadaksesi funktion swap-toiminnon, joka voi vaihtaa osien osia. Käytämme swap-toimintoa vaihtaaksemme elementit s-osion kohdissa 1 ja 3 ja tulostamme tuloksen.

reflektoi.TypeOf()-funktio

Reflektoria.TypeOf() käytetään arvon tyypin määrittämiseen. Tämä toiminto hyväksyy yhden parametrin 'v', joka voi olla minkä tyyppinen tai arvoinen tahansa. Funktio palauttaa reflect.Type-arvon, joka edustaa arvon tyyppiä.

Reflektorin.TypeOf() käyttö voidaan osoittaa seuraavan esimerkin avulla:

paketti pää

tuonti (

'fmt'
'heijastaa'
)
func pää () {
oli x kellua64 = 3 . 14
t := heijastaa . Tyyppi ( x )
fmt . Println ( t ) // Lähtö: float64


}

Tässä esimerkissä luomme float64-muuttujan x arvolla 3.14. Kutsumme sitten reflektoi.TypeOf(), jotta saadaan x:n tyyppi ja tallennetaan tulos reflektointiin.Type-muuttuja t. Tulostetaan t:n arvo, joka on float64.

reflektoi.ArvoOf()-funktio

Reflektor.ValueOf() voi saada reflektoi.Arvo-esityksen arvosta. Se vaatii yhden parametrin v, joka voi olla mikä tahansa arvo mitä tahansa tyyppiä. Funktio palauttaa reflektoi.Arvo-arvon, joka edustaa syöteparametrin arvoa.

Reflekt.ValueOf()-funktion käyttö voidaan osoittaa seuraavan esimerkin avulla:

paketti pää

tuonti (

'fmt'
'heijastaa'
)
func pää () {
oli x kellua64 = 3 . 14
sisään := heijastaa . Jonkin arvo ( x )
fmt . Println ( sisään ) // Tulos: 3.14

}

Tässä esimerkissä luomme float64-muuttujan x arvolla 3.14. Kutsumme sitten reflektio.ValueOf(), jotta saadaan heijastusarvoesitys x:stä ja tallennetaan tulos reflektointiarvomuuttujaan v. Tulostamme v:n arvon, joka on 3,14.

Reflektoripaketti tarjoaa lukuisia toimintoja mainittujen lisäksi, ja nämä ovat vain muutamia esimerkkejä. Käyttämällä reflektiopaketin toimittamia toimintoja voimme luoda koodia, joka voi toimia minkä tahansa tyyppisten arvojen kanssa ilman, että tyyppiä tarvitsee tietää käännöshetkellä.

Johtopäätös

Reflection in Golang mahdollistaa ohjelman tutkia ja muokata tietorakenteita, tyyppejä ja arvoja ajon aikana. Se toteutetaan reflektointipaketin kautta, joka tarjoaa toimintoja tyyppien ja arvojen tarkastamiseen ja muokkaamiseen. Heijastus on erityisen hyödyllistä työskennellessäsi rajapintojen, tuntemattomien tyyppien kanssa tai kun sinun on toteutettava yleisiä toimintoja. Tässä artikkelissa käsiteltiin Golangin reflektoinnin perusteita, mukaan lukien heijastuspaketti, heijastustyyppi ja arvo sekä dynaaminen tyyppi ja arvo.