πŸ’¬ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ рСфлСксия Π² go ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½Π°?



РСфлСксия Π² Go Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ reflect ΠΈ прСдставляСт собой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄Ρƒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ значСния, Ρ‚ΠΈΠΏΡ‹ ΠΈ структуры Π²ΠΎ врСмя выполнСния, Π±Π΅Π· Π·Π°Ρ€Π°Π½Π΅Π΅ извСстной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½ΠΈΡ….



РСфлСксия ΠΏΠΎΠ»Π΅Π·Π½Π° Π² ситуациях, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ нСизвСстного Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ сСриализации/дСсСриализации Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ORM систСм ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.



Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСфлСксии ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Ρ‘ значСния, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ динамичСски. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ, Π½ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ остороТно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ слоТному ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.



πŸ“Œ ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹



πŸ”ΈΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:



package main



import (

"fmt"

"reflect"

)



func main() {

x := 42

fmt.Println("Π’ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x:", reflect.TypeOf(x))

}





Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ reflect.TypeOf(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ int, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ x β€” Ρ†Π΅Π»ΠΎΠ΅ число.



πŸ”ΈΠ§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:



package main



import (

"fmt"

"reflect"

)



func main() {

x := 42

v := reflect.ValueOf(&x).Elem() // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ reflect.Value



fmt.Println("Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x:", x)

v.SetInt(43) // ИзмСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x

fmt.Println("НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x:", x)

}





Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ reflect.ValueOf() для получСния reflect.Value ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x, Π° Π·Π°Ρ‚Π΅ΠΌ измСняСм Π΅Ρ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetInt().



πŸ”ΈΠ”ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:



package main



import (

"fmt"

"reflect"

)



type MyStruct struct {

Field int

}



func (m *MyStruct) UpdateField(val int) {

m.Field = val

}



func main() {

x := MyStruct{Field: 10}



// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ reflect.Value структуры

v := reflect.ValueOf(&x)



// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

method := v.MethodByName("UpdateField")



// Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ

method.Call([]reflect.Value{reflect.ValueOf(20)})



fmt.Println("ОбновлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля:", x.Field)

}





Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм экзСмпляр структуры MyStruct, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ UpdateField с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MethodByName ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ динамичСски с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Call. ΠœΠ΅Ρ‚ΠΎΠ΄ обновляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля структуры.