Czym jest odbicie w Golang

Czym Jest Odbicie W Golang



Reflection w Golang pozwala programowi badać i modyfikować struktury danych, typy i wartości w czasie wykonywania. Zapewnia zestaw funkcji, które pozwalają nam badać typ i wartość dowolnej zmiennej w czasie wykonywania, tworzyć nowe instancje typów i modyfikować wartość istniejących zmiennych. W tym artykule omówiono różne funkcje Golanga w pakiecie Reflect.

Spis treści

Go jest językiem o typie statycznym, więc typ zmiennej musi być znany w czasie kompilacji. Jednak w niektórych scenariuszach może być konieczne obsłużenie wartości, których typu nie można określić, dopóki program nie zostanie wykonany.







Na przykład może być konieczne napisanie funkcji, która może działać z różnymi typami argumentów, lub może być konieczne serializowanie i deserializacja danych nieznanych typów. W tym miejscu używany jest pakiet reflect w Golang.



Odzwierciedlaj pakiet w Go

Pakiet Reflect zapewnia zestaw funkcji, które pozwalają nam sprawdzać wartości i manipulować nimi w czasie wykonywania, niezależnie od ich typu. Dzięki tym funkcjom możemy uzyskać informacje o typie i wartości dowolnej zmiennej, tworzyć nowe instancje typów oraz modyfikować wartość istniejących zmiennych.



Pakiet Reflect w Golang zawiera dwa typy: Typ i wartość. Type reprezentuje typ Go, taki jak int, string lub struktura niestandardowa. Wartość reprezentuje wartość określonego typu, na przykład 42 lub „cześć”.





Pakiet Reflect zapewnia również zestaw funkcji, które pozwalają nam uzyskać obiekty Type i Value ze zmiennych. Na przykład funkcja reflect.TypeOf() zwraca obiekt Type, który reprezentuje typ zmiennej, podczas gdy funkcja reflect.ValueOf() zwraca obiekt Value, który pokazuje wartość zmiennej.

W poniższych sekcjach przyjrzymy się niektórym często używanym funkcjom pakietu reflect.



odbijaj.Kopiuj() Funkcja

Funkcja reflect.Copy() pakietu reflect służy do kopiowania wartości jednego wycinka do drugiego. Wymaga dwóch parametrów, dst i src, z których oba muszą być wartościami wycinków o tym samym typie elementu. Funkcja kopiuje wartości z wycinka src do wycinka dst i zwraca liczbę skopiowanych elementów.

Funkcja reflect.Copy() została zademonstrowana w poniższym przykładzie:

pakiet główny

import (

'fmt'
'odbijać'
)
funkcja główny () {
źródło := [] int { 1 , 2 , 3 , 4 , 5 }
czas letni := robić ([] int , tylko ( źródło ))
N := odbijać . Kopiuj ( odbijać . Wartość ( czas letni ), odbijać . Wartość ( źródło ))
fmt . Drukuj ln ( N ) // Dane wyjściowe: 5
fmt . Drukuj ln ( czas letni ) // Dane wyjściowe: [1 2 3 4 5]


}

W tym przykładzie tworzymy źródłowy wycinek src z pewnymi wartościami całkowitymi i docelowy wycinek dst o tej samej długości co src. Następnie wywołujemy reflect.Copy(), aby skopiować wartości z src do dst i wydrukować liczbę skopiowanych elementów (n) oraz zawartość wycinka dst.

Reflect.DeepEqual() Funkcja

Funkcja reflect.DeepEqual() pakietu reflect służy do porównania dwóch wartości pod kątem równości. Ta funkcja ma dwa parametry wejściowe, a i b, z których oba mogą mieć dowolną wartość dowolnego typu. Funkcja zwraca wartość true, jeśli a i b są głęboko równe, co oznacza, że ​​ich podstawowe wartości są rekurencyjnie równe. W przeciwnym razie okazuje się, że jest fałszywa.

Poniższy przykład pokazuje, jak używać funkcji reflect.DeepEqual():

pakiet główny

import (

'fmt'
'odbijać'
)
funkcja główny () {
A := [] int { 1 , 2 , 3 }
B := [] int { 1 , 2 , 3 }
Jeśli odbijać . Głębokie Równe ( A , B ) {
fmt . Drukuj ln ( „a i b są równe” )
} w przeciwnym razie {
fmt . Drukuj ln ( „a i b nie są równe” )
}


}

W tym przykładzie tworzymy dwa wycinki a i b z takimi samymi wartościami całkowitymi. Następnie wywołujemy funkcję reflect.DeepEqual() w celu porównania aib pod kątem równości i wyświetlenia wyniku.

Reflect.Swapper() Funkcja

Funkcja reflect.Swapper() pakietu reflect służy do zwracania funkcji, która może zamieniać elementy wycinka. Pobiera pojedynczy parametr, v, który musi być wartością wycinka. Funkcja zwraca funkcję, która przyjmuje dwa parametry całkowite, i oraz j, i zamienia elementy wycinka na pozycjach i oraz j.

Użycie metody reflect.Swapper() można zademonstrować na poniższym przykładzie:

pakiet główny

import (

'fmt'
'odbijać'
)
funkcja główny () {
S := [] int { 1 , 2 , 3 , 4 , 5 }
zamieniać := odbijać . Zamiana ( S )
zamieniać ( 1 , 3 )
fmt . Drukuj ln ( S ) // Dane wyjściowe: [1 4 3 2 5]


}

W tym przykładzie utworzyliśmy wycinek o nazwie s z pewnymi wartościami całkowitymi. Następnie wywołujemy reflect.Swapper(), aby uzyskać zamianę funkcji, która może zamieniać elementy wycinka. Używamy swap, aby zamienić elementy na pozycjach 1 i 3 wycinka s i wydrukować wynik.

odzwierciedlać.TypeOf() Funkcja

Reflect.TypeOf() służy do pobierania typu wartości. Ta funkcja akceptuje pojedynczy parametr „v”, który może być dowolnego typu lub mieć dowolną wartość. Funkcja zwraca wartość reflect.Type, która reprezentuje typ wartości.

Użycie metody reflect.TypeOf() można zademonstrować na poniższym przykładzie:

pakiet główny

import (

'fmt'
'odbijać'
)
funkcja główny () {
był X pływak64 = 3 . 14
T := odbijać . Typ ( X )
fmt . Drukuj ln ( T ) // Wyjście: float64


}

W tym przykładzie tworzymy zmienną float64 x o wartości 3,14. Następnie wywołujemy metodę reflect.TypeOf(), aby pobrać typ x i zapisać wynik w zmiennej reflect.Type t. Drukujemy wartość t, czyli float64.

funkcja Reflect.ValueOf().

Funkcja reflect.ValueOf() może uzyskać reprezentację wartości w postaci reflect.Value. Przyjmuje pojedynczy parametr v, którym może być dowolna wartość dowolnego typu. Funkcja zwraca wartość reflect.Value, która reprezentuje wartość parametru wejściowego.

Użycie metody reflect.ValueOf() można zademonstrować na poniższym przykładzie:

pakiet główny

import (

'fmt'
'odbijać'
)
funkcja główny () {
był X pływak64 = 3 . 14
W := odbijać . Wartość ( X )
fmt . Drukuj ln ( W ) // Dane wyjściowe: 3.14

}

W tym przykładzie tworzymy zmienną float64 x o wartości 3,14. Następnie wywołujemy reflect.ValueOf() , aby uzyskać reprezentację x z wartością odbicia i zapisać wynik w zmiennej wartości odbicia v. Drukujemy wartość v, która wynosi 3,14.

Pakiet Reflect zapewnia wiele funkcji poza tymi wymienionymi, a to tylko kilka przykładów. Korzystając z funkcji dostarczanych przez pakiet reflect, możemy stworzyć kod, który może pracować z wartościami dowolnego typu, bez konieczności znajomości typu w czasie kompilacji.

Wniosek

Reflection w Golang pozwala programowi badać i modyfikować struktury danych, typy i wartości w czasie wykonywania. Jest implementowany przez pakiet reflect, który udostępnia funkcje do sprawdzania typów i wartości oraz manipulowania nimi. Odbicie jest szczególnie przydatne podczas pracy z interfejsami, nieznanymi typami lub gdy trzeba zaimplementować funkcje ogólne. W tym artykule omówiono podstawy odbicia w Golang, w tym pakiet odbicia, typ i wartość odbicia oraz dynamiczny typ i wartość.