doucandiao9180 2016-04-10 15:52 采纳率: 100%
浏览 33
已采纳

执行:通过其指针删除对象

I'm currently learning golang, and have the following code. The idea is to have an object with a number of pointers to it, and I'd like to modify and delete the object using one of the pointers.

package main

import "fmt"

type obj struct {
    a int
    b string
}

func main() {
    o1 := &obj{1, "hello"}
    o2 := &obj{2, "world"}

    m := map[string]*obj{
        "foo": o1,
        "bar": o2,
    }

    fmt.Printf("1: %t %v
", o1, o1)
    fmt.Println("2:", m, m["foo"], o1)

    o1.b = "WWWW"
    fmt.Println("3:", m, m["foo"], o1)

    o1 = nil
    fmt.Println("4:", m, m["foo"], o1)
}

http://play.golang.org/p/lqQviVuTQN

Output:

1: &{%!t(int=1) %!t(string=hello)} &{1 hello}
2: map[foo:0x10434120 bar:0x10434130] &{1 hello} &{1 hello}
3: map[foo:0x10434120 bar:0x10434130] &{1 WWWW} &{1 WWWW}
4: map[foo:0x10434120 bar:0x10434130] &{1 WWWW} <nil>

Changing object's internals works as I expect (#3). However when I try deleting the actual object (#4) it seems just nils the pointer itself without touching actual object.

What am I missing?

  • 写回答

2条回答 默认 最新

  • douhuiwan5141 2016-04-10 16:16
    关注

    All assignments in Go are copy by value.

     m := map[string]*obj{
            "foo": o1,
            "bar": o2,
        }
    

    is an assignment, so value of foo is a copy of o1. To achieve your goal you need one more level of indirection

    o1 := &obj{1, "hello"}
    o2 := &obj{2, "world"}
    
        m := map[string]**obj{
            "foo": &o1,
            "bar": &o2,
        }
    

    http://play.golang.org/p/XutneOziaM

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

报告相同问题?

悬赏问题

  • ¥20 找辅导 初学者 想实现一个项目 没有方向
  • ¥15 关于渗漏场的电场分布模拟
  • ¥24 matlab怎么修改仿真初始时间
  • ¥15 两分段线性回归模型分析阈值效应
  • ¥15 前端和后端代码都没报错,但是点登录没反应的?
  • ¥100 需要远程解决QSQLITE问题!
  • ¥15 利用光场表达式画出初始光场强度分布图像等几个问题在这两个图片里
  • ¥15 gozero求手把手教学,400一天
  • ¥15 泥浆冲清水的泥浆分布
  • ¥15 LASSO回归分析筛选关键基因,适合多大样本量?