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 · 3220 次点击
    这是一个创建于 908 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    
    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
    是参数多态和子类型多态的区别
    yyf1234
        8
    yyf1234  
       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   ·   实用小工具   ·   895 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:27 · PVG 05:27 · LAX 13:27 · JFK 16:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.