pointers - Go:通过指针删除对象

标签 pointers go

我目前正在学习golang,并有以下代码。 这个想法是拥有一个带有多个指向它的指针的对象,我想使用其中一个指针来修改和删除该对象。

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\n", 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

输出:

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>

改变对象的内部结构正如我所期望的那样(#3)。 然而,当我尝试删除实际对象 (#4) 时,似乎指针本身只是 nil 而没有触及实际对象。

我错过了什么?

最佳答案

Go 中的所有赋值都是按值复制。

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

是一个赋值,因此 foo 的值是 o1 的副本。 为了实现您的目标,您需要多一层间接

o1 := &obj{1, "hello"}
o2 := &obj{2, "world"}

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

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

关于pointers - Go:通过指针删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36531948/

相关文章:

戈朗 : optimal way of typing associative slices?

javascript - 如何在 node.js 中实现 readUInt16BE 函数

c++ - 它如何在内存中使用指针和一般情况下工作?

c++ - 将_cast 重新解释为 void 是否合法*

c++ - 指向抽象类型的指针数组

c指针理解问题

c - 关于 C 和指针的笑话 : *((int *)0) = 5;

go - 如何“强制” Golang函数使用结构的新实例

使用 <(..) 参数执行

go - 解决 goroutines 死锁