Golang中接口类型的相互转换方法探讨
Golang中接口类型的相互转换方法探讨 我有以下示例:https://play.golang.org/p/xgvFRVIrOZr
package main
import (
"fmt"
)
// Getter 获取字符串
type Getter interface {
Get() string
}
// Setter 设置字符串
type Setter interface {
Set(string)
}
// A 是演示结构体
type A struct {
s string
}
func (a A) Get() string {
return a.s
}
func (a *A) Set(s string) {
a.s = s
}
// NewGetter 返回新的 Getter 接口
func NewGetter() Getter {
return A{s: "Hello World!"}
}
func main() {
a := NewGetter()
fmt.Println(a.Get()) // 输出 Hello World!
// 以下代码无法正常工作,这是正常的
// a.(Setter).Set("Hello Earth!") // panic: interface conversion: main.A is not main.Setter: missing method Set
// 以下代码无法正常工作,这是正常的,但很奇怪
// (&a).(Setter).Set("Hello Earth!") // 编译失败: invalid type assertion: (&a).(Setter) (non-interface type *Getter on left)
// 以下代码无法正常工作,但等等,那什么才能工作呢?
// var i interface{} = &a
// i.(Setter).Set("Hello Earth!") // panic: interface conversion: *main.Getter is not main.Setter: missing method Set
// 以下代码可以工作,但它与前一个示例有什么不同?
var j interface{} = &A{
s: "Hello World!",
}
j.(Setter).Set("Hello Earth!")
}
我的任务其实很简单,我想将一个变量从一个接口转换为另一个接口。有没有办法做到这一点?
附注:
我知道如何使用反射来实现,但我正在寻找更简单的解决方案,有什么想法吗?
更多关于Golang中接口类型的相互转换方法探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我试图通过更多注释来展示如何避免使用Getter/Setter方法。
https://play.golang.org/p/1np7xdMa9zZ
更多关于Golang中接口类型的相互转换方法探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
以下是一些关于使用接口实现多态性的优质文章……我猜这应该就是您真正想要实现的目标吧?
我不太确定自己是否完全理解您在这里想要实现什么…
但当您说:"我的任务其实很简单,我想将一个变量从一个接口转换为另一个接口。有没有办法做到这一点?"时,也许您真正想要的是将一种类型转换为另一种类型?
根据我的经验,您代码中的用法看起来像是使用接口的一种非常奇怪的方式…通常建议避免使用interface{},从您的示例中我实在看不出有任何使用它的必要。
请查看这段代码及附带的说明。
https://play.golang.org/p/qRKAI6zXWAx
最后,我不太喜欢使用"将一个接口转换为另一个接口"这种说法。我更倾向于这样理解:我希望将一个接口内部存储的具体数据存放到另一个接口中。问题在于,在您给出的示例中,存储的并非具体值,而是一个接口值的地址,这是绝对需要避免的。


