Go Println可以更改数组的值吗? var x结构{ 笨蛋 b国际16 c[]int32 } func main(){ //答:=[]int32{1
您的代码在Go Println可以更改数组的值吗? var x结构{ 笨蛋 b国际16 c[]int32 } func main(){ //答:=[]int32{1,go,Go,您的代码在围棋场中运行良好。 输出总是为您提供5。 fmt.Println不会更改x.c[0]值 代码: var x struct { a bool b int16 c []int32 } func main() { //a := []int32{1 << 9} //x.c = a pb := (*[]int8)(unsafe.Pointer(uintptr(unsafe.Pointer(&x)) + unsafe.Offse
围棋场
中运行良好。
输出总是为您提供5
。
fmt.Println
不会更改x.c[0]
值
代码:
var x struct {
a bool
b int16
c []int32
}
func main() {
//a := []int32{1 << 9}
//x.c = a
pb := (*[]int8)(unsafe.Pointer(uintptr(unsafe.Pointer(&x)) + unsafe.Offsetof(x.c)))
*pb = []int8{5}
println(x.c[0]) // 5
println(x.c[0]) // 5
fmt.Println(x.c[0]) // 5
fmt.Println(x.c[0]) // 327685 why????????
}
链接:使用
unsafe
,您放置了一个int8
切片,其底层数组在堆栈中分配,而不是int32
切片。因此,现在您遇到了一种情况,运行时认为存在一个int32
值数组,但实际上该数组是一个int8
值数组。因此当fmt.Println
从中读取,您读取包含放置在那里的5
的字节,以及碰巧在那里的任何垃圾
使用不同的值运行它几次,然后检查位模式。您将得到一个LSB始终为5的值。您正在从内存位置读取int32
,其中放置了int8
值5。其余三个字节是堆栈剩余值
如果你用
[]int8{5,0,0,0}
初始化你的切片,你总是会得到5。这种行为与你描述的不一样。我认为你需要在你的问题中添加更多细节。我不确定这是否离题太多,因为:你使用了不安全的,所以你弄坏了东西。:-)正确且准确!
package main
import (
"fmt"
"unsafe"
)
var x struct {
a bool
b int16
c []int32
}
func main() {
//a := []int32{1 << 9}
//x.c = a
pb := (*[]int8)(unsafe.Pointer(uintptr(unsafe.Pointer(&x)) + unsafe.Offsetof(x.c)))
*pb = []int8{5}
println(x.c[0]) // 5
println(x.c[0]) // 5
fmt.Println(x.c[0]) // 5
fmt.Println(x.c[0]) // 327685 why????????
}
5
5
5
5