Golang Go语言中泛型多态和接口多态有什么区别

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

今天面试被问到的,我答不上来,他问的是不是这两种写法的区别?


package main

import “fmt”

type Dog interface { eat() }

type dog struct{}

func (d dog) eat() { fmt.Println(“dog eat …”) }

func dogEat1[T Dog](d T) { d.eat() }

func dogEat2(d Dog) { d.eat() }

func main() { d := dog{} dogEat1(d) dogEat2(d) }


Golang Go语言中泛型多态和接口多态有什么区别

更多关于Golang Go语言中泛型多态和接口多态有什么区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

21 回复

struct 方法中不支持泛型 鸡肋

更多关于Golang Go语言中泛型多态和接口多态有什么区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


静态分发与动态分发,一个是编译期就确定,一个是需要运行时确定

不是很理解这个问题的目的,泛型和接口虽然能在一些情况下实现同样的功能,但它们是完全不一样的两样东西,原理也根本不一样。
搞不懂提问目的的话,我可能直接就回答 dogEat1 是用泛型实现的,dogEat2 是通过接口。。。

接口本身就是一个类型,这个类型是定死的。

由于 Go 以前没有泛型,因此接口负责处理一些多态问题。

可以认为,Go 对接口的支持更好一点,因此你在设计时可以优先试试接口,如果发现接口解决不了你的具体问题,再尝试用泛型。

靠,这刚发布就上面试题了?还没用上呢都

或者这样说,当需要用到 interface{} 时,才考虑用泛型。

是参数多态和子类型多态的区别

问个问题,用 go 开发的各位工作中已经使用泛型了吗

目前我这边的项目没有,还在统一使用 go1.17 版本

我在工作中也没有用过,听说下个版本泛型的[]符号要改成跟其他语言一样的<>,也就是说现在写的泛型代码只能存活一个小版本,谁敢在这时候用呢

忘了这条消息从哪看到的, 找不到出处了, 好像是做梦梦到的, 请忽略这一条

go 现在的泛型设计非常糟糕,用于类型约束的 interface 只能用于类型约束,而不能当普通接口动态派发。
这种“类型约束的 interface”和原本的 interface 完全是两种东西了,还共用一个名字。

不要道听途说,传播谣言。以 go 团队对于兼容性保证的作风来看,几无可能会改泛型的写法。

接口是动态分发,范型是编译时生产对应类型代码,猜的

有点扯 这 1.8 beta 功能 生产环境压根不可能用到吧

用了,但感觉目前没太大用处,主要是 method 不支持泛型参数,类型推导也太弱,就···裂开,感觉这个问题只要还用 Go 就不可能解决

1.18 对泛型的支持有很多限制. 几乎可以认为无法再实战中使用.

现在 Go 的泛型也就写写通用链表、树、utils 之类比较合适,没有啥特别大的具体作用

用上了,出来第一天就把所有项目换成了 1.18 ,现在是 1.18.3

1L 说的 struct 不支持泛型的话,那就只能应用于某个方法了?

在Go语言中,泛型多态和接口多态是两种不同的多态性实现方式,它们各自具有独特的特点和适用场景。

泛型多态是Go 1.18版本引入的新特性,它允许在定义函数、类型或方法时使用类型参数。这样,就可以编写出更加通用、可复用的代码。泛型多态的核心在于“类型抽象”,它关注的是如何在不同类型的值之间提供统一的操作。通过使用泛型,可以避免编写大量重复的代码,同时保持类型安全。

接口多态则是Go语言中一直存在的多态性实现方式。接口定义了一组方法签名,而不关心这些方法的具体实现。任何类型只要实现了接口中定义的方法,就可以被认为实现了该接口。接口多态的核心在于“行为抽象”,它关注的是对象之间的行为一致性。通过使用接口,可以实现解耦、增强代码的灵活性和可扩展性。

两者的主要区别在于抽象层次和适用场景。泛型多态更侧重于类型层次的抽象,适用于需要在不同类型之间提供统一操作的场景;而接口多态则更侧重于行为层次的抽象,适用于需要通过接口定义来约束对象行为的场景。

在实际编程中,可以根据具体需求选择使用泛型多态或接口多态。两者并不是互相替代的关系,而是可以相互补充,共同提高代码的复用性、灵活性和可维护性。

回到顶部