Čo je odraz v Golang

Co Je Odraz V Golang



Reflection in Golang umožňuje programu skúmať a upravovať dátové štruktúry, typy a hodnoty za behu. Poskytuje sadu funkcií, ktoré nám umožňujú skúmať typ a hodnotu akejkoľvek premennej za behu, vytvárať nové inštancie typov a upravovať hodnotu existujúcich premenných. Tento článok sa zaoberá rôznymi funkciami Golang v balíku Reflect.

Obsah

Go je staticky typovaný jazyk, takže typ premennej musí byť známy v čase kompilácie. V určitých scenároch však môže byť potrebné spracovať hodnoty, ktorých typy nemožno určiť, kým sa program nespustí.







Môžeme napríklad potrebovať napísať funkciu, ktorá dokáže pracovať s rôznymi typmi argumentov, alebo možno budeme musieť serializovať a deserializovať údaje neznámych typov. Tu sa v Golangu používa reflexný balík.



Reflect Package in Go

Balíček Reflect poskytuje sadu funkcií, ktoré nám umožňujú kontrolovať a manipulovať s hodnotami za behu, bez ohľadu na ich typ. Pomocou týchto funkcií môžeme získať informácie o type a hodnote ľubovoľnej premennej, vytvárať nové inštancie typov a upravovať hodnotu existujúcich premenných.



Balíček odráža v Golang obsahuje dva typy: Typ a hodnota. Typ predstavuje typ Go, ako napríklad int, reťazec alebo vlastná štruktúra. Hodnota predstavuje hodnotu špecifického typu, napríklad 42 alebo „ahoj“.





Balíček Reflect poskytuje aj sadu funkcií, ktoré nám umožňujú získavať objekty Type a Value z premenných. Napríklad funkcia reflect.TypeOf() vracia objekt Type, ktorý predstavuje typ premennej, zatiaľ čo funkcia reflect.ValueOf() poskytuje objekt Value, ktorý zobrazuje hodnotu premennej.

V nasledujúcich častiach preskúmame niektoré bežne používané funkcie v balíku Reflect.



Reflect.Copy() Funkcia

Funkcia reflect.Copy() balíka reflect sa používa na skopírovanie hodnôt jedného rezu do iného rezu. Vyžaduje dva parametre, dst a src, pričom oba musia predstavovať hodnoty rezu s rovnakým typom prvku. Funkcia skopíruje hodnoty z rezu src do rezu dst a vráti počet prvkov, ktoré boli skopírované.

Funkcia reflect.Copy() je demonštrovaná v nasledujúcom príklade:

balík Hlavná

importovať (

'fmt'
'reflektovať'
)
func Hlavná () {
src := [] int { 1 , 2 , 3 , 4 , 5 }
dst := urobiť ([] int , len ( src ))
n := odrážať . Kopírovať ( odrážať . Hodnota ( dst ), odrážať . Hodnota ( src ))
fmt . Println ( n ) // Výstup: 5
fmt . Println ( dst ) // Výstup: [1 2 3 4 5]


}

V tomto príklade vytvoríme zdrojový rez src s niektorými celočíselnými hodnotami a cieľový rez dst s rovnakou dĺžkou ako src. Potom zavoláme Reflect.Copy() na skopírovanie hodnôt z src do dst a vytlačíme počet prvkov, ktoré boli skopírované (n) a obsah časti dst.

Reflect.DeepEqual() Funkcia

Funkcia reflect.DeepEqual() balíka reflect sa používa na porovnanie dvoch hodnôt rovnosti. Táto funkcia má dva vstupné parametre, ktorými sú a a b, pričom oba môžu mať akúkoľvek hodnotu akéhokoľvek typu. Funkcia vráti hodnotu true, ak sú a a b hlboko rovnaké, čo znamená, že ich základné hodnoty sú rekurzívne rovnaké. V opačnom prípade sa to ukáže ako nepravdivé.

Nasledujúci príklad ukazuje, ako používať reflect.DeepEqual():

balík Hlavná

importovať (

'fmt'
'odrážať'
)
func Hlavná () {
a := [] int { 1 , 2 , 3 }
b := [] int { 1 , 2 , 3 }
ak odrážať . DeepEqual ( a , b ) {
fmt . Println ( 'a a b sú rovnaké' )
} inak {
fmt . Println ( 'a a b nie sú rovnaké' )
}


}

V tomto príklade vytvoríme dva rezy a a b s rovnakými celočíselnými hodnotami. Potom zavoláme reflect.DeepEqual(), aby sme porovnali a a b pre rovnosť a vytlačili výsledok.

Reflect.Swapper() Funkcia

Funkcia reflect.Swapper() balíka reflect sa používa na vrátenie funkcie, ktorá môže zamieňať prvky rezu. Vyžaduje jeden parameter v, ktorý musí byť hodnotou rezu. Funkcia vracia funkciu, ktorá preberá dva celočíselné parametre, i a j, a zamieňa prvky rezu na pozíciách i a j.

Použitie reflect.Swapper() možno demonštrovať na nasledujúcom príklade:

balík Hlavná

importovať (

'fmt'
'reflektovať'
)
func Hlavná () {
s := [] int { 1 , 2 , 3 , 4 , 5 }
vymeniť := odrážať . Swapper ( s )
vymeniť ( 1 , 3 )
fmt . Println ( s ) // Výstup: [1 4 3 2 5]


}

V tomto príklade sme vytvorili rez s názvom s s niektorými celočíselnými hodnotami. Potom zavoláme reflect.Swapper(), aby sme získali funkciu swap, ktorá môže zamieňať prvky rezu. Pomocou swap vymeníme prvky na pozíciách 1 a 3 rezu s a vytlačíme výsledok.

Reflect.TypeOf() Funkcia

Reflect.TypeOf() sa používa na získanie typu hodnoty. Táto funkcia akceptuje jeden parameter „v“, ktorý môže byť akéhokoľvek typu alebo hodnoty. Funkcia vracia hodnotu reflect.Type, ktorá predstavuje typ hodnoty.

Použitie reflect.TypeOf() možno demonštrovať na nasledujúcom príklade:

balík Hlavná

importovať (

'fmt'
'reflektovať'
)
func Hlavná () {
bol X plavák64 = 3 . 14
t := odrážať . Typ ( X )
fmt . Println ( t ) // Výstup: float64


}

V tomto príklade vytvoríme premennú x s float64 s hodnotou 3,14. Potom zavoláme reflect.TypeOf(), aby sme získali typ x a výsledok uložili do premennej Reflect.Type t. Vytlačíme hodnotu t, ktorá je float64.

Reflect.ValueOf() Funkcia

Reflect.ValueOf() môže získať odraz.Value reprezentáciu hodnoty. Vyžaduje jeden parameter v, ktorým môže byť ľubovoľná hodnota akéhokoľvek typu. Funkcia vracia hodnotu reflect.Value, ktorá predstavuje hodnotu vstupného parametra.

Použitie reflect.ValueOf() možno demonštrovať na nasledujúcom príklade:

balík Hlavná

importovať (

'fmt'
'reflektovať'
)
func Hlavná () {
bol X plavák64 = 3 . 14
    v := odrážať . Hodnota ( X )
fmt . Println ( v ) // Výstup: 3.14

}

V tomto príklade vytvoríme premennú x s float64 s hodnotou 3,14. Potom zavoláme Reflect.ValueOf(), aby sme získali reprezentáciu reflektovanej hodnoty x a výsledok uložili do premennej reflektovanej hodnoty v. Vytlačíme hodnotu v, ktorá je 3,14.

Balíček Reflect poskytuje množstvo funkcií nad rámec tých, ktoré sú spomenuté, a toto je len niekoľko príkladov. Použitím funkcií, ktoré poskytuje balík Reflect, môžeme vytvoriť kód, ktorý dokáže pracovať s hodnotami akéhokoľvek typu bez toho, aby sme potrebovali poznať typ v čase kompilácie.

Záver

Reflection in Golang umožňuje programu skúmať a upravovať dátové štruktúry, typy a hodnoty za behu. Je implementovaný prostredníctvom balíka Reflect, ktorý poskytuje funkcie na kontrolu a manipuláciu s typmi a hodnotami. Reflexia je užitočná najmä pri práci s rozhraniami, neznámymi typmi alebo keď potrebujete implementovať generické funkcie. Tento článok diskutoval o základoch reflexie v Golang, vrátane balíka odrazu, typu a hodnoty odrazu a dynamického typu a hodnoty.