dpzlz08480 2018-04-27 21:32
浏览 8
已采纳

如何使用指针修改切片

Why isn't the slice being modified in the following code:

package pointers

import "fmt"

func modifyObject(v *Vertex) {
    v.x = v.x * v.x
    v.y = v.y * v.y
}

func modifyArray(vertices *[]Vertex) {
    for _, v := range *vertices {
        v.x = v.x * v.x
        v.y = v.y * v.y
    }
}

func DemoPointersArray() {
    v := Vertex{2, 3}
    modifyObject(&v)
    fmt.Println("Vertex modified successfully:", v)

    v1 := Vertex{2, 3}
    v2 := Vertex{20, 30}
    vertices := []Vertex{v1, v2}
    modifyArray(&vertices)
    fmt.Println("Vertices are NOT modified:", vertices)
}

Output:
Vertex modified successfully: {4 9}
Vertices are NOT modified: [{2 3} {20 30}]

How to modify them?

  • 写回答

2条回答 默认 最新

  • douliang9057 2018-04-27 22:07
    关注

    The function modifyArray modifies the local variable v, not the slice element. Assign to the slice element using an index expression:

    func modifyArray(vertices *[]Vertex) {
        for i, v := range *vertices {
            (*vertices)[i].x = v.x * v.x
            (*vertices)[i].y = v.y * v.y
        }
    }
    

    Because the slice contains a pointer to the backing array, there's no need to pass a pointer to the slice:

    func modifyArray(vertices []Vertex) {
        for i, v := range vertices {
            vertices[i].x = v.x * v.x
            vertices[i].y = v.y * v.y
        }
    }
    

    Call it like this:

    modifyArray(vertices)  // do not take address of vertices
    

    playground example

    You can use modifyObject by taking the address of the slice element:

     func modifyArray(vertices []Vertex) {
        for i := range vertices {
            modifyObject(&vertices[i])
        }
    }
    

    playground example

    Unlike other answers, this answer retains the memory layout in the question.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 自适应 LMS 算法实现 FIR 最佳维纳滤波器matlab方案
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像