Какво е отражение в Golang

Kakvo E Otrazenie V Golang



Отражението в Golang позволява на програмата да изследва и модифицира структури от данни, типове и стойности по време на изпълнение. Той предоставя набор от функции, които ни позволяват да изследваме типа и стойността на всяка променлива по време на изпълнение, да създаваме нови екземпляри на типове и да променяме стойността на съществуващите променливи. Тази статия обхваща различни функции на Golang в пакета reflect.

Съдържание

Go е статично типизиран език, така че типът на променливата трябва да бъде известен по време на компилиране. Въпреки това, в определени сценарии може да е необходимо да се обработват стойности, чиито типове не могат да бъдат определени, докато програмата не бъде изпълнена.







Например, може да се наложи да напишем функция, която може да работи с различни типове аргументи, или може да се наложи да сериализираме и десериализираме данни от неизвестни типове. Тук се използва отразяващият пакет в Golang.



Отразете пакета в Go

Пакетът reflect предоставя набор от функции, които ни позволяват да проверяваме и манипулираме стойности по време на изпълнение, независимо от техните типове. С тези функции можем да получим информация за типа и стойността на всяка променлива, да създадем нови екземпляри на типове и да променим стойността на съществуващи променливи.



Пакетът отразяване в Golang съдържа два типа: Тип и стойност. Типът представлява тип Go, като int, string или персонализирана структура. Стойността представлява стойност от определен тип, като например 42 или „здравей“.





Пакетът reflect също предоставя набор от функции, които ни позволяват да получаваме обекти тип и стойност от променливи. Например функцията reflect.TypeOf() връща обект Type, който представлява типа на променлива, докато функцията reflect.ValueOf() дава обект Value, който показва стойността на променливата.

В следващите раздели ще разгледаме някои от често използваните функции в пакета reflect.



Функция reflect.Copy().

Функцията reflect.Copy() на пакета reflect се използва за копиране на стойностите на един срез в друг срез. Необходими са два параметъра, dst и src, като и двата трябва да са стойности на сегмент с един и същи тип елемент. Функцията копира стойностите от src среза в dst среза и връща броя елементи, които са били копирани.

Функцията reflect.Copy() е демонстрирана в следния пример:

пакет основен

импортиране (

'fmt'
'отразявам'
)
функ основен () {
src := [] вътр { 1 , 2 , 3 , 4 , 5 }
dst := направи ([] вътр , само ( src ))
н := отразявам . копие ( отразявам . Стойност на ( dst ), отразявам . Стойност на ( src ))
fmt . Println ( н ) // Изход: 5
fmt . Println ( dst ) // Изход: [1 2 3 4 5]


}

В този пример създаваме изходен отрязък src с някои цели числа и целеви отрязък dst със същата дължина като src. След това извикваме reflect.Copy(), за да копираме стойностите от src в dst и да отпечатаме броя на елементите, които са били копирани (n) и съдържанието на dst среза.

Функция reflect.DeepEqual().

Функцията reflect.DeepEqual() на пакета reflect се използва за сравняване на две стойности за равенство. Тази функция има два входни параметъра, които са a и b, като и двата могат да имат произволна стойност от произволен тип. Функцията връща true, ако a и b са дълбоко равни, което означава, че техните основни стойности са рекурсивно равни. В противен случай се оказва невярно.

Следният пример показва как да използвате reflect.DeepEqual():

пакет основен

импортиране (

'fmt'
'отразявам'
)
функ основен () {
а := [] вътр { 1 , 2 , 3 }
b := [] вътр { 1 , 2 , 3 }
ако отразявам . DeepEqual ( а , b ) {
fmt . Println ( 'a и b са равни' )
} друго {
fmt . Println ( 'a и b не са равни' )
}


}

В този пример създаваме два сегмента a и b с еднакви цели числа. След това извикваме reflect.DeepEqual(), за да сравним a и b за равенство и да отпечатаме резултата.

Функция reflect.Swapper().

Функцията reflect.Swapper() на пакета reflect се използва за връщане на функция, която може да разменя елементите на среза. Той приема един параметър, v, който трябва да бъде стойност на срез. Функцията връща функция, която приема два целочислени параметъра, i и j, и разменя елементите на среза на позиции i и j.

Използването на reflect.Swapper() може да се демонстрира чрез следния пример:

пакет основен

импортиране (

'fmt'
'отразявам'
)
функ основен () {
с := [] вътр { 1 , 2 , 3 , 4 , 5 }
размяна := отразявам . Разменник ( с )
размяна ( 1 , 3 )
fmt . Println ( с ) // Изход: [1 4 3 2 5]


}

В този пример създадохме секция с име s с някои цели числа. След това извикваме reflect.Swapper(), за да получим функция swap, която може да разменя елементи на среза. Използваме swap, за да разменим елементите на позиции 1 и 3 на s среза и да отпечатаме резултата.

отразява функция.TypeOf().

Отражението.TypeOf() се използва за получаване на типа на стойност. Тази функция приема един параметър „v“, който може да бъде от произволен тип или стойност. Функцията връща стойност reflect.Type, която представлява типа на стойността.

Използването на reflect.TypeOf() може да се демонстрира чрез следния пример:

пакет основен

импортиране (

'fmt'
'отразявам'
)
функ основен () {
беше х float64 = 3 . 14
T := отразявам . Тип ( х )
fmt . Println ( T ) // Изход: float64


}

В този пример създаваме float64 променлива x със стойност 3.14. След това извикваме reflect.TypeOf(), за да получим типа x и да съхраним резултата в променлива t на reflect.Type. Отпечатваме стойността на t, която е float64.

Функция reflect.ValueOf().

The reflect.ValueOf() може да получи отразяване.Value представяне на стойност. Той приема един параметър v, който може да бъде всяка стойност от всякакъв тип. Функцията връща стойност reflect.Value, която представлява стойността на входния параметър.

Използването на reflect.ValueOf() може да се демонстрира чрез следния пример:

пакет основен

импортиране (

'fmt'
'отразявам'
)
функ основен () {
беше х float64 = 3 . 14
в := отразявам . Стойност на ( х )
fmt . Println ( в ) // Изход: 3.14

}

В този пример създаваме float64 променлива x със стойност 3.14. След това извикваме reflect.ValueOf(), за да получим представяне на отразяваща стойност на x и съхраняваме резултата в променлива v на отразяваща стойност. Отпечатваме стойността на v, която е 3,14.

Пакетът reflect предоставя множество функции извън споменатите и това са само няколко примера. Като използваме функциите, предоставени от пакета reflect, можем да създадем код, който може да работи със стойности от всякакъв тип, без да е необходимо да знаем типа по време на компилация.

Заключение

Отражението в Golang позволява на програмата да изследва и модифицира структури от данни, типове и стойности по време на изпълнение. Той се реализира чрез пакета reflect, който предоставя функции за проверка и манипулиране на типове и стойности. Отражението е особено полезно при работа с интерфейси, неизвестни типове или когато трябва да внедрите общи функции. Тази статия обсъди основите на отражението в Golang, включително пакета за отражение, отразяващ тип и стойност и динамичен тип и стойност.