V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
v2defy

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

  •  
  •   v2defy · Jun 6, 2022 · 3878 views
    This topic created in 1432 days ago, the information mentioned may be changed or developed.

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

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

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

    可以认为,Go 对接口的支持更好一点,因此你在设计时可以优先试试接口,如果发现接口解决不了你的具体问题,再尝试用泛型。
    Vegetable
        5
    Vegetable  
       Jun 6, 2022   ❤️ 1
    靠,这刚发布就上面试题了?还没用上呢都
    cmdOptionKana
        6
    cmdOptionKana  
       Jun 6, 2022
    或者这样说,当需要用到 interface{} 时,才考虑用泛型。
    Leviathann
        7
    Leviathann  
       Jun 6, 2022
    是参数多态和子类型多态的区别
    PlG5sBkXD1ziLeGB
        8
    PlG5sBkXD1ziLeGB  
       Jun 6, 2022 via iPhone
    问个问题,用 go 开发的各位工作中已经使用泛型了吗
    feelinglucky
        9
    feelinglucky  
       Jun 6, 2022
    @yyf1234 目前我这边的项目没有,还在统一使用 go1.17 版本
    v2defy
        10
    v2defy  
    OP
       Jun 6, 2022 via Android
    @yyf1234 我在工作中也没有用过,听说下个版本泛型的[]符号要改成跟其他语言一样的<>,也就是说现在写的泛型代码只能存活一个小版本,谁敢在这时候用呢
    v2defy
        11
    v2defy  
    OP
       Jun 6, 2022
    @v2defy 忘了这条消息从哪看到的, 找不到出处了, 好像是做梦梦到的, 请忽略这一条
    Buges
        12
    Buges  
       Jun 6, 2022 via Android
    go 现在的泛型设计非常糟糕,用于类型约束的 interface 只能用于类型约束,而不能当普通接口动态派发。
    这种“类型约束的 interface”和原本的 interface 完全是两种东西了,还共用一个名字。
    acehowxx
        13
    acehowxx  
       Jun 6, 2022 via Android
    @v2defy 不要道听途说,传播谣言。以 go 团队对于兼容性保证的作风来看,几无可能会改泛型的写法。
    xiongxin8802
        14
    xiongxin8802  
       Jun 6, 2022
    接口是动态分发,范型是编译时生产对应类型代码,猜的
    voidmnwzp
        15
    voidmnwzp  
       Jun 6, 2022 via iPhone
    有点扯 这 1.8 beta 功能 生产环境压根不可能用到吧
    iseki
        16
    iseki  
       Jun 6, 2022
    @yyf1234 用了,但感觉目前没太大用处,主要是 method 不支持泛型参数,类型推导也太弱,就···裂开,感觉这个问题只要还用 Go 就不可能解决
    chaleaochexist
        17
    chaleaochexist  
       Jun 6, 2022
    @yyf1234 1.18 对泛型的支持有很多限制. 几乎可以认为无法再实战中使用.
    BeautifulSoap
        18
    BeautifulSoap  
       Jun 6, 2022
    现在 Go 的泛型也就写写通用链表、树、utils 之类比较合适,没有啥特别大的具体作用
    fengjianxinghun
        19
    fengjianxinghun  
       Jun 7, 2022
    用上了,出来第一天就把所有项目换成了 1.18 ,现在是 1.18.3
    tramm
        20
    tramm  
       Jun 11, 2022
    1L 说的 struct 不支持泛型的话,那就只能应用于某个方法了?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5234 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 09:47 · PVG 17:47 · LAX 02:47 · JFK 05:47
    ♥ Do have faith in what you're doing.