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