Rumah >pembangunan bahagian belakang >Golang >Apakah Perbezaan Antara `reflect.ValueOf()` dan `Value.Elem()` dalam Go?

Apakah Perbezaan Antara `reflect.ValueOf()` dan `Value.Elem()` dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-13 17:04:10955semak imbas

What's the Difference Between `reflect.ValueOf()` and `Value.Elem()` in Go?

Memahami Perbezaan Antara reflect.ValueOf() dan Value.Elem()

Reflect.ValueOf() berfungsi sebagai pintu masuk ke refleksi , membolehkan anda mendapatkan pemerihalan nilai refleksi untuk nilai bukan pantulan seperti rentetan atau integer.

Sebaliknya, Value.Elem() berfungsi sebagai kaedah dalam reflect.Value. Ia boleh digunakan untuk mendapatkan semula nilai (juga mencerminkan.Nilai) yang dirujuk oleh nilai yang dirangkumkan oleh mencerminkan asal.Nilai. Ambil perhatian bahawa reflect.Indirect() juga boleh digunakan untuk tujuan ini.

Untuk beralih daripada pantulan kembali kepada bukan pantulan, gunakan kaedah Value.Interface(), yang mengembalikan nilai yang dibalut sebagai antara muka yang ringkas{ }.

var i int = 3
var p *int = &i
fmt.Println(p, i) // Output: 0x414020 3

v := reflect.ValueOf(p)
fmt.Println(v.Interface()) // Output: 0x414020

v2 := v.Elem()
fmt.Println(v2.Interface()) // Output: 3

Kes Penggunaan Terperinci: Value.Elem() untuk Antara muka

Jika mencerminkan.Nilai membalut nilai antara muka, Value.Elem() juga boleh mendapatkan semula nilai konkrit dalam antara muka itu.

var r io.Reader = os.Stdin

v := reflect.ValueOf(r)
fmt.Println(v.Type()) // Output: *os.File

v2 := reflect.ValueOf(&r)
fmt.Println(v2.Type()) // Output: *io.Reader
fmt.Println(v2.Elem().Type()) // Output: io.Reader
fmt.Println(v2.Elem().Elem().Type()) // Output: *os.File

Atas ialah kandungan terperinci Apakah Perbezaan Antara `reflect.ValueOf()` dan `Value.Elem()` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn