Golang Go语言中怎样更好地实现多态?

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言中怎样更好地实现多态?

问题:虽然这样间接地实现了多态,但是由于 Model 真的没有任何 method (方法)只有数据成员,这个类型定义为 interface{} 总之有些不优雅的感觉,想问下大家有没有更好的实现方法?

代码见 gist (或下方的图片): https://gist.github.com/inhzus/b301db257c520c15466fc833aaaec7f6

code


更多关于Golang Go语言中怎样更好地实现多态?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

怎么我这 gist 都打不开…github 又可以

更多关于Golang Go语言中怎样更好地实现多态?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 gist 貌似不架梯子确实比较难出去… 看图片好了= =

if 来 if 去的,还什么多态?

#3 用 switch 就行了,示例代码而已,没必要纠结这个吧

接口的多种不同的实现方式即为多态,只要针对不同的类型实现同一个接口就行了,基本的用法。
import "fmt"

type Model interface{
PrintValues()
}

type A struct {
x int
}

type B struct {
A
y int
}

func (aA) PrintValues(){
fmt.Printf(“x: %v”, a.x)
}
func (b
B) PrintValues(){
fmt.Printf(“x: %v, y: %v”, b.x, b.y)
}
func test(model Model) {
model. PrintValues()
}

针对接口编程。

不要随便使用 iterface{}这种类型转来转去的。这和随意转成 void*有啥区别。

同意,用接口实现多态最合适。

我不反对使用 interface{},尤其是需要动态性时,用 interface{} 是必然的

不过你这个代码,和多态实在没什么关系。多态是不涉及 type assertion 的

void* 无类型,接口有类型,这就是最大的区别

在Golang(Go语言)中实现多态,虽然不像面向对象语言(如Java、C++)那样直接通过类和继承机制,但可以通过接口(interface)和结构体(struct)的组合来实现。以下是一些关键点,帮助你更好地在Go语言中实现多态:

  1. 定义接口:接口是Go语言中实现多态的核心。定义一个接口,其中声明了需要实现的方法。接口本身不包含方法的实现,而是由实现该接口的类型来提供。

  2. 实现接口:创建一个或多个结构体,并为这些结构体实现接口中声明的方法。在Go中,一个类型只要实现了接口中的所有方法,它就隐式地实现了该接口,无需显式声明。

  3. 使用接口:在函数或方法的参数中使用接口类型,而不是具体的结构体类型。这样,任何实现了该接口的类型都可以作为参数传递,从而实现多态。

  4. 类型断言和类型选择:在需要时,可以使用类型断言(type assertion)或类型选择(type switch)来检查接口变量的底层具体类型,并据此执行不同的操作。但这通常应谨慎使用,以避免破坏多态的初衷。

  5. 空接口:空接口(interface{})不包含任何方法,因此任何类型都隐式地实现了空接口。这使得空接口在需要处理任意类型数据时非常有用,但也需要在运行时进行类型检查。

通过遵循这些原则,你可以在Go语言中有效地实现多态,从而编写出更加灵活和可扩展的代码。

回到顶部