我想通过for循环打印一个来自Address的字符串. 下面是我编写的代码,但它在正常运行和调试时会产生不同的结果.

如何按字符串地址顺序打印字符串的每个字符.

请帮帮我.谢谢你,谢谢你.

这是我的密码!

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    str := "Hello, World!"
    startAddr := uintptr(unsafe.Pointer(&str)) // Get the address of the string variable

    for i := 0; i < len(str); i++ {
        ptr := (*byte)(unsafe.Pointer(startAddr + uintptr(i))) // Calculate the pointer address
        fmt.Printf("%c", *ptr)                                  // Dereference the pointer to get the character
    }
}

推荐答案

您的try 不起作用的原因是&str返回字符串header的地址,而不是字符串data的地址.如果您想要字符串数据的地址,您需要首先将&str转换为字符串头,然后通过头访问数据.您可以使用声明的reflect.StringHeader来执行此操作,just make sure you read its documentation and understand what it says.

func main() {
    str := "Hello, World!"
    header := (*reflect.StringHeader)(unsafe.Pointer(&str))

    for i := 0; i < len(str); i++ {
        ptr := (*byte)(unsafe.Pointer(header.Data + uintptr(i)))
        fmt.Printf("%c", *ptr)                                  
    }
}

https://go.dev/play/p/kniSJyM7DX5

Go相关问答推荐

如何在另一个文件夹中使用Delve运行二进制文件?

如何在AWS SDK Go v2 STS上正确使用重试

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

如何预编译Golang标准库?

切换选项卡时,Goland IDE中的光标自动转移

正确使用pgtype的方法

Go - 永远停止带有上下文的循环

Kperf 构建失败

如何以干净的方式在中间件中注入 repo 或服务?

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

如何将一片 map 转换为一片具有不同属性的 struct

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

来自洪流公告的奇怪同行字段

使用 AppID 在 Windows 中启动应用程序并获取 pid

Go:等待多个通道的性能损失

在 golang 中联合一个接口和类型

从另一个没有重复的确定性 int

如何断言类型是指向golang中接口的指针

Gorilla/Mux 和 Websocket 竞赛条件,这安全吗?

如果在调用 http.Get(url) 时发生错误,我们是否需要关闭响应对象?