Go 函数返回的结构是';它所属的数组中没有更改
我正在用Go 函数返回的结构是';它所属的数组中没有更改,go,Go,我正在用Gotk3编写一个小型GUI应用程序,这是我在伪代码中的基本设置: type Point struct { X float64 Y float64 IsSelected bool } func getClosestElement(pT []Point, p Point, maxDist float64) Point { /* returns the point from pT with the minimum distance to p */ } fu
Gotk3
编写一个小型GUI应用程序,这是我在伪代码中的基本设置:
type Point struct {
X float64
Y float64
IsSelected bool
}
func getClosestElement(pT []Point, p Point, maxDist float64) Point {
/* returns the point from pT with the minimum distance to p */
}
func main() {
// GTK init ..
selectedPoints := make([]Point, 0)
/* GTK-Event onMouseClick */
{
/* if left mouse click */
selectedPoints = append(selectedPoints, Point{X: event.x, Y: event.y})
/* if right mouse click */
closestPoint = getClosestElement(selectedPoints, Point{X: event.x, Y: event.y}, 15.0)
closestPoint.IsSelected = true
}
/* GTK-Event Draw */
{
/* Loop over all selectedPoints */
if selectedPoint.IsSelected
/* Draw point in blue and also print to console, if a selected point was detected */
else
/* Draw point in black */
}
}
但不知何故,即使从selectedPoints
获取最近的点也可以正常工作,但我从未获得在IsSelected
属性为true的点上循环的控制台输出,也没有获得蓝色绘制的点(这将指示此点已被选中)
这就给我留下了一个问题:返回的结构(它是最初提供给函数的切片的一部分)是否实际上是通过值而不是引用返回的。因此,对该返回点的更改不会更改它以前所属数组中的点?如果在切片中推送一个非指针值,然后函数从该切片返回一个值,它将是该值的副本。因此,如果更改该值的属性,则不会影响切片中的值 您可以:
- 使您的
指针值,例如点
*点
- 有一个名为
的函数,该函数将selectClosestElement
设置为true,并替换切片中的值IsSelected
//带指针
//GTK初始化。。
selectedPoints:=make([]*点,0)
/*点击鼠标上的GTK事件*/
{
/*如果鼠标左键单击*/
selectedPoints=append(selectedPoints,&Point{X:event.X,Y:event.Y})
/*如果鼠标右键单击*/
closestPoint=getClosestElement(selectedPoints,&Point{X:event.X,Y:event.Y},15.0)
closestPoint.IsSelected=true
}
//使用selectClosestPoint函数替换切片中的值
//GTK初始化。。
selectedPoints:=生成([]点,0)
/*点击鼠标上的GTK事件*/
{
/*如果鼠标左键单击*/
selectedPoints=append(selectedPoints,点{X:event.X,Y:event.Y})
/*如果鼠标右键单击*/
selectClosestPoint(selectedPoints,Point{X:event.X,Y:event.Y},15.0)
}
...
func selectClosestPoint(selectedPoints[]点,点,最大距离浮点64){
对于i,sPoint:=范围选择点{
// ...
//这是正确的观点
sPoint.IsSelected=true
//在切片中替换它
所选点[i]=sPoint
}
}
如何使其不是副本而是selectedPoints
数组中完全相同点的实际引用?返回指针而不是副本。我在函数getClosestElement
中的pT
的所有元素上都有一个循环。我没有返回&pT[idx]
,而是返回了第二个循环变量(类型为Point
)。我心里想,也许这也不是一个参考——令我惊讶的是,这是真的!现在我返回&pT[idx]
,一切正常。这太疯狂了。