Go指针探秘:深入理解内存与安全性
package main
import (
"fmt"
"unsafe"
)
// 定义一个结构体
type MyStruct struct {
a int
b string
}
func main() {
// 创建一个结构体实例
s := MyStruct{a: 1, b: "hello"}
// 获取结构体实例的指针
sPtr := &s
// 打印结构体实例的地址和指针的地址
fmt.Printf("结构体实例的地址: %p\n", &s)
fmt.Printf("指针的地址: %p\n", &sPtr)
// 打印指针的值和指针的地址
fmt.Printf("指针的值: %p\n", sPtr)
fmt.Printf("指针的地址: %p\n", &sPtr)
// 通过指针访问结构体成员
fmt.Println("通过指针访问的成员:", (*sPtr).a, (*sPtr).b)
// 使用指针访问结构体成员的另一种方式
fmt.Println("使用解引用访问的成员:", sPtr.a, sPtr.b)
// 通过指针改变结构体成员的值
sPtr.a = 2
sPtr.b = "world"
// 打印改变后的结构体成员
fmt.Println("改变后的成员:", s.a, s.b)
// 通过unsafe包的Pointer函数来获取指针的值
pointerValue := unsafe.Pointer(sPtr)
fmt.Printf("指针的值(使用unsafe.Pointer): %p\n", pointerValue)
}
这段代码首先定义了一个简单的结构体MyStruct
,然后创建了该结构体的一个实例并获取了它的指针。接着,代码打印了实例的地址和指针的地址,以及指针的值和指针本身的地址。代码还演示了如何通过指针访问结构体成员,并修改它们的值。最后,代码使用unsafe
包中的Pointer
函数来获取指针的值。这个过程有助于理解Go中指针的内存布局和操作。
评论已关闭