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

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

  •  1
     
  •   weakish · 11 天前 · 1778 次点击
    比如,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
        1
    faceair   11 天前 via iPhone
    行数可以变短但必然带来额外的开销(内存分配),一般 go 作为高性能后端对这些都是很敏感的
        2
    loading   11 天前 via iPhone
    我一直认为 golang 需要一个牛逼的 Code Snippet。
        3
    orzfly   11 天前
    @faceair #1 标准库臃肿和额外的内存开销并没有必然联系吧。
        4
    faceair   11 天前 via iPhone
    @orzfly 🤔 是我想错了,这么说好像确实不合适
        5
    ZSeptember   11 天前 via Android
    你需要一个基础库而已,现在 go 没有很好的,自己慢慢积累吧。最近用 Go 重写公司项目,写了好多工具方法。
        6
    skadi   11 天前
    @faceair 你是要笑死我.
        7
    Kisesy   11 天前
    计算一个 sha256,最少两行吧
    data, _ := ioutil.ReadFile("test.exe")
    sha256.Sum256(data)
        8
    faceair   11 天前
    @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)
        9
    faceair   11 天前
    有个 typo,上面有个堆写成栈了
        10
    MeteorCat   11 天前 via Android
    有个方法就是利用 C 扩展......
        11
    orvice   11 天前
    这时候就需要自己 /公司有个 go 的公共库
        12
    inflationaaron   10 天前 via iPad
    也不看看 Python 和 Java 都出来多久了。battery-included 这种概念也是最近才有的,ruby 就是一个例子。完全社区化就是 nodejs 搞的,啥都有包。
        13
    gowl   10 天前
    @faceair Code Snippet 指的是什么?
        14
    ifsclimbing   10 天前
    @faceair 哈哈,第一次听说行数和内存分配有关系
        15
    abscon   10 天前 via iPhone
    @loading 难道不是需要尖括号
        16
    gnaggnoyil   10 天前
    @faceair 不太了解 go,不过碰到这种情况不考虑用 lazy evaluation 避免将内存分配写死吗?
        17
    ech0x   9 天前 via iPhone
    我觉得我 go 的标准库已经挺够用了,这个问题出现是因为 go 的第三方库还不够多吧。
    真要说标准库不够用的是 swift 吧,虽然是跨平台了,但是标准库完全没法用啊。
        18
    mengzhuo   9 天前 via iPhone
    @skadi 他的说法其实没问题
    更多的代码确实会占用更多的 TEXT 空间,也就是内存。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1821 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 63ms · UTC 15:20 · PVG 23:20 · LAX 07:20 · JFK 10:20
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1