我不能改变这个结构我也不明白为什么

I can't mutate this struct I and I don't understand why

考虑以下要点linked here

代码:

package main

import (
    "fmt"
)

type StateTransition struct {
    msg Message
}

type Message interface {
    To() *string
}

type Transaction struct {
    data txdata
}

type txdata struct {
    Recipient *string
}

func (t Transaction) To() (*string) {
    return t.data.Recipient
}


func UnMask(n **string, k string) {
    *n = &k
} 

func main() {
    toField := "Bob"
    toPtr := &toField
    txd := txdata{toPtr}
    tx := Transaction{txd}
    st := StateTransition{tx}
    n1 := st.msg.To()
    fmt.Printf("Hello, %s \n", *n1)
    UnMask(&n1, "Joe")
    fmt.Printf("Hello, %s \n", *n1)
    n2 := st.msg.To()
    fmt.Printf("Hello, %s \n", *n2)
}

输出

Hello, Bob 
Hello, Joe 
Hello, Bob 

预期输出

Hello, Bob
Hello, Joe
Hello, Joe

结果是序列 "Bob, Joe, Bob" 被打印而我的直觉告诉它应该是 "Bob, Joe, Joe" (这也是我 想要 它打印的).有 go 经验的人可以向我详细解释与此问题相关的指针、结构和接口的组合,以便让我理解为什么我错了,以及如何解决它吗?

Unmask 采用指向指针的指针,假设指针 X 指向指针 Y,指针 Y 指向字符串值。取消屏蔽然后 更改 X 指向的指针,Y 未更改并仍指向相同的旧字符串。

你可以这样做:

func UnMask(n **string, k string) {
    **n = k
}

func UnMask(n *string, k string) {
    *n = k
}
// ....
UnMask(n1, "Joe") // drop the '&'