go 语言泛型多态和接口多态有什么区别 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
v2defy
V2EX    Go 编程语言

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

  •  
  •   v2defy 2022-06-06 17:43:17 +08:00 3679 次点击
    这是一个创建于 1273 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

     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) } 
    20 条回复    2022-06-11 17:00:07 +08:00
    keepeye
        1
    keepeye  
       2022-06-06 17:44:41 +08:00
    struct 方法中不支持泛型 鸡肋
    zu1k
        2
    zu1k  
       2022-06-06 17:52:56 +08:00 via Android
    静态分发与动态分发,一个是编译期就确定,一个是需要运行时确定
    BeautifulSoap
        3
    BeautifulSoap  
       2022-06-06 18:00:15 +08:00 via Android
    不是很理解这个问题的目的,泛型和接口虽然能在一些情况下实现同样的功能,但它们是完全不一样的两样东西,原理也根本不一样。
    搞不懂提问目的的话,我可能直接就回答 dogEat1 是用泛型实现的,dogEat2 是通过接口。。。
    cmdOptionKana
        4
    cmdOptionKana  
       2022-06-06 18:06:00 +08:00
    接口本身就是一个类型,这个类型是定死的。

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

    可以认为,Go 对接口的支持更好一点,因此你在设计时可以优先试试接口,如果发现接口解决不了你的具体问题,再尝试用泛型。
    Vegetable
        5
    Vegetable  
       2022-06-06 18:06:03 +08:00   1
    靠,这刚发布就上面试题了?还没用上呢都
    cmdOptionKana
        6
    cmdOptionKana  
       2022-06-06 18:09:10 +08:00
    或者这样说,当需要用到 interface{} 时,才考虑用泛型。
    Leviathann
        7
    Leviathann  
       2022-06-06 18:11:43 +08:00
    是参数多态和子类型多态的区别
    PlG5sBkXD1ziLeGB
        8
    PlG5sBkXD1ziLeGB  
       2022-06-06 18:36:29 +08:00 via iPhone
    问个问题,用 go 开发的各位工作中已经使用泛型了吗
    feelinglucky
        9
    feelinglucky  
       2022-06-06 18:38:48 +08:00
    @yyf1234 目前我这边的项目没有,还在统一使用 go1.17 版本
    v2defy
        10
    v2defy  
    OP
       2022-06-06 18:41:28 +08:00 via Android
    @yyf1234 我在工作中也没有用过,听说下个版本泛型的[]符号要改成跟其他语言一样的<>,也就是说现在写的泛型代码只能存活一个小版本,谁敢在这时候用呢
    v2defy
        11
    v2defy  
    OP
       2022-06-06 18:50:05 +08:00
    @v2defy 忘了这条消息从哪看到的, 找不到出处了, 好像是做梦梦到的, 请忽略这一条
    Buges
        12
    Buges  
       2022-06-06 18:56:35 +08:00 via Android
    go 现在的泛型设计非常糟糕,用于类型约束的 interface 只能用于类型约束,而不能当普通接口动态派发。
    这种“类型约束的 interface”和原本的 interface 完全是两种东西了,还共用一个名字。
    acehowxx
        13
    acehowxx  
       2022-06-06 20:00:55 +08:00 via Android
    @v2defy 不要道听途说,传播谣言。以 go 团队对于兼容性保证的作风来看,几无可能会改泛型的写法。
    xiongxin8802
        14
    xiongxin8802  
       2022-06-06 20:26:59 +08:00
    接口是动态分发,范型是编译时生产对应类型代码,猜的
    voidmnwzp
        15
    voidmnwzp  
       2022-06-06 20:39:52 +08:00 via iPhone
    有点扯 这 1.8 beta 功能 生产环境压根不可能用到吧
    iseki
        16
    iseki  
       2022-06-06 20:51:53 +08:00
    @yyf1234 用了,但感觉目前没太大用处,主要是 method 不支持泛型参数,类型推导也太弱,就裂开,感觉这个问题只要还用 Go 就不可能解决
    chaleaochexist
        17
    chaleaochexist  
       2022-06-06 20:59:47 +08:00
    @yyf1234 1.18 对泛型的支持有很多限制. 几乎可以认为无法再实战中使用.
    BeautifulSoap
        18
    BeautifulSoap  
       2022-06-06 23:03:40 +08:00
    现在 Go 的泛型也就写写通用链表、树、utils 之类比较合适,没有啥特别大的具体作用
    fengjianxinghun
        19
    fengjianxinghun  
       2022-06-07 10:15:41 +08:00
    用上了,出来第一天就把所有项目换成了 1.18 ,现在是 1.18.3
    tramm
        20
    tramm  
       2022-06-11 17:00:07 +08:00
    1L 说的 struct 不支持泛型的话,那就只能应用于某个方法了?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3718 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 04:15 PVG 12:15 LAX 20:15 JFK 23:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86