go 语言泛型多态和接口多态有什么区别

2022-06-06 17:43:17 +08:00
 v2defy

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


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)
}


3217 次点击
所在节点    Go 编程语言
20 条回复
keepeye
2022-06-06 17:44:41 +08:00
struct 方法中不支持泛型 鸡肋
zu1k
2022-06-06 17:52:56 +08:00
静态分发与动态分发,一个是编译期就确定,一个是需要运行时确定
BeautifulSoap
2022-06-06 18:00:15 +08:00
不是很理解这个问题的目的,泛型和接口虽然能在一些情况下实现同样的功能,但它们是完全不一样的两样东西,原理也根本不一样。
搞不懂提问目的的话,我可能直接就回答 dogEat1 是用泛型实现的,dogEat2 是通过接口。。。
cmdOptionKana
2022-06-06 18:06:00 +08:00
接口本身就是一个类型,这个类型是定死的。

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

可以认为,Go 对接口的支持更好一点,因此你在设计时可以优先试试接口,如果发现接口解决不了你的具体问题,再尝试用泛型。
Vegetable
2022-06-06 18:06:03 +08:00
靠,这刚发布就上面试题了?还没用上呢都
cmdOptionKana
2022-06-06 18:09:10 +08:00
或者这样说,当需要用到 interface{} 时,才考虑用泛型。
Leviathann
2022-06-06 18:11:43 +08:00
是参数多态和子类型多态的区别
yyf1234
2022-06-06 18:36:29 +08:00
问个问题,用 go 开发的各位工作中已经使用泛型了吗
feelinglucky
2022-06-06 18:38:48 +08:00
@yyf1234 目前我这边的项目没有,还在统一使用 go1.17 版本
v2defy
2022-06-06 18:41:28 +08:00
@yyf1234 我在工作中也没有用过,听说下个版本泛型的[]符号要改成跟其他语言一样的<>,也就是说现在写的泛型代码只能存活一个小版本,谁敢在这时候用呢
v2defy
2022-06-06 18:50:05 +08:00
@v2defy 忘了这条消息从哪看到的, 找不到出处了, 好像是做梦梦到的, 请忽略这一条
Buges
2022-06-06 18:56:35 +08:00
go 现在的泛型设计非常糟糕,用于类型约束的 interface 只能用于类型约束,而不能当普通接口动态派发。
这种“类型约束的 interface”和原本的 interface 完全是两种东西了,还共用一个名字。
acehowxx
2022-06-06 20:00:55 +08:00
@v2defy 不要道听途说,传播谣言。以 go 团队对于兼容性保证的作风来看,几无可能会改泛型的写法。
xiongxin8802
2022-06-06 20:26:59 +08:00
接口是动态分发,范型是编译时生产对应类型代码,猜的
voidmnwzp
2022-06-06 20:39:52 +08:00
有点扯 这 1.8 beta 功能 生产环境压根不可能用到吧
iseki
2022-06-06 20:51:53 +08:00
@yyf1234 用了,但感觉目前没太大用处,主要是 method 不支持泛型参数,类型推导也太弱,就···裂开,感觉这个问题只要还用 Go 就不可能解决
chaleaochexist
2022-06-06 20:59:47 +08:00
@yyf1234 1.18 对泛型的支持有很多限制. 几乎可以认为无法再实战中使用.
BeautifulSoap
2022-06-06 23:03:40 +08:00
现在 Go 的泛型也就写写通用链表、树、utils 之类比较合适,没有啥特别大的具体作用
fengjianxinghun
2022-06-07 10:15:41 +08:00
用上了,出来第一天就把所有项目换成了 1.18 ,现在是 1.18.3
tramm
2022-06-11 17:00:07 +08:00
1L 说的 struct 不支持泛型的话,那就只能应用于某个方法了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/857646

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX