V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
weakish
V2EX  ›  问与答

有没有臃肿版的 Go 标准库?

  •  1
     
  •   weakish · 2018-02-14 15:03:12 +08:00 · 3778 次点击
    这是一个创建于 2475 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,sha256 一个文件需要写 10 行左右,心疼我的手指。
    Ruby 只要两行(当然,Ruby 有点过头了,标准库里有太多差别很细微的方法,乃至一模一样的方法别名,污染补全列表)。
    Python 和 Java (使用 Apache Commons 之类)也不过三五行。

    再比如标准库里没有 Set,好好的 set.add(e)要写成 set[e] = true,虽然不过稍微多打了几个字,手指还好,但脑子很累,打字的时候要转换一下,阅读的时候还要转换一下。

    所以,想问下有没有臃肿版本的 Go 标准库?
    18 条回复    2018-02-16 22:31:06 +08:00
    faceair
        1
    faceair  
       2018-02-14 15:28:42 +08:00 via iPhone
    行数可以变短但必然带来额外的开销(内存分配),一般 go 作为高性能后端对这些都是很敏感的
    loading
        2
    loading  
       2018-02-14 15:47:53 +08:00 via iPhone
    我一直认为 golang 需要一个牛逼的 Code Snippet。
    orzfly
        3
    orzfly  
       2018-02-14 15:48:29 +08:00
    @faceair #1 标准库臃肿和额外的内存开销并没有必然联系吧。
    faceair
        4
    faceair  
       2018-02-14 15:54:45 +08:00 via iPhone
    @orzfly 🤔 是我想错了,这么说好像确实不合适
    ZSeptember
        5
    ZSeptember  
       2018-02-14 16:20:46 +08:00 via Android
    你需要一个基础库而已,现在 go 没有很好的,自己慢慢积累吧。最近用 Go 重写公司项目,写了好多工具方法。
    skadi
        6
    skadi  
       2018-02-14 18:59:35 +08:00
    @faceair 你是要笑死我.
    Kisesy
        7
    Kisesy  
       2018-02-14 19:09:13 +08:00
    计算一个 sha256,最少两行吧
    data, _ := ioutil.ReadFile("test.exe")
    sha256.Sum256(data)
    faceair
        8
    faceair  
       2018-02-14 20:08:23 +08:00
    @skadi #6 没啥好笑的啊 我的全部思考过程是这样的

    比如 #7 给的这个例子里返回了一个 hash 的 byte slice,这个返回值就极有可能生成到栈上影响 GC 性能啊
    生成我们想要的 hash 值可以粗略的认为有两步,第一步是计算,第二部将计算结果转为期望的编码 ( hex 或 base64 )标准库写法这么冗长的原因将这两步拆开了,允许你自己将这两步的结果 slice 自己先塞进去,避免标准库把对象分配到堆上

    我前面跟 @orzfly #3 说想错了的意思是,两者确实不是强关联的
    比如我前面描述的两步是可以捏到一起的,第二步的结果的 slice 允许当参数传入就好了 所以 #7 的 API 可以大概设计成

    result = make([]byte, 0, 64)
    err = sha256.SumHex(data, result)
    faceair
        9
    faceair  
       2018-02-14 20:23:11 +08:00
    有个 typo,上面有个堆写成栈了
    MeteorCat
        10
    MeteorCat  
       2018-02-14 20:58:01 +08:00 via Android
    有个方法就是利用 C 扩展......
    orvice
        11
    orvice  
       2018-02-14 23:04:05 +08:00
    这时候就需要自己 /公司有个 go 的公共库
    inflationaaron
        12
    inflationaaron  
       2018-02-15 00:31:25 +08:00 via iPad
    也不看看 Python 和 Java 都出来多久了。battery-included 这种概念也是最近才有的,ruby 就是一个例子。完全社区化就是 nodejs 搞的,啥都有包。
    gowl
        13
    gowl  
       2018-02-15 01:15:59 +08:00
    @faceair Code Snippet 指的是什么?
    ifsclimbing
        14
    ifsclimbing  
       2018-02-15 01:28:31 +08:00
    @faceair 哈哈,第一次听说行数和内存分配有关系
    abscon
        15
    abscon  
       2018-02-15 15:26:35 +08:00 via iPhone
    @loading 难道不是需要尖括号
    gnaggnoyil
        16
    gnaggnoyil  
       2018-02-15 15:58:34 +08:00
    @faceair 不太了解 go,不过碰到这种情况不考虑用 lazy evaluation 避免将内存分配写死吗?
    ech0x
        17
    ech0x  
       2018-02-16 11:30:12 +08:00 via iPhone
    我觉得我 go 的标准库已经挺够用了,这个问题出现是因为 go 的第三方库还不够多吧。
    真要说标准库不够用的是 swift 吧,虽然是跨平台了,但是标准库完全没法用啊。
    mengzhuo
        18
    mengzhuo  
       2018-02-16 22:31:06 +08:00 via iPhone
    @skadi 他的说法其实没问题
    更多的代码确实会占用更多的 TEXT 空间,也就是内存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:04 · PVG 15:04 · LAX 23:04 · JFK 02:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.