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

时间:2017-08-04 15:40:23

标签: go mutability

考虑以下要点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" (这也是我想要打印的东西)。有经验的人可以向我解释一下如何将指针,结构和界面结合起来解决这个问题,让我对我错误的原因以及如何修复它有所了解吗?

1 个答案:

答案 0 :(得分:1)

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 '&'