Golang reflect.Pointer()函数的使用与示例

Golang reflect.Pointer()函数的使用与示例

Go语言提供了内置支持运行时反射的实现,并允许程序使用reflect包来操作任意类型的对象。在Golang中, reflect.Pointer() 函数用于将v的值作为uintptr返回。要访问此函数,需要在程序中导入reflect包。

语法:

func (v Value) Pointer() uintptr

参数: 此函数不接受任何参数。

返回值: 此函数将v的值作为uintptr返回。

下面的示例演示了在Golang中使用上述方法的用法:

示例1:

// Golang程序示例
// reflect.Pointer()函数 
   
package main
   
import (
    "reflect"
    "unsafe"
    "fmt"
)
   
func main() {
    var s = struct{ foo int }{100}
    var i int
   
    rs := reflect.ValueOf(&s).Elem() 
    rf := rs.Field(0)              
    ri := reflect.ValueOf(&i).Elem()
       
    //使用Pointer()函数
    rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()
    ri.Set(rf)
    rf.Set(ri)
       
    fmt.Println(rf)
} 

输出:

100

示例2:

// Golang程序示例
// reflect.Pointer()函数 
   
package main
   
import (
    "fmt"
    "play.ground/foo"
    "reflect"
    "unsafe"
)
   
func GetUnexportedField(field reflect.Value) interface{} {
    return reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem().Interface()
}
   
func SetUnexportedField(field reflect.Value, value interface{}) {
    reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).
        Elem().
        Set(reflect.ValueOf(value))
}
   
func main() {
    f := &foo.Foo{
        Exported: "Old Value ",
    }
   
    fmt.Println(f.Exported) 
       
    field := reflect.ValueOf(f).Elem().FieldByName("unexported")
    SetUnexportedField(field, "New Value")
    fmt.Println(GetUnexportedField(field))
}
   
-- go.mod --
module play.ground
   
-- foo/foo.go --
package foo
   
type Foo struct {
    Exported   string
    unexported string
} 

输出:

Old Value 
New Value

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程