我不能改变这个结构我也不明白为什么
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 '&'
考虑以下要点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 '&'