如何遍历通道并指定为参考
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)
}
}
问题是你正在获取一个指向 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)
}
似乎将通道输出分配给一个指针数组总是会将最后一个发送到通道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)
}
}
问题是你正在获取一个指向 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)
}