The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
kkhaike

go 泛型以后会支持特例化吗

  •  
  •   kkhaike ·
    kkhaike · Aug 6, 2022 · 5026 views
    This topic created in 1551 days ago, the information mentioned may be changed or developed.

    RT ,网上搜不到有相关计划的言论和类似的问题。。

    最近有个工具库想改成泛型。发现没有特例化根本写不出来。连 isEmpty 这种都写不出来。(samber/lo 的 IsEmpty 只能作用于 comparable )。

    其他语言泛型之所以这么花很大的原因就是特例化。。

    我在想如果函数本身特例化不好实现。以后会不会方法实现类似于

    func IsEmpty[T any](x T) bool {
      switchtype T {
      case comparable:
        var zero T
        return x == zero
      case xxx:
        其他实现,每个 case 块做到 build 隔离,
        要不 如果是 uncomparable 类型,就无法构建 == 了
      case YYY:
      }
    }
    
    14 replies  •  2022-08-07 20:06:12 +08:00
    bosskwei
    bosskwei
    Aug 6, 2022
    1
    你这是动态语言的写法,像 py 一样 isinstance 。编译型语言应该是 func IsEmpty[T comparable](x T) bool 这样写
    weirdte
    weirdte
    Aug 6, 2022 via iPhone
    2
    @bosskwei 特化,rust 和 cpp 支持的
    keenkiller
    keenkiller
    Aug 6, 2022
    3
    你这个也不是不能搞,你写一个接口把 case 对应的接口全写进去,然后 T 用这个接口做约束…就是用起来很烦。

    或者你还是用 switch t.(type)这种非泛型思路写吧。
    Trim21
    Trim21
    Aug 6, 2022 via Android
    4
    很可能不会支持…

    go 的博客里有这么一句话

    “write Go programs by writing code, not by defining types”
    cubecube
    cubecube
    Aug 6, 2022
    5
    @Trim21 哈哈,我倒是感觉以后没准会,毕竟 JAVA 的基础类型泛型特例化都要来
    lance6716
    lance6716
    Aug 6, 2022 via Android
    6
    如果自己根据类型不同,写成 IsEmpty1 ,IsEmpty2 ,有什么不方便使用的呢?

    这里不方便的点,就是编译时难处理的点
    dragonsunmoon
    dragonsunmoon
    Aug 6, 2022
    7
    唉...go 的泛型还是一个残废呀
    泛型与 go 的语言设计思想就是背道而驰的, 即便弄出个泛型, 也是这种夹生饭.
    24bit
    24bit
    Aug 6, 2022
    8
    短期不用想
    zizon
    zizon
    Aug 6, 2022
    9
    你有没想过限定 T 为某个 type interface { IsEmpty bool() }?
    lysS
    lysS
    Aug 6, 2022❤️1
    10
    可以把基础类型定义为自定义类型,然后通过“泛型接口”

    type CanEmptyT interface {
    ~int | ~string | ~[]byte
    Empty() bool
    }


    type SliceByte []byte

    func (sb SliceByte) Empty() bool {
    if sb == nil || *(*int)(unsafe.Add(unsafe.Pointer(&sb), 8 /*WORD*/)) == 0 {
    return true
    } else {
    return false
    }
    }

    func DoSomething[T CanEmptyT](v T) {
    if v.Empty() {
    fmt.Println("null")
    } else {
    fmt.Println(v)
    }
    }

    func main() {
    var a SliceByte
    DoSomething(a)

    var b []byte
    DoSomething[SliceByte](b)
    }


    这种泛型与接口结合的方法我觉得可以使 go 达到“完备”;但是目前有性能损失: https://www.infoq.cn/article/xprmcl5qbf6yvdroajyn
    Aloento
    Aloento
    Aug 6, 2022
    11
    在 golang 里面搞这些也不太现实,毕竟 golang 这种语言的目标就是一把梭快速开发
    Manweill
    Manweill
    Aug 6, 2022
    12
    来.NET 吧,你想到的都有
    bruce0
    bruce0
    Aug 6, 2022
    13
    @lysS 这篇文章真的干, 看了半个多小时 好多知识还是没能消化😭
    wewewefff
    wewewefff
    Aug 7, 2022
    14
    GO 是最简单的方式,完成最好的效果
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1543 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 18:10 · PVG 02:10 · LAX 10:10 · JFK 13:10
    ♥ Do have faith in what you're doing.