Chr*_*Man 0 memory memory-management go
所以让我们说我绝对需要0xc0000140f0在 go的特定内存地址存储一个值。我该怎么做。例如:
package main
import (
"fmt"
"unsafe"
)
func main() {
targetAddress := 0xc0000140f0
loc := (uintptr)(unsafe.Pointer(targetAddress))
p := unsafe.Pointer(loc)
var val int = *((*int)(p))
fmt.Println("Location : ", loc, " Val :", val)
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
./memory.go:10:33: cannot convert targetAddress (type int) to type unsafe.Pointer
Run Code Online (Sandbox Code Playgroud)
正如错误所说,您的类型转换无效。从unsafe.Pointer 文档:
- 任何类型的指针值都可以转换为指针。
- 指针可以转换为任何类型的指针值。
- uintptr 可以转换为指针。
- 指针可以转换为 uintptr。
请注意,“指针”(大写)指的是unsafe.Pointer,而“指针值”指的是常规 Go 指针,例如*int
Go 有一个严格的类型系统,所以你需要检查你正在使用的适当类型,并注意类型错误。
尝试从给定内存地址加载值的代码的正确版本是:
package main
import (
"fmt"
"unsafe"
)
func main() {
loc := uintptr(0xc0000140f0)
p := unsafe.Pointer(loc)
var val int = *((*int)(p))
fmt.Println("Location : ", loc, " Val :", val)
}
Run Code Online (Sandbox Code Playgroud)
正如标题所暗示的,您还想存储一个值,如下所示:
*((*int)(p)) = 1234
Run Code Online (Sandbox Code Playgroud)
现在,如果您想维护该指针以继续使用它,您可以将其存储为常规 Go 指针:
var pointer *int = (*int)(p)
val := *pointer // load something
*pointer = 456 // store something
Run Code Online (Sandbox Code Playgroud)
当然,int这里的使用完全是随意的。您可以使用任何类型,这将确定此上下文中“值”的含义。