Hvad er refleksion i Golang

Hvad Er Refleksion I Golang



Reflektion i Golang giver et program mulighed for at undersøge og ændre datastrukturer, typer og værdier under kørsel. Det giver et sæt funktioner, der giver os mulighed for at undersøge typen og værdien af ​​enhver variabel under kørsel, oprette nye forekomster af typer og ændre værdien af ​​eksisterende variabler. Denne artikel dækker forskellige Golang-funktioner i refleksionspakken.

Indholdsfortegnelse

Go er et statisk skrevet sprog, så typen af ​​en variabel skal være kendt på kompileringstidspunktet. I visse scenarier kan det dog være nødvendigt at håndtere værdier, hvis typer ikke kan bestemmes, før programmet er afviklet.







Det kan for eksempel være, at vi skal skrive en funktion, der kan arbejde med forskellige typer argumenter, eller vi skal muligvis serialisere og deserialisere data af ukendte typer. Det er her refleksionspakken bruges i Golang.



Reflektér pakke i Go

reflect-pakken indeholder et sæt funktioner, der giver os mulighed for at inspicere og manipulere værdier under kørsel, uanset deres type. Med disse funktioner kan vi få information om typen og værdien af ​​enhver variabel, oprette nye forekomster af typer og ændre værdien af ​​eksisterende variabler.



Reflekspakken i Golang indeholder to typer: Type og værdi. En Type repræsenterer en Go-type, såsom int, streng eller en brugerdefineret struktur. En værdi repræsenterer en værdi af en bestemt type, såsom 42 eller 'hej'.





reflect-pakken indeholder også et sæt funktioner, der giver os mulighed for at hente Type- og Value-objekter fra variabler. For eksempel returnerer funktionen reflect.TypeOf() et Type-objekt, der repræsenterer typen af ​​en variabel, mens funktionen reflect.ValueOf() giver et Værdi-objekt, der viser variabelværdi.

I de følgende afsnit vil vi udforske nogle af de almindeligt anvendte funktioner i refleksionspakken.



reflect.Copy() Funktion

reflect.Copy()-funktionen i reflect-pakken bruges til at kopiere værdierne af et udsnit til et andet udsnit. Det kræver to parametre, dst og src, som begge skal være udsnitsværdier med samme elementtype. Funktionen kopierer værdierne fra src-udsnittet til dst-udsnittet og returnerer antallet af elementer, der blev kopieret.

funktionen reflect.Copy() er demonstreret i følgende eksempel:

pakke vigtigste

importere (

'fmt'
'afspejle'
)
func vigtigste () {
src := [] int { 1 , 2 , 3 , 4 , 5 }
dst := lave ([] int , kun ( src ))
n := afspejle . Kopi ( afspejle . Værdi af ( dst ), afspejle . Værdi af ( src ))
fmt . Println ( n ) // Output: 5
fmt . Println ( dst ) // Output: [1 2 3 4 5]


}

I dette eksempel opretter vi et kildeudsnit src med nogle heltalsværdier og et destinationsudsnit dst med samme længde som src. Vi kalder derefter reflect.Copy() for at kopiere værdierne fra src til dst og udskrive antallet af elementer, der blev kopieret (n) og indholdet af dst-udsnittet.

reflect.DeepEqual() Funktion

reflect.DeepEqual()-funktionen af ​​reflect-pakken bruges til at sammenligne to værdier for lighed. Denne funktion har to inputparametre, som er a og b, som begge kan have en hvilken som helst værdi af enhver type. Funktionen returnerer sand, hvis a og b er dybt ens, hvilket betyder, at deres underliggende værdier er rekursivt ens. Ellers viser det sig at være falsk.

Følgende eksempel viser, hvordan reflect.DeepEqual():

pakke vigtigste

importere (

'fmt'
'afspejle'
)
func vigtigste () {
-en := [] int { 1 , 2 , 3 }
b := [] int { 1 , 2 , 3 }
hvis afspejle . DeepEqual ( -en , b ) {
fmt . Println ( 'a og b er lige store' )
} andet {
fmt . Println ( 'a og b er ikke ens' )
}


}

I dette eksempel opretter vi to skiver a og b med de samme heltalsværdier. Vi kalder derefter reflect.DeepEqual() for at sammenligne a og b for lighed og udskrive resultatet.

reflect.Swapper() Funktion

reflect.Swapper()-funktionen af ​​reflect-pakken bruges til at returnere en funktion, der kan bytte elementerne i et udsnit. Det kræver en enkelt parameter, v, som skal være en udsnitsværdi. Funktionen returnerer en funktion, der tager to heltalsparametre, i og j, og ombytter elementerne i udsnittet ved positionerne i og j.

Brugen af ​​reflect.Swapper() kan demonstreres gennem følgende eksempel:

pakke vigtigste

importere (

'fmt'
'afspejle'
)
func vigtigste () {
s := [] int { 1 , 2 , 3 , 4 , 5 }
bytte rundt := afspejle . Bytter ( s )
bytte rundt ( 1 , 3 )
fmt . Println ( s ) // Output: [1 4 3 2 5]


}

I dette eksempel oprettede vi et udsnit med navnet s med nogle heltalsværdier. Vi kalder derefter reflect.Swapper() for at få en funktionsswap, der kan bytte elementer af udsnittet. Vi bruger swap til at bytte elementerne på position 1 og 3 i s-skiven og udskrive resultatet.

reflect.TypeOf() Funktion

Reflect.TypeOf() bruges til at få typen af ​​en værdi. Denne funktion accepterer en enkelt parameter 'v', der kan være af enhver type eller værdi. Funktionen returnerer en reflect.Type-værdi, der repræsenterer værdiens type.

Brugen af ​​reflect.TypeOf() kan demonstreres gennem følgende eksempel:

pakke vigtigste

importere (

'fmt'
'afspejle'
)
func vigtigste () {
var x flyde 64 = 3 . 14
t := afspejle . Type ( x )
fmt . Udskrivln ( t ) // Output: float64


}

I dette eksempel opretter vi en float64-variabel x med værdien 3,14. Vi kalder derefter reflect.TypeOf() for at få typen af ​​x og gemmer resultatet i en reflect.Type-variabel t. Vi udskriver værdien af ​​t, som er float64.

reflect.ValueOf() Funktion

reflect.ValueOf() kan få en reflect.Value-repræsentation af en værdi. Det kræver en enkelt parameter v, som kan være enhver værdi af enhver type. Funktionen returnerer en reflect.Value-værdi, der repræsenterer værdien af ​​inputparameteren.

Brugen af ​​reflect.ValueOf() kan demonstreres gennem følgende eksempel:

pakke vigtigste

importere (

'fmt'
'afspejle'
)
func vigtigste () {
var x flyde 64 = 3 . 14
i := afspejle . Værdi af ( x )
fmt . Udskrivln ( i ) // Output: 3,14

}

I dette eksempel opretter vi en float64-variabel x med værdien 3,14. Vi kalder derefter reflect.ValueOf() for at få en reflect-value-repræsentation af x og gemmer resultatet i en reflect-value-variabel v. Vi udskriver værdien af ​​v, som er 3,14.

Reflekspakken indeholder adskillige funktioner ud over de nævnte, og disse er blot nogle få eksempler. Ved at bruge funktionerne i reflect-pakken kan vi skabe kode, der kan arbejde med værdier af enhver type, uden at vi behøver at kende typen på kompileringstidspunktet.

Konklusion

Reflektion i Golang giver et program mulighed for at undersøge og ændre datastrukturer, typer og værdier under kørsel. Det implementeres gennem reflect-pakken, som giver funktioner til at inspicere og manipulere typer og værdier. Refleksion er især nyttig, når du arbejder med grænseflader, ukendte typer, eller når du skal implementere generiske funktioner. Denne artikel diskuterede det grundlæggende i refleksion i Golang, herunder refleksionspakken, reflekterende type og værdi og dynamisk type og værdi.