Golang reflect.UnsafeAddr()的用法及示例
Go 语言提供了运行时反射的内置支持,通过使用 reflect 包,程序可以操作任意类型的对象。Golang 中的 reflect.UnsafeAddr() 函数用于获取指向 v 数据的指针。要使用此函数,需要在程序中导入 reflect 包。
语法:
func (v Value) UnsafeAddr() uintptr
参数: 此函数不接受任何参数。
返回值: 此函数返回 v 的数据的指针。
下面的示例演示了在 Golang 中使用此方法的方法:
示例1:
// Golang 程序演示
// reflect.UnsafeAddr() 使用
package main
import (
"fmt"
"reflect"
"unsafe"
)
// 主函数
func main() {
var s = struct{ foo int }{42}
var i int
rs := reflect.ValueOf(&s).Elem()
rf := rs.Field(0)
ri := reflect.ValueOf(&i).Elem()
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
ri.Set(rf)
rf.Set(ri)
fmt.Println(rf)
fmt.Println(ri)
}
输出:
42
42
示例2:
// Golang 程序示例
// reflect.UnsafeAddr() 使用
package main
import (
"fmt"
"reflect"
"unsafe"
)
// 主函数
func main() {
var s = struct{ foo int }{374}
var i int
rs := reflect.ValueOf(s)
rf := rs.Field(0)
rs2 := reflect.New(rs.Type()).Elem()
rs2.Set(rs)
rf = rs2.Field(0)
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
ri := reflect.ValueOf(&i).Elem() // i, but writable
ri.Set(rf)
fmt.Println(rf)
fmt.Println(ri)
}
输出:
374
374