Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go Println可以更改数组的值吗? var x结构{ 笨蛋 b国际16 c[]int32 } func main(){ //答:=[]int32{1_Go - Fatal编程技术网

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