当我的函数被赋予一个接口参数作为指针时,我想将指针更新到其他内容(a* = b*)。如果函数参数不是接口,而是指针,则此方法工作正常。给定以下代码:package mainimport "fmt"type demoInterface interface { GetName() string}type demoStruct struct { name string}func (d demoStruct ) GetName() string { return d.name}func Update(d1 demoInterface) { fmt.Println(d1) d2 := demoStruct{name: "bob"} d1 = &d2 fmt.Println(d1)}func main() { d1 := &demoStruct{name: "frank"} fmt.Println(d1) Update(d1) fmt.Println(d1)}输出为&{frank}&{frank}&{bob}&{frank}然而,我实际上期望&{frank}&{frank}&{bob}&{bob}如果我替换 Update 函数签名以接受 *demoStruct 而不是 demoInterface,它将按预期工作。当函数签名是接口而不是指针时,有没有办法让它按预期工作。
1 回答
慕姐4208626
TA贡献1852条经验 获得超7个赞
如果您确实需要它,则可能是指向接口的指针可能有意义的罕见情况之一。下面是用它修改的示例:
package main
import "fmt"
type demoInterface interface {
GetName() string
}
type demoStruct struct {
name string
}
func (d demoStruct ) GetName() string {
return d.name
}
func Update(d1 *demoInterface) {
fmt.Println(*d1)
d2 := demoStruct{name: "bob"}
*d1 = d2
fmt.Println(*d1)
}
func main() {
d1 := demoInterface(demoStruct{name: "frank"})
fmt.Println(d1)
Update(&d1)
fmt.Println(d1)
}
请注意,由于 take ,我们不能只是传入(Go 没有类型协方差),因此我们必须首先将结构转换为接口。Update*demoInterface*demoStruct
- 1 回答
- 0 关注
- 94 浏览
添加回答
举报
0/150
提交
取消