Golang Go语言指针的问题
func testMutex() {
stu := &Stu{
name: "song",
age: "12",
s: Stu1{name: "stu1"},
}
stu.st1 = &Stu{
name: "i amstu.st1",
age: "",
s: Stu1{},
st1: nil,
}
// 获取第一个
fmt.Println((*Stu)(unsafe.Pointer(uintptr(unsafe.Pointer(stu)))).name)
i := *(*string)(unsafe.Pointer(uintptr(unsafe.Pointer(stu)) + unsafe.Sizeof("")))
// 获取第二个
fmt.Println(i)
// 获取第三个
ci := (*Stu1)(unsafe.Pointer(uintptr(unsafe.Pointer(stu)) + unsafe.Sizeof("") + unsafe.Sizeof("")))
fmt.Println(ci.name)
// 获取第四个
ci1 := *(*Stu)(unsafe.Pointer(uintptr(unsafe.Pointer(stu)) + unsafe.Sizeof("") + unsafe.Sizeof("") + unsafe.Sizeof(stu.s)))
fmt.Println(ci1)
}
type Stu struct {
name string
age string
s Stu1
st1 *Stu
}
type Stu1 struct {
name string
}
代码如上。 我发现 这样搞, 获取不到 Stu 里面的 st1 指针对象。 尴尬住了
Golang Go语言指针的问题
更多关于Golang Go语言指针的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
unsafe.Sizeof(reflect.ValueOf(stu.s))))
更多关于Golang Go语言指针的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
用 unsafe.Sizeof(reflect.TypeOf(stu.s)) 才对
直接用 unsafe.Offset…
unsafe.Offset(Stu{}.s) 就是 s 的 offset 了。你这样手动拼接出来的不一定对。如果编译器做了 align 的话用 size 是没法得到正确结果的。
reflect.TypeOf(Stu{}).Filed(3).Offset)
我发现获取不到指针可能不是 offset 的问题, 因为获取到的 st1 的 offset 是 48, 但是指针要再 + 16 才能获取到
确实是这样
在Go语言中,指针是一个非常重要的概念,它允许你直接访问和修改变量的内存地址。以下是对Go语言指针的一些关键点的解答:
-
定义与初始化: 在Go中,你可以使用
*Type
来声明一个指针类型,其中Type
是某个变量的类型。例如,var p *int
声明了一个指向整数的指针p
。初始化指针通常涉及将一个变量的地址赋值给指针,如p = &x
,其中x
是一个已声明的整数变量。 -
使用指针: 通过指针,你可以直接操作它所指向的变量的值。使用
*p
来解引用指针并获取或设置它所指向的值。例如,*p = 20
会将值20赋给p
所指向的变量。 -
指针与函数: 将指针传递给函数允许函数修改调用者作用域中的变量。这在需要修改输入参数或返回多个值时特别有用。
-
注意事项:
- 小心空指针解引用,这会导致运行时错误。
- 指针增加了程序的复杂性,应谨慎使用以避免难以调试的错误。
- 在Go中,垃圾收集器自动管理内存,但了解指针如何影响内存使用有助于编写更高效的代码。
-
示例:
var x int = 42 var p *int = &x fmt.Println(*p) // 输出: 42
希望这些解释能帮助你更好地理解Go语言中的指针。如果有更具体的问题或示例,请随时提问!