Što je Reflection u Golangu

Sto Je Reflection U Golangu



Reflection u Golangu omogućuje programu ispitivanje i modificiranje struktura podataka, tipova i vrijednosti tijekom izvođenja. Pruža skup funkcija koje nam omogućuju da ispitamo vrstu i vrijednost bilo koje varijable tijekom izvođenja, stvorimo nove instance tipova i promijenimo vrijednost postojećih varijabli. Ovaj članak pokriva različite Golangove funkcije u refleks paketu.

Sadržaj

Go je statički tipiziran jezik tako da tip varijable mora biti poznat tijekom kompajliranja. Međutim, u određenim scenarijima može biti potrebno rukovati vrijednostima čiji se tipovi ne mogu odrediti dok se program ne izvrši.







Na primjer, možda ćemo trebati napisati funkciju koja može raditi s različitim vrstama argumenata ili ćemo možda morati serijalizirati i deserijalizirati podatke nepoznatih vrsta. Ovdje se koristi refleksni paket u Golangu.



Reflect paket u Go

Paket reflect pruža skup funkcija koje nam omogućuju pregled i manipuliranje vrijednostima tijekom izvođenja, bez obzira na njihovu vrstu. Pomoću ovih funkcija možemo dobiti informacije o vrsti i vrijednosti bilo koje varijable, stvoriti nove instance tipova i modificirati vrijednost postojećih varijabli.



Refleks paket u Golangu sadrži dvije vrste: Vrsta i vrijednost. Tip predstavlja Go tip, kao što je int, string ili prilagođena struktura. Vrijednost predstavlja vrijednost određene vrste, kao što je 42 ili 'zdravo'.





Paket reflect također nudi skup funkcija koje nam omogućuju dobivanje objekata tipa i vrijednosti iz varijabli. Na primjer, funkcija reflect.TypeOf() vraća objekt Type koji predstavlja tip varijable, dok funkcija reflect.ValueOf() daje objekt Value koji prikazuje vrijednost varijable.

U sljedećim odjeljcima istražit ćemo neke od često korištenih funkcija u refleks paketu.



odražavati.Funkcija Copy().

Funkcija reflect.Copy() refleksijskog paketa koristi se za kopiranje vrijednosti jednog odsječka u drugi odsječak. Potrebna su dva parametra, dst i src, a oba moraju biti vrijednosti odsječka s istom vrstom elementa. Funkcija kopira vrijednosti iz src odsječka u dst odsječak i vraća broj elemenata koji su kopirani.

Funkcija reflect.Copy() prikazana je u sljedećem primjeru:

paket glavni

uvoz (

'fmt'
'reflektirati'
)
funk glavni () {
src := [] int { 1 , 2 , 3 , 4 , 5 }
dst := napraviti ([] int , samo ( src ))
n := odražavati . Kopirati ( odražavati . Vrijednost ( dst ), odražavati . Vrijednost ( src ))
fmt . Println ( n ) // Izlaz: 5
fmt . Println ( dst ) // Izlaz: [1 2 3 4 5]


}

U ovom primjeru stvaramo izvorni isječak src s nekim cjelobrojnim vrijednostima i odredišni isječak dst iste duljine kao src. Zatim pozivamo reflect.Copy() da kopiramo vrijednosti iz src u dst i ispisujemo broj kopiranih elemenata (n) i sadržaj dst odsječka.

odražavati.DeepEqual() funkcija

Funkcija reflect.DeepEqual() paketa reflect koristi se za usporedbu dviju vrijednosti za jednakost. Ova funkcija ima dva ulazna parametra a i b, a oba mogu imati bilo koju vrijednost bilo koje vrste. Funkcija vraća true ako su a i b duboko jednaki, što znači da su njihove temeljne vrijednosti rekurzivno jednake. U protivnom se ispostavlja da je lažna.

Sljedeći primjer pokazuje kako koristiti reflect.DeepEqual():

paket glavni

uvoz (

'fmt'
'reflektirati'
)
funk glavni () {
a := [] int { 1 , 2 , 3 }
b := [] int { 1 , 2 , 3 }
ako odražavati . DeepEqual ( a , b ) {
fmt . Println ( 'a i b su jednaki' )
} drugo {
fmt . Println ( 'a i b nisu jednaki' )
}


}

U ovom primjeru stvaramo dva odsječka a i b s istim cjelobrojnim vrijednostima. Zatim pozivamo reflect.DeepEqual() da usporedimo a i b za jednakost i ispišemo rezultat.

odražavati.Swapper() funkcija

Funkcija reflect.Swapper() paketa reflect koristi se za vraćanje funkcije koja može zamijeniti elemente isječka. Potreban je jedan parametar, v, koji mora biti vrijednost odsječka. Funkcija vraća funkciju koja uzima dva cjelobrojna parametra, i i j, i mijenja elemente isječka na pozicijama i i j.

Korištenje reflect.Swapper() može se pokazati kroz sljedeći primjer:

paket glavni

uvoz (

'fmt'
'reflektirati'
)
funk glavni () {
s := [] int { 1 , 2 , 3 , 4 , 5 }
zamijeniti := odražavati . Zamjena ( s )
zamijeniti ( 1 , 3 )
fmt . Println ( s ) // Izlaz: [1 4 3 2 5]


}

U ovom smo primjeru stvorili odsječak pod nazivom s s nekim cjelobrojnim vrijednostima. Zatim pozivamo reflect.Swapper() da dobijemo funkciju swap koja može zamijeniti elemente isječka. Koristimo swap za zamjenu elemenata na pozicijama 1 i 3 odsječka s i ispisujemo rezultat.

odražavati.TypeOf() funkcija

reflex.TypeOf() koristi se za dobivanje vrste vrijednosti. Ova funkcija prihvaća jedan parametar 'v' koji može biti bilo koje vrste ili vrijednosti. Funkcija vraća vrijednost reflect.Type koja predstavlja vrstu vrijednosti.

Korištenje reflect.TypeOf() može se pokazati kroz sljedeći primjer:

paket glavni

uvoz (

'fmt'
'reflektirati'
)
funk glavni () {
bio je x plovak64 = 3 . 14
t := odražavati . Vrsta ( x )
fmt . Println ( t ) // Izlaz: float64


}

U ovom primjeru stvaramo float64 varijablu x s ​​vrijednošću 3.14. Zatim pozivamo reflect.TypeOf() da dobijemo tip x i pohranimo rezultat u varijablu reflect.Type t. Ispisujemo vrijednost t, koja je float64.

odražavati.ValueOf() funkcija

Reflekt.ValueOf() može dobiti refleksiju.Value reprezentaciju vrijednosti. Potreban je jedan parametar v, koji može biti bilo koja vrijednost bilo kojeg tipa. Funkcija vraća vrijednost reflect.Value koja predstavlja vrijednost ulaznog parametra.

Korištenje reflect.ValueOf() može se pokazati kroz sljedeći primjer:

paket glavni

uvoz (

'fmt'
'reflektirati'
)
funk glavni () {
bio je x plovak64 = 3 . 14
u := odražavati . Vrijednost ( x )
fmt . Println ( u ) // Izlaz: 3.14

}

U ovom primjeru stvaramo float64 varijablu x s ​​vrijednošću 3.14. Zatim pozivamo reflect.ValueOf() da dobijemo prikaz vrijednosti refleksije x i pohranjujemo rezultat u varijablu refleksijske vrijednosti v. Ispisujemo vrijednost v, koja je 3,14.

Paket reflect pruža brojne funkcije osim spomenutih, a ovo je samo nekoliko primjera. Korištenjem funkcija koje pruža paket reflect, možemo stvoriti kod koji može raditi s vrijednostima bilo koje vrste, bez potrebe da znamo vrstu u vrijeme kompilacije.

Zaključak

Reflection u Golangu omogućuje programu ispitivanje i modificiranje struktura podataka, tipova i vrijednosti tijekom izvođenja. Implementiran je putem paketa reflect, koji pruža funkcije za pregled i manipuliranje tipovima i vrijednostima. Refleksija je posebno korisna kada radite sa sučeljima, nepoznatim tipovima ili kada trebate implementirati generičke funkcije. U ovom se članku raspravljalo o osnovama refleksije u Golangu, uključujući paket refleksije, vrstu refleksije i vrijednost te dinamičku vrstu i vrijednost.