Golang中如何打印变量的内存地址?

Golang中如何打印变量的内存地址? 我可以使用什么调试器来实现这个功能?我目前在MacOS系统上工作,尝试过gdb和lldb都没有成功。在lldb中,当我执行x/16 "变量内存地址"时,会收到"无法从地址读取内存"的错误信息。

// 代码示例:打印变量地址
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var x int = 42
    fmt.Printf("变量地址: %p\n", &x)
    fmt.Printf("内存内容: %v\n", *(*int)(unsafe.Pointer(&x)))
}

更多关于Golang中如何打印变量的内存地址?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何打印变量的内存地址?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中打印变量内存地址的正确方法如下:

package main

import "fmt"

func main() {
    // 基本类型变量
    var num int = 42
    fmt.Printf("num的地址: %p\n", &num)
    
    // 结构体变量
    type Person struct {
        Name string
        Age  int
    }
    p := Person{"Alice", 30}
    fmt.Printf("结构体地址: %p\n", &p)
    fmt.Printf("Name字段地址: %p\n", &p.Name)
    fmt.Printf("Age字段地址: %p\n", &p.Age)
    
    // 切片(注意:切片本身是一个包含指针的结构)
    slice := []int{1, 2, 3}
    fmt.Printf("切片变量地址: %p\n", &slice)
    fmt.Printf("底层数组地址: %p\n", slice)
    
    // 映射
    m := map[string]int{"a": 1}
    fmt.Printf("映射变量地址: %p\n", &m)
    
    // 使用unsafe.Pointer进行类型转换
    var value float64 = 3.14
    ptr := unsafe.Pointer(&value)
    fmt.Printf("unsafe.Pointer值: %p\n", ptr)
    
    // 打印指针变量的地址(双重指针)
    var ptrVar *int = &num
    fmt.Printf("ptrVar本身的地址: %p\n", &ptrVar)
    fmt.Printf("ptrVar指向的地址: %p\n", ptrVar)
}

对于调试器使用,在MacOS上推荐使用Delve(dlv):

# 安装Delve
go install github.com/go-delve/delve/cmd/dlv@latest

# 使用Delve调试
dlv debug main.go

在Delve调试会话中:

# 启动调试
(dlv) break main.main
(dlv) continue

# 打印变量地址
(dlv) print &x
(dlv) x/16xb &x  # 查看内存内容

# 使用whatis查看类型信息
(dlv) whatis x

如果必须使用lldb,需要正确设置Go运行时支持:

# 编译时添加调试信息
go build -gcflags="all=-N -l" main.go

# 使用lldb调试
lldb ./main
(lldb) b main.main
(lldb) r
(lldb) p &x
(lldb) memory read &x

对于无法读取内存的问题,确保变量在作用域内且未被优化掉。使用-N -l标志禁用优化和内联。

回到顶部