gpt4 book ai didi

pointers - 从 Go 中的字符串访问内存地址?

转载 作者:IT王子 更新时间:2023-10-29 01:26:31 24 4
gpt4 key购买 nike

在 golang 中,我可以打印给定字符串的内存地址的值吗?

例如,如果运行以下代码:

a := "A String"
fmt.Println(&a)

它打印0x1040c108

我如何获取诸如 0x1040c108 之类的字符串并打印存储在内存中的该字符串的值?类似于 fmt.Println(*0x1040c108)

这可能吗?

最佳答案

这是可以做到的,但这是一个非常非常非常糟糕的主意。任何时候你导入 unsafe 包,你要么做错了什么,要么做一些非常顽固的事情。我什至对回答这个问题犹豫不决,但现在就开始吧。

https://play.golang.org/p/unkb-s8IzAo

package main

import (
"fmt"
"strconv"
"unsafe"
)

func main() {
// original example manually examined the printed address and used the value
// updated to preserve forward compatibility due to runtime changes shifting the address over time

hi := "HI"

// getting address as string dynamically to preserve compatibility
address := fmt.Sprint(&hi)

fmt.Printf("Address of var hi: %s\n", address)

// convert to uintptr
var adr uint64
adr, err := strconv.ParseUint(address, 0, 64)
if err != nil {
panic(err)
}
var ptr uintptr = uintptr(adr)

fmt.Printf("String at address: %s\n", address)
fmt.Printf("Value: %s\n", ptrToString(ptr))
}

func ptrToString(ptr uintptr) string {
p := unsafe.Pointer(ptr)
return *(*string)(p)
}

是的,这几乎是从 unsafe godoc 中逐行提取的。 https://godoc.org/unsafe

另请注意,如果/当您的内存引用不是 go 字符串时,一切都会灾难性地崩溃。 go vet 被配置为向您发送愤怒的消息,强调这确实是一个坏主意。

更新:从 go 1.15.1 开始更新了在 playground 上运行的示例,playground 或 go 本身已经改变了内存寻址的方式。或者更可能的情况是,核心库/运行时的更改将跨版本转移地址。它现在动态获取地址与手动硬编码值。

关于pointers - 从 Go 中的字符串访问内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com