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
    的函数,该函数将
    IsSelected
    设置为true,并替换切片中的值
例如:

//带指针
//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]
,一切正常。这太疯狂了。