Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Golang结构从输入中获取不同的值_Go - Fatal编程技术网

Golang结构从输入中获取不同的值

Golang结构从输入中获取不同的值,go,Go,我在以下代码中看到奇怪的行为: type A struct { D []int8 } func main() { a := A{D: make([]int8, 0)} a.D = append(a.D, 0) b := a c := a b.D = append(b.D, 1) c.D = append(c.D, 2) fmt.Println(a.D, b.D, c.D) } 我希望输出是 [0] [0 1] [0 2] 然

我在以下代码中看到奇怪的行为:

type A struct {
    D []int8
}

func main() {
    a := A{D: make([]int8, 0)}
    a.D = append(a.D, 0)

    b := a
    c := a
    b.D = append(b.D, 1)
    c.D = append(c.D, 2)
    fmt.Println(a.D, b.D, c.D)
}
我希望输出是

[0] [0 1] [0 2]
然而我得到了

[0] [0 2] [0 2]
有人知道为什么吗


p、 如果我注释掉行“a.D=append(a.D,0)”,或者将D的类型从“[]int8”更改为“[]int”,我得到了我所期望的结果。奇怪…

首先,更改类型并不能解决问题:

这里发生的事情与追加和引用类型的机制有关

基本上,这三个结构都指向同一个底层数组,但每个片段都有其唯一的长度参数

因此,当您将1附加到b时,它是长度为2的[01]。c仍然是[0],长度为1。然后将2追加到c,使其[02]的长度为2。无意中,您还更改了b中数组的第二个值。若您可以在不追加的情况下更改a的长度,那个么它也将是[02]


有道理吗?指针和切片都很奇怪。全文如下:

首先,更改类型并不能解决问题:

这里发生的事情与追加和引用类型的机制有关

基本上,这三个结构都指向同一个底层数组,但每个片段都有其唯一的长度参数

因此,当您将1附加到b时,它是长度为2的[01]。c仍然是[0],长度为1。然后将2追加到c,使其[02]的长度为2。无意中,您还更改了b中数组的第二个值。若您可以在不追加的情况下更改a的长度,那个么它也将是[02]


有道理吗?指针和切片都很奇怪。完整的故事在这里:

这个问题重复了这么多。阅读有关Go和pointers的内容。几小时前我刚刚回答了一个类似的问题。请看这个例子并阅读我对这个问题的回答。我会找到一个好的副本来链接这个问题。这个问题可能有很多副本。阅读有关Go和pointers的内容。几小时前我刚刚回答了一个类似的问题。请看这个例子并阅读我对这个问题的回答。我会找到一个好的副本来链接这个。可能的切片副本特别奇怪。围棋中的指针很神奇,但如果你不知道围棋是按值传递的,你可能会被绊倒。可能很迂腐,但将围棋中的任何东西称为“参考类型”会产生误导,并可能导致对常见围棋行为的一些误解。供参考:呃,类型可以是围棋中的“参考类型”。只是没有任何东西是通过引用传递的。切片本质上是引用,贴图、通道和一些其他基本体也是引用。传入时,变量本身仍然是副本(即,您获得了一个新版本的切片标头,并且对该切片标头的任何更改(如基础数组的长度或地址)都不会传播),但是引用的基础数据仍然可以看到这种“按引用传递”类型的行为。问题是,您不能只说“Go中没有任何东西是通过引用传递的”,因为这不是机械上的事实。当然,从技术上讲,所有东西都是通过值传递的,但由于Go中确实存在引用类型(包括许多原语),了解实际的机制很重要。我们在这里遇到了很多问题,关于为什么当另一个函数通过索引或附加在切片上或其他东西对切片进行更改时,切片中的底层数据会发生更改。切片特别奇怪。Go中的指针令人惊讶,但如果你不知道Go是按值传递的,你可能会被绊倒。学究可能是ic,但将围棋中的任何东西称为“参考类型”会产生误导,并可能导致对常见围棋行为的一些误解。参考:呃,类型可以是“参考类型”“走吧。只是没有任何东西是通过引用传递的。切片本质上是引用,贴图、通道和一些其他基本体也是引用。传入时,变量本身仍然是副本(即,您获得了一个新版本的切片标头,并且对该切片标头的任何更改(如基础数组的长度或地址)都不会传播),但是引用的基础数据仍然可以看到这种“按引用传递”类型的行为。问题是,您不能只说“Go中没有任何东西是通过引用传递的”,因为这不是机械上的事实。当然,从技术上讲,所有东西都是通过值传递的,但由于Go中确实存在引用类型(包括许多原语),了解实际的机制很重要。我们在这里得到了很多问题,关于当另一个函数通过索引或附加在切片上或其他东西对切片进行更改时,切片中的底层数据为什么会发生更改。