Golang 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
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语言中一直存在的多态性实现方式。接口定义了一组方法签名,而不关心这些方法的具体实现。任何类型只要实现了接口中定义的方法,就可以被认为实现了该接口。接口多态的核心在于“行为抽象”,它关注的是对象之间的行为一致性。通过使用接口,可以实现解耦、增强代码的灵活性和可扩展性。
两者的主要区别在于抽象层次和适用场景。泛型多态更侧重于类型层次的抽象,适用于需要在不同类型之间提供统一操作的场景;而接口多态则更侧重于行为层次的抽象,适用于需要通过接口定义来约束对象行为的场景。
在实际编程中,可以根据具体需求选择使用泛型多态或接口多态。两者并不是互相替代的关系,而是可以相互补充,共同提高代码的复用性、灵活性和可维护性。