如何遍历通道并指定为参考

How to iterate over channel and assign as reference

似乎将通道输出分配给一个指针数组总是会将最后一个发送到通道string2。谁能解释这种行为?

package main

import (
    "fmt"
)

type myType struct {
    myString string
}

func main() {
    queue := make(chan myType, 2)
    queue <- myType{myString: "string1"}
    queue <- myType{myString: "string2"}
    close(queue)

    var types []*myType

    for element := range queue {
        types = append(types, &element)
    }

    for _, element := range types {
        fmt.Println(element.myString)
    }
}

结果:

result2
result2

这与频道无关。检查具有相同结果的代码:

package main

import (
    "fmt"
)

type myType struct {
    myString string
}

func main() {
    in := [2]myType{
        myType{myString: "string1"},
        myType{myString: "string2"},
    }

    var types []*myType

    for _, element := range in {
        types = append(types, &element)
    }

    for _, element := range types {
        fmt.Println(element.myString)
    }
}

Play

问题是你正在获取一个指向 element 的指针,这个变量每次循环都会获得一个新值,但变量本身保持不变,因此您附加到切片的所有指针都指向相同的值。要解决此问题,请附加值而不是指针,或者在循环中创建一个临时变量并将指针推送到临时变量

var types []myType

for element := range queue {
    types = append(types, element)
}

var types []*myType

for element := range queue {
    tmp := element
    types = append(types, &tmp)
}