ValueOf() 中的 Pointer() 和 UnsafeAddr() 的区别是什么?

下面这段代码,Pointer()UnsafeAddr() 返回的都是 uintptr,但是结果却不一样,怎么理解?

var unsafeP unsafe.Pointer

func main() {
    v := reflect.ValueOf(&unsafeP)
    v = v.Elem()
    fmt.Println(v.Kind()) // unsafe.Pointer

    p1 := v.Pointer()
    fmt.Println(reflect.TypeOf(p1), p1) // uintptr 0

    p2 := v.UnsafeAddr()
    fmt.Println(reflect.TypeOf(p2), p2) // uintptr 5217800
}

是不是 Pointer() 返回的是相对地址(相对于应用程序的起始地址),而UnsafeAddr() 返回的是绝对地址?

共 5 个回复


stevewang

UnsafeAddr returns a pointer to v’s data.

Pointer returns v’s value as a uintptr.

# 0

stevenldj

v‘s value 和 v’s data 区别是什么?怎么理解?

# 1

stevewang

var v uintptr
&v就是a pointer to v's data/value
v就是v's value

# 2

stevewang

以下代码p1和p2就是相等的。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var n int
    v1 := reflect.ValueOf(&n)
    v2 := v1.Elem()
    p1 := v1.Pointer()
    fmt.Println(reflect.TypeOf(p1), p1)
    p2 := v2.UnsafeAddr()
    fmt.Println(reflect.TypeOf(p2), p2)
}
# 3

stevenldj

明白了,Pointer() 是类型转换操作,UnsafeAddr() 是取地址操作。谢谢指点!

# 4