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