Kas yra atspindys Golange

Kas Yra Atspindys Golange



Reflection in Golang leidžia programai nagrinėti ir keisti duomenų struktūras, tipus ir reikšmes vykdymo metu. Jame pateikiamas funkcijų rinkinys, leidžiantis ištirti bet kurio kintamojo tipą ir reikšmę vykdymo metu, sukurti naujus tipų egzempliorius ir modifikuoti esamų kintamųjų vertę. Šiame straipsnyje aptariamos įvairios Golang funkcijos atspindžio pakete.

Turinys

Go yra statinio tipo kalba, todėl kintamojo tipas turi būti žinomas kompiliavimo metu. Tačiau tam tikrais atvejais gali prireikti tvarkyti reikšmes, kurių tipų negalima nustatyti, kol programa nebus vykdoma.







Pavyzdžiui, mums gali tekti parašyti funkciją, kuri gali veikti su įvairių tipų argumentais, arba mums gali tekti suskirstyti ir deserializuoti nežinomų tipų duomenis. Čia Golange naudojamas atspindžio paketas.



Reflect Package in Go

Atspindėjimo pakete pateikiamas funkcijų rinkinys, leidžiantis tikrinti ir valdyti reikšmes vykdymo metu, neatsižvelgiant į jų tipą. Naudodamiesi šiomis funkcijomis galime gauti informacijos apie bet kurio kintamojo tipą ir reikšmę, sukurti naujus tipų egzempliorius ir modifikuoti esamų kintamųjų reikšmes.



Golango atspindžio paketą sudaro du tipai: Tipas ir vertė. Tipas reiškia Go tipą, pvz., int, eilutę arba pasirinktinę struktūrą. Reikšmė reiškia konkretaus tipo reikšmę, pvz., 42 arba „labas“.





Reflekso pakete taip pat pateikiamas funkcijų rinkinys, leidžiantis iš kintamųjų gauti tipo ir reikšmės objektus. Pavyzdžiui, funkcija reflektor.TypeOf() grąžina Type objektą, nurodantį kintamojo tipą, o funkcija reflektor.ValueOf() pateikia vertės objektą, kuriame rodoma kintamojo reikšmė.

Tolesniuose skyriuose išnagrinėsime kai kurias dažniausiai naudojamas reflektoriaus paketo funkcijas.



atspindėti.Kopijuoti() Funkcija

Atspindimojo paketo funkcija reflektuoti.Kopijuoti() naudojama vieno skilties reikšmėms nukopijuoti į kitą skiltį. Tam reikalingi du parametrai – dst ir src, kurie abu turi būti skilties reikšmės su tuo pačiu elemento tipu. Funkcija nukopijuoja reikšmes iš src skilties į dst pjūvį ir grąžina nukopijuotų elementų skaičių.

Funkcija reflect.Copy() parodyta šiame pavyzdyje:

paketą pagrindinis

importuoti (

'fmt'
'atspindėti'
)
func pagrindinis () {
src := [] tarpt { 1 , 2 , 3 , 4 , 5 }
dst := padaryti ([] tarpt , tik ( src ))
n := atspindėti . Kopijuoti ( atspindėti . Vertė ( dst ), atspindėti . Vertė ( src ))
fmt . Println ( n ) // Išvestis: 5
fmt . Println ( dst ) // Išvestis: [1 2 3 4 5]


}

Šiame pavyzdyje sukuriame šaltinio pjūvį src su kai kuriomis sveikųjų skaičių reikšmėmis, o paskirties skilties dst – tokio pat ilgio kaip src. Tada iškviečiame reflektor.Copy(), kad nukopijuotume reikšmes iš src į dst ir išspausdintume nukopijuotų elementų skaičių (n) ir dst skilties turinį.

atspindėti.DeepEqual() funkcija

Atspindimojo paketo funkcija reflect.DeepEqual() naudojama dviem lygybės reikšmėms palyginti. Ši funkcija turi du įvesties parametrus, kurie yra a ir b, kurie abu gali turėti bet kokios reikšmės ir bet kokio tipo. Funkcija grąžina teisingą, jei a ir b yra visiškai vienodos, o tai reiškia, kad jų pagrindinės reikšmės yra rekursyviai lygios. Priešingu atveju paaiškėja, kad tai klaidinga.

Šiame pavyzdyje parodyta, kaip naudoti reflektor.DeepEqual():

paketą pagrindinis

importuoti (

'fmt'
'atspindėti'
)
func pagrindinis () {
a := [] tarpt { 1 , 2 , 3 }
b := [] tarpt { 1 , 2 , 3 }
jeigu atspindėti . DeepEqual ( a , b ) {
fmt . Println ( 'a ir b yra lygūs' )
} Kitas {
fmt . Println ( 'a ir b nėra lygūs' )
}


}

Šiame pavyzdyje sukuriame dvi dalis a ir b su tomis pačiomis sveikųjų skaičių reikšmėmis. Tada iškviečiame reflektuoti.DeepEqual(), kad palygintume a ir b lygybei ir išspausdintume rezultatą.

reflektuoti.Swapper() Funkcija

Reflekso paketo funkcija reflect.Swapper() naudojama norint grąžinti funkciją, kuri gali pakeisti pjūvio elementus. Tam reikia vieno parametro v, kuris turi būti skilties reikšmė. Funkcija grąžina funkciją, kuri paima du sveikųjų skaičių parametrus, i ir j, ir sukeičia pjūvio elementus i ir j padėtyse.

Reflekso.Swapper() naudojimas gali būti parodytas naudojant šį pavyzdį:

paketą pagrindinis

importuoti (

'fmt'
'atspindėti'
)
func pagrindinis () {
s := [] tarpt { 1 , 2 , 3 , 4 , 5 }
apsikeisti := atspindėti . Keitiklis ( s )
apsikeisti ( 1 , 3 )
fmt . Println ( s ) // Išvestis: [1 4 3 2 5]


}

Šiame pavyzdyje sukūrėme pjūvį pavadinimu s su kai kuriomis sveikųjų skaičių reikšmėmis. Tada iškviečiame reflektor.Swapper(), kad gautume funkcijų apsikeitimą, kuris gali pakeisti pjūvio elementus. Naudojame swap, norėdami sukeisti elementus 1 ir 3 s pjūvio padėtyse ir atspausdinti rezultatą.

reflektuoti.TypeOf() funkcija

Refleks.TypeOf() naudojamas reikšmės tipui gauti. Ši funkcija priima vieną parametrą „v“, kuris gali būti bet kokio tipo ar reikšmės. Funkcija grąžina reflekt.Type reikšmę, kuri nurodo reikšmės tipą.

Reflekso.TypeOf() naudojimas gali būti parodytas naudojant šį pavyzdį:

paketą pagrindinis

importuoti (

'fmt'
'atspindėti'
)
func pagrindinis () {
buvo x plūdė64 = 3 . 14
t := atspindėti . Tipas ( x )
fmt . Println ( t ) // Išvestis: float64


}

Šiame pavyzdyje sukuriame float64 kintamąjį x, kurio reikšmė yra 3.14. Tada iškviečiame reflektuoti.TypeOf(), kad gautume x tipą ir gautume rezultatą atspindyje.Įveskite kintamąjį t. Spausdiname t reikšmę, kuri yra float64.

atspindėti.ValueOf() funkcija

Reflekso.ValueOf() gali gauti reflektuoti.Vertės atvaizdavimą. Tam reikia vieno parametro v, kuris gali būti bet kokia bet kokio tipo reikšmė. Funkcija grąžina reflektoriaus reikšmę, kuri reiškia įvesties parametro reikšmę.

Reflekso.ValueOf() naudojimas gali būti parodytas naudojant šį pavyzdį:

paketą pagrindinis

importuoti (

'fmt'
'atspindėti'
)
func pagrindinis () {
buvo x plūdė64 = 3 . 14
in := atspindėti . Vertė ( x )
fmt . Println ( in ) // Išvestis: 3.14

}

Šiame pavyzdyje sukuriame float64 kintamąjį x, kurio reikšmė yra 3.14. Tada iškviečiame reflekt.ValueOf(), kad gautume atspindžio reikšmės atvaizdavimą x ir išsaugotume rezultatą atspindžio reikšmės kintamajame v. Išspausdiname v reikšmę, kuri yra 3,14.

Refleksų pakete yra daug funkcijų, be paminėtų, ir tai tik keli pavyzdžiai. Naudodamiesi reflektoriaus paketo teikiamomis funkcijomis, galime sukurti kodą, kuris gali dirbti su bet kokio tipo reikšmėmis ir nereikia žinoti tipo kompiliavimo metu.

Išvada

Reflection in Golang leidžia programai nagrinėti ir keisti duomenų struktūras, tipus ir reikšmes vykdymo metu. Jis įgyvendinamas naudojant reflektoriaus paketą, kuriame pateikiamos funkcijos, leidžiančios patikrinti tipus ir reikšmes ir jais valdyti. Atspindėjimas ypač naudingas dirbant su sąsajomis, nežinomais tipais arba kai reikia įdiegti bendrąsias funkcijas. Šiame straipsnyje aptariami Golango atspindžio pagrindai, įskaitant atspindžio paketą, atspindžio tipą ir vertę bei dinaminį tipą ir vertę.