go - 当参数是指针时取消引用函数接口参数
问题描述
当我的函数被赋予一个作为指针的接口参数时,我想将指针更新为其他东西(a* = b*)。如果函数参数不是接口而是指针,则可以正常工作。
给定以下代码:
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 := &demoStruct{name: "frank"}
fmt.Println(d1)
Update(d1)
fmt.Println(d1)
}
输出是
&{frank}
&{frank}
&{bob}
&{frank}
但是我实际上希望
&{frank}
&{frank}
&{bob}
&{bob}
如果我替换 Update 函数签名以接受 *demoStruct 而不是 demoInterface 它按预期工作。
当函数签名是接口而不是指针时,有没有办法让它按预期工作。
谢谢。
解决方案
如果你真的需要这个,它可能是指向接口的指针可能有意义的罕见情况之一。这是您修改后的示例:
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)
}
请注意,由于Update
take *demoInterface
,我们不能只传入*demoStruct
(Go 没有类型协变),因此我们必须先将结构转换为接口。
推荐阅读
- jhipster - 我们可以将 jhipster 应用程序部署到本地或自托管服务器吗?
- javascript - 链接组件在第一次按下按钮时起作用,但在后续时间不起作用
- ruby-on-rails - ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: 列不存在)
- python - 如何使用 REGEX 读取 .txt 文件并计算单词的使用次数并将该信息添加到字典中
- python - 你如何在 colab 上导入我自己的模块?
- python - Pyarrow Find bad lines in csv to parquet转换
- flutter - 使用颤振登录后页面不会进入主屏幕
- linux - Bash 中的乘法
- xsd - lxml 被 XSD 中的空 xmlns 混淆(XML 模式)
- java - 在 tomcat 中运行的 Spring Boot,所需的请求部分“文件”不存在