今天面试被问到的,我答不上来,他问的是不是这两种写法的区别?
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)
}
1
keepeye 2022-06-06 17:44:41 +08:00
struct 方法中不支持泛型 鸡肋
|
2
zu1k 2022-06-06 17:52:56 +08:00 via Android
静态分发与动态分发,一个是编译期就确定,一个是需要运行时确定
|
3
BeautifulSoap 2022-06-06 18:00:15 +08:00 via Android
不是很理解这个问题的目的,泛型和接口虽然能在一些情况下实现同样的功能,但它们是完全不一样的两样东西,原理也根本不一样。
搞不懂提问目的的话,我可能直接就回答 dogEat1 是用泛型实现的,dogEat2 是通过接口。。。 |
4
cmdOptionKana 2022-06-06 18:06:00 +08:00
接口本身就是一个类型,这个类型是定死的。
由于 Go 以前没有泛型,因此接口负责处理一些多态问题。 可以认为,Go 对接口的支持更好一点,因此你在设计时可以优先试试接口,如果发现接口解决不了你的具体问题,再尝试用泛型。 |
5
Vegetable 2022-06-06 18:06:03 +08:00 1
靠,这刚发布就上面试题了?还没用上呢都
|
6
cmdOptionKana 2022-06-06 18:09:10 +08:00
或者这样说,当需要用到 interface{} 时,才考虑用泛型。
|
7
Leviathann 2022-06-06 18:11:43 +08:00
是参数多态和子类型多态的区别
|
8
yyf1234 2022-06-06 18:36:29 +08:00 via iPhone
问个问题,用 go 开发的各位工作中已经使用泛型了吗
|
9
feelinglucky 2022-06-06 18:38:48 +08:00
@yyf1234 目前我这边的项目没有,还在统一使用 go1.17 版本
|
10
v2defy OP @yyf1234 我在工作中也没有用过,听说下个版本泛型的[]符号要改成跟其他语言一样的<>,也就是说现在写的泛型代码只能存活一个小版本,谁敢在这时候用呢
|
12
Buges 2022-06-06 18:56:35 +08:00 via Android
go 现在的泛型设计非常糟糕,用于类型约束的 interface 只能用于类型约束,而不能当普通接口动态派发。
这种“类型约束的 interface”和原本的 interface 完全是两种东西了,还共用一个名字。 |
13
acehowxx 2022-06-06 20:00:55 +08:00 via Android
@v2defy 不要道听途说,传播谣言。以 go 团队对于兼容性保证的作风来看,几无可能会改泛型的写法。
|
14
xiongxin8802 2022-06-06 20:26:59 +08:00
接口是动态分发,范型是编译时生产对应类型代码,猜的
|
15
voidmnwzp 2022-06-06 20:39:52 +08:00 via iPhone
有点扯 这 1.8 beta 功能 生产环境压根不可能用到吧
|
16
iseki 2022-06-06 20:51:53 +08:00
@yyf1234 用了,但感觉目前没太大用处,主要是 method 不支持泛型参数,类型推导也太弱,就···裂开,感觉这个问题只要还用 Go 就不可能解决
|
17
chaleaochexist 2022-06-06 20:59:47 +08:00
@yyf1234 1.18 对泛型的支持有很多限制. 几乎可以认为无法再实战中使用.
|
18
BeautifulSoap 2022-06-06 23:03:40 +08:00
现在 Go 的泛型也就写写通用链表、树、utils 之类比较合适,没有啥特别大的具体作用
|
19
fengjianxinghun 2022-06-07 10:15:41 +08:00
用上了,出来第一天就把所有项目换成了 1.18 ,现在是 1.18.3
|
20
tramm 2022-06-11 17:00:07 +08:00
1L 说的 struct 不支持泛型的话,那就只能应用于某个方法了?
|