gpt4 book ai didi

go - 在Go中使用引用处理 slice 时是否存在错误?

转载 作者:行者123 更新时间:2023-12-01 22:43:12 24 4
gpt4 key购买 nike

我正在尝试构建一个新的结构列表,其中包含对另一个 slice 中存在的项目的引用。如果您看到它,则更容易理解,因此,我准备了一个可以运行的代码段。
我有一个要分析的两点(笛卡尔坐标)的列表(dummylist),以构建具有某些功能(在示例中,X> 80)的项的新列表(mylist)。我定义了两点:{X:90.0,Y:50.0}和{X:20.0,Y:30.0}。我希望mylist将包含{X:90.0,Y:50.0},最后是{X:20.0,Y:30.0}。通过在此处和此处进行一些打印,我可以验证算法是否工作正常(在正确的情况下以“if”条件输入),但是最后,“mylist”包含错误的元素。

package main
import(
"fmt"
)

func main() {

type point struct {
X float64
Y float64
}

type pointsList []point

type pointContainer struct {
Point *point
}

type pointContainerList []pointContainer

// Prepare a slice with two elements
dummylist := new(pointsList)
*dummylist = append(*dummylist, point{X:90.0, Y:50.0})
*dummylist = append(*dummylist, point{X:20.0 , Y:30.0})

// My empty list
mylist := new(pointContainerList)

fmt.Println(fmt.Sprintf("---- At the beginning, mylist contains %d points", len(*mylist)))

// Filter the initial list to take only elements
for _, pt := range *dummylist {
fmt.Println("\n---- Evaluating point ", pt)

if pt.X > 80 {
fmt.Println("Appending", pt)
*mylist = append(*mylist, pointContainer{Point: &pt})
fmt.Println("Inserted point:", (*mylist)[0].Point, "len = ", len(*mylist))
}
}

// mylist should contain {X:90.0, Y:50.0}, instead...
fmt.Println(fmt.Sprintf("\n---- At the end, mylist contains %d points", len(*mylist)))
fmt.Println("Content of mylist:", (*mylist)[0].Point)
}
在这里您可以运行代码:
https://play.golang.org/p/AvrC3JJBLdT
一些有用的注意事项:
我已经通过多次测试看到,最后,mylist包含循环中最后一个解析的项目。我认为引用存在问题。就像列表中的插入项(在第一次迭代中)是否依赖于其他迭代的“pt”一样。相反,如果我使用索引( for i, pt := range *dummylist(*dummylist)[i]),则一切正常。
在谈论Golang的错误之前...我是否缺少某些东西?

最佳答案

是的,您缺少了一些东西。在这行上:

*mylist = append(*mylist, pointContainer{Point: &pt})
您正在将循环变量 &pt的地址放入您的结构中。随着循环的继续, pt的值更改。 (或者换句话说,对于循环的每次迭代, &pt将是相同的指针)。
go language specification:

...
迭代值分配给相应的迭代
变量,如赋值语句中所示。
迭代变量可以通过“range”子句使用
短变量声明(:=)的形式。在这种情况下,它们的类型是
设置为各个迭代值的类型,其范围为
“for”语句的框;它们在每次迭代中都会重复使用。
如果迭代变量是在“for”语句之外声明的,
执行后,它们的值将是最后一次迭代的值。

一种解决方案是创建一个新值,但是我不确定您从如此多的指针中获得了什么: []point可能比指向指向 slice 的指针结构的指针更有效(并且更不易出错)。 point

关于go - 在Go中使用引用处理 slice 时是否存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62911637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com