Golang reflect.UnsafeAddr()的用法及示例

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程