使用 Golang 接口实现不同类型的接口方法
在 Go 中,通常希望不同类型的数据结构实现相同的接口提供一组通用的行为。例如,考虑两个结构体:
type First struct { str string } type Second struct { str string }
我们希望两个结构体都实现接口 A:
type A interface { PrintStr() // Print First.str or Second.str }
但是,为每个结构体单独实现 PrintStr() 似乎是多余的:
func (f First) PrintStr() { fmt.Print(f.str) } func (s Second) PrintStr() { fmt.Print(s.str) }
对于实现 A 的所有结构来说,最好有一个单一的实现。尝试直接执行此操作不起作用:
func (a A) PrintStr() { fmt.Print(a.str) }
原因是 a 没有 str 字段。相反,一个更优雅的解决方案涉及创建一个基本类型并将其嵌入到我们的两个结构中:
type WithString struct { str string } type First struct { WithString } type Second struct { WithString } type A interface { PrintStr() // Print First.str or Second.str } func (w WithString) PrintStr() { fmt.Print(w.str) }
这里,WithString 作为基本类型,First 和 Second 嵌入它。这为我们提供了 PrintStr() 的集中实现。
用法示例:
a := First{ WithString: WithString{ str: "foo", }, }
请注意,我们可以通过嵌入 WithString 的实例来创建 First 的实例。这项技术使我们能够实现为实现同一接口的多种不同类型提供一个实现的目标。
以上是如何在 Golang 中实现不同类型的接口方法?的详细内容。更多信息请关注PHP中文网其他相关文章!