Apa Refleksi di Golang

Apa Refleksi Di Golang



Refleksi di Golang memungkinkan program untuk memeriksa dan memodifikasi struktur data, tipe, dan nilai saat runtime. Ini menyediakan satu set fungsi yang memungkinkan kita untuk memeriksa tipe dan nilai variabel apa pun saat runtime, membuat contoh tipe baru, dan memodifikasi nilai variabel yang ada. Artikel ini membahas berbagai fungsi Golang dalam paket refleksi.

Daftar isi

Go adalah bahasa yang diketik secara statis sehingga jenis variabel harus diketahui pada waktu kompilasi. Namun, dalam skenario tertentu, mungkin perlu menangani nilai yang jenisnya tidak dapat ditentukan hingga program dijalankan.







Misalnya, kita mungkin perlu menulis sebuah fungsi yang dapat bekerja dengan tipe argumen yang berbeda, atau kita mungkin perlu membuat serialisasi dan deserialisasi data dari tipe yang tidak diketahui. Di sinilah paket refleksi digunakan di Golang.



Refleksikan Paket di Go

Paket reflect menyediakan satu set fungsi yang memungkinkan kita untuk memeriksa dan memanipulasi nilai pada waktu proses, apa pun jenisnya. Dengan fungsi-fungsi ini, kita dapat memperoleh informasi tentang tipe dan nilai variabel apa pun, membuat turunan tipe baru, dan mengubah nilai variabel yang ada.



Paket refleksi di Golang berisi dua jenis: Jenis dan Nilai. Tipe mewakili tipe Go, seperti int, string, atau struct kustom. Nilai mewakili nilai dari jenis tertentu, seperti 42 atau 'halo'.





Paket reflect juga menyediakan satu set fungsi yang memungkinkan kita untuk mendapatkan objek Type dan Value dari variabel. Misalnya, fungsi reflect.TypeOf() mengembalikan objek Type yang mewakili tipe variabel, sedangkan fungsi reflect.ValueOf() memberikan objek Value yang menunjukkan nilai variabel.

Pada bagian berikut, kita akan menjelajahi beberapa fungsi yang umum digunakan dalam paket reflect.



fungsi reflect.Copy()

Fungsi reflect.Copy() dari paket reflect digunakan untuk menyalin nilai dari satu slice ke slice yang lain. Dibutuhkan dua parameter, dst, dan src, yang keduanya harus berupa nilai irisan dengan tipe elemen yang sama. Fungsi menyalin nilai dari irisan src ke dalam irisan dst dan mengembalikan jumlah elemen yang telah disalin.

Fungsi reflect.Copy() ditunjukkan dalam contoh berikut:

kemasan utama

impor (

'fmt'
'mencerminkan'
)
fungsi utama () {
src := [] int { 1 , 2 , 3 , 4 , 5 }
dst := membuat ([] int , hanya ( src ))
N := mencerminkan . Menyalin ( mencerminkan . Nilai dari ( dst ), mencerminkan . Nilai dari ( src ))
fmt . Println ( N ) // Keluaran: 5
fmt . Println ( dst ) // Keluaran: [1 2 3 4 5]


}

Dalam contoh ini, kami membuat irisan sumber src dengan beberapa nilai integer, dan irisan tujuan dst dengan panjang yang sama dengan src. Kami kemudian memanggil reflect.Copy() untuk menyalin nilai dari src ke dst dan mencetak jumlah elemen yang disalin (n) dan konten dari potongan dst.

fungsi reflect.DeepEqual()

Fungsi reflect.DeepEqual() dari paket reflect digunakan untuk membandingkan dua nilai untuk kesetaraan. Fungsi ini memiliki dua parameter input yaitu a dan b, keduanya dapat berupa nilai apa pun dari jenis apa pun. Fungsi mengembalikan nilai true jika a dan b sangat sama, artinya nilai dasarnya sama secara rekursif. Kalau tidak, ternyata salah.

Contoh berikut menunjukkan cara menggunakan reflect.DeepEqual():

kemasan utama

impor (

'fmt'
'mencerminkan'
)
fungsi utama () {
A := [] int { 1 , 2 , 3 }
B := [] int { 1 , 2 , 3 }
jika mencerminkan . DeepEqual ( A , B ) {
fmt . Println ( 'a dan b sama' )
} kalau tidak {
fmt . Println ( 'a dan b tidak sama' )
}


}

Dalam contoh ini, kami membuat dua irisan a dan b dengan nilai integer yang sama. Kami kemudian memanggil reflect.DeepEqual() untuk membandingkan a dan b untuk kesetaraan dan mencetak hasilnya.

reflect.Swapper() Fungsi

Fungsi reflect.Swapper() dari paket reflect digunakan untuk mengembalikan fungsi yang dapat menukar elemen dari sebuah slice. Dibutuhkan satu parameter, v, yang harus berupa nilai irisan. Fungsi mengembalikan fungsi yang mengambil dua parameter bilangan bulat, i dan j, dan menukar elemen irisan pada posisi i dan j.

Penggunaan reflect.Swapper() dapat ditunjukkan melalui contoh berikut:

kemasan utama

impor (

'fmt'
'mencerminkan'
)
fungsi utama () {
S := [] int { 1 , 2 , 3 , 4 , 5 }
menukar := mencerminkan . Penukar ( S )
menukar ( 1 , 3 )
fmt . Println ( S ) // Keluaran: [1 4 3 2 5]


}

Dalam contoh ini, kami membuat sebuah irisan bernama s dengan beberapa nilai bilangan bulat. Kami kemudian memanggil reflect.Swapper() untuk mendapatkan swap fungsi yang dapat menukar elemen dari slice. Kami menggunakan swap untuk menukar elemen pada posisi 1 dan 3 dari irisan s dan mencetak hasilnya.

reflect.TypeOf() Fungsi

reflect.TypeOf() digunakan untuk mendapatkan tipe nilai. Fungsi ini menerima satu parameter 'v' yang dapat berupa jenis atau nilai apa pun. Fungsi mengembalikan nilai reflect.Type yang mewakili tipe nilai.

Penggunaan reflect.TypeOf() dapat ditunjukkan melalui contoh berikut:

kemasan utama

impor (

'fmt'
'mencerminkan'
)
fungsi utama () {
dulu X float64 = 3 . 14
T := mencerminkan . Jenis ( X )
fmt . Println ( T ) // Keluaran: float64


}

Dalam contoh ini, kami membuat variabel float64 x dengan nilai 3,14. Kami kemudian memanggil reflect.TypeOf() untuk mendapatkan tipe x dan menyimpan hasilnya dalam variabel reflect.Type t. Kami mencetak nilai t, yaitu float64.

reflect.ValueOf() Fungsi

reflect.ValueOf() bisa mendapatkan representasi reflect.Value dari sebuah nilai. Dibutuhkan satu parameter v, yang dapat berupa nilai apa pun dari jenis apa pun. Fungsi mengembalikan nilai reflect.Value yang mewakili nilai parameter input.

Penggunaan reflect.ValueOf() dapat ditunjukkan melalui contoh berikut:

kemasan utama

impor (

'fmt'
'mencerminkan'
)
fungsi utama () {
dulu X float64 = 3 . 14
di dalam := mencerminkan . Nilai dari ( X )
fmt . Println ( di dalam ) // Keluaran: 3.14

}

Dalam contoh ini, kami membuat variabel float64 x dengan nilai 3,14. Kami kemudian memanggil reflect.ValueOf() untuk mendapatkan representasi nilai refleksi dari x dan menyimpan hasilnya dalam variabel nilai refleksi v. Kami mencetak nilai v, yaitu 3,14.

Paket reflect menyediakan banyak fungsi di luar yang disebutkan, dan ini hanyalah beberapa contoh. Dengan menggunakan fungsi-fungsi yang disediakan oleh paket reflect, kita dapat membuat kode yang dapat bekerja dengan nilai tipe apapun, tanpa perlu mengetahui tipenya pada saat kompilasi.

Kesimpulan

Refleksi di Golang memungkinkan program untuk memeriksa dan memodifikasi struktur data, tipe, dan nilai saat runtime. Ini diimplementasikan melalui paket reflect, yang menyediakan fungsi untuk memeriksa dan memanipulasi tipe dan nilai. Refleksi sangat berguna saat bekerja dengan antarmuka, tipe yang tidak diketahui, atau saat Anda perlu mengimplementasikan fungsi generik. Artikel ini membahas dasar-dasar refleksi di Golang, termasuk paket refleksi, Tipe dan Nilai refleksi, dan tipe dan nilai dinamis.