考虑以下链接的要点:
码:
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
结果是打印了序列“鲍勃,乔,鲍勃”,而我的直觉说应该是“鲍勃,乔,乔”(这也是我要打印的内容)。可以使用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 '&'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句