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

golang 咋这么恶心,解压 zip 文件居然要一大串代码,这不应该是语言内置一行搞定的吗?

  •  
  •   bthulu · Dec 3, 2022 · 10787 views
    This topic created in 1289 days ago, the information mentioned may be changed or developed.

    这简直不能忍啊

    C#版

    ZipFile.ExtractToDirectory("source", "target");
    

    Golang 版

    func Unzip(src, dest string) error {
        r, err := zip.OpenReader(src)
        if err != nil {
            return err
        }
        defer func() {
            if err := r.Close(); err != nil {
                panic(err)
            }
        }()
    
        os.MkdirAll(dest, 0755)
    
        // Closure to address file descriptors issue with all the deferred .Close() methods
        extractAndWriteFile := func(f *zip.File) error {
            rc, err := f.Open()
            if err != nil {
                return err
            }
            defer func() {
                if err := rc.Close(); err != nil {
                    panic(err)
                }
            }()
    
            path := filepath.Join(dest, f.Name)
    
            // Check for ZipSlip (Directory traversal)
            if !strings.HasPrefix(path, filepath.Clean(dest) + string(os.PathSeparator)) {
                return fmt.Errorf("illegal file path: %s", path)
            }
    
            if f.FileInfo().IsDir() {
                os.MkdirAll(path, f.Mode())
            } else {
                os.MkdirAll(filepath.Dir(path), f.Mode())
                f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
                if err != nil {
                    return err
                }
                defer func() {
                    if err := f.Close(); err != nil {
                        panic(err)
                    }
                }()
    
                _, err = io.Copy(f, rc)
                if err != nil {
                    return err
                }
            }
            return nil
        }
    
        for _, f := range r.File {
            err := extractAndWriteFile(f)
            if err != nil {
                return err
            }
        }
    
        return nil
    }
    
    50 replies    2022-12-26 15:07:14 +08:00
    XieGP
        1
    XieGP  
       Dec 3, 2022   ❤️ 2
    py 写多了吗:)
    loolac
        2
    loolac  
       Dec 3, 2022
    当然,还需要一台电脑 ~
    ChrisFreeMan
        3
    ChrisFreeMan  
       Dec 3, 2022   ❤️ 3
    真正的逻辑代码也没几行,大部分都是错误处理和 IO 释放
    GeruzoniAnsasu
        4
    GeruzoniAnsasu  
       Dec 3, 2022
    C: ……
    yazinnnn
        5
    yazinnnn  
       Dec 3, 2022   ❤️ 1
    ?迷惑发言
    wwqgtxx
        6
    wwqgtxx  
       Dec 3, 2022   ❤️ 7
    今日迷惑行为大赏
    icepie
        7
    icepie  
       Dec 3, 2022   ❤️ 24
    Golang 版
    Unzip("source", "target")
    yazinnnn
        8
    yazinnnn  
       Dec 3, 2022   ❤️ 1
    楼主发的这些帖子看上去跟个流量号似的
    ClarkAbe
        9
    ClarkAbe  
       Dec 3, 2022 via Android
    zz 发言......自个封装一个就能实现, 你要是懒得封装只能说你不要用这种接近底层的语言了....去 py 吧
    HugoChao
        10
    HugoChao  
       Dec 3, 2022
    你代码都有了为什么不封装一下呢
    oldshensheep
        11
    oldshensheep  
       Dec 3, 2022   ❤️ 8
    因为
    if err != nil {
    return err
    }
    C0VN
        12
    C0VN  
       Dec 3, 2022
    你写一个包给大家用不就好了。
    Jooooooooo
        13
    Jooooooooo  
       Dec 3, 2022
    golang 的 Unzip 不也是一行?
    QI41mOpKTG3jLhDt
        14
    QI41mOpKTG3jLhDt  
       Dec 3, 2022
    把这里面封一层再调用不就行了吗
    liuidetmks
        15
    liuidetmks  
       Dec 3, 2022 via iPhone
    c 不是更麻烦?
    deorth
        16
    deorth  
       Dec 3, 2022 via Android
    要在脑子里打开
    swulling
        17
    swulling  
       Dec 3, 2022 via iPhone   ❤️ 1
    https://github.com/artdarek/go-unzip

    随便找个库就行,go 标准库有些比较底层
    shakukansp
        18
    shakukansp  
       Dec 3, 2022
    ???
    yanqiyu
        19
    yanqiyu  
       Dec 3, 2022   ❤️ 16
    Go 语言并没有将解压 zip 文件作为语言内置的功能,这是因为 Go 的设计理念是尽可能保持简单,而不是提供尽可能多的功能。因此,如果你需要在 Go 中解压 zip 文件,就需要使用第三方库来实现这个功能。这些库通常都提供了一些简单的函数,可以让你在 Go 代码中很容易地解压 zip 文件。比如,你可以使用 Go 语言内置的 "archive/zip" 包来解压 zip 文件,它提供了一个名为" Unzip "的函数,可以让你很容易地解压 zip 文件。

    不是我说的,是 ChatAI 说的🐶
    https://twitter.com/clowwindy/status/1598979812831657984/photo/1
    infinityv
        20
    infinityv  
       Dec 3, 2022 via iPhone   ❤️ 3
    @yanqiyu #19 chatgpt 今天给我说 go 是一门动态语言,我说你特么扯淡呢吧,然后他就向我道歉,说我是对的。
    seakingii
        21
    seakingii  
       Dec 3, 2022   ❤️ 1
    c#的这个函数方法也是语言内置的,是.NET 类库里的. 语言和库都搞不清楚....
    dw2693734d
        22
    dw2693734d  
       Dec 3, 2022
    Golang 确实没有内置的函数来直接解压 zip 文件,但是它提供了一个标准库 "archive/zip",可以用来方便地解压 zip 文件。

    解压 zip 文件的一般步骤如下:

    导入 "archive/zip" 包
    读取 zip 文件内容,比如使用 ioutil.ReadFile()
    创建一个 zip.Reader ,用来处理 zip 文件内容
    遍历 zip.Reader.File ,获取每一个文件,并解压它
    代码示例如下:

    ```
    import (
    "archive/zip"
    "io"
    "io/ioutil"
    "os"
    "path/filepath"
    )

    // 解压 zip 文件
    func unzip(src, dest string) error {
    r, err := zip.OpenReader(src)
    if err != nil {
    return err
    }
    defer r.Close()

    for _, f := range r.File {
    rc, err := f.Open()
    if err != nil {
    return err
    }
    defer rc.Close()

    path := filepath.Join(dest, f.Name)
    if f.FileInfo().IsDir() {
    os.MkdirAll(path, f.Mode())
    } else {
    f, err := os.OpenFile(
    path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
    if err != nil {
    return err
    }
    defer f.Close()

    _, err = io.Copy(f, rc)
    if err != nil {
    return err
    }
    }
    }

    return nil
    }
    ```

    from OpenAI
    MMMMMMMMMMMMMMMM
        23
    MMMMMMMMMMMMMMMM  
       Dec 3, 2022   ❤️ 1
    不想造轮子就找 lib 呗,多简单一事

    小编这边推荐你使用易语言哦,不仅也只需要一行,还是中文的哦~
    ghostwind
        24
    ghostwind  
       Dec 3, 2022
    go 真正麻烦的解压缩 rar 文件
    LykorisR
        25
    LykorisR  
       Dec 3, 2022
    ??
    liaohongxing
        26
    liaohongxing  
       Dec 3, 2022
    rar 是专利格式 ,go 官方类库解压 rar 估计不会有 。
    liubaicai
        27
    liubaicai  
       Dec 3, 2022
    ZipFile 也不是 c#自带的吧
    leavic
        28
    leavic  
       Dec 3, 2022   ❤️ 2
    你们回什么贴啊,block 走人就是了。
    seakingii
        30
    seakingii  
       Dec 3, 2022
    @mmdsun 这只是官方实现的库,不是"C#语言自带的功能"...
    微软官方实现的库确实用起来方便,比如 File.WriteAllText , 一次性写入文本到一个文件,也很方便,但和"C#语言自带"这个概念不相符,其实用 VB.NET 一样可以用这些函数,只要.NET 支持的语言都可以.
    seakingii
        31
    seakingii  
       Dec 3, 2022
    需求是无穷无尽的,官方也只能挑着实现了,人力毕竟有限
    djoiwhud
        32
    djoiwhud  
       Dec 4, 2022 via Android
    go 语言怎么这么恶心。自动把账号功能收到的资金转账到楼主的账号,这么基础的功能都不能自动实现吗?

    本来楼主就要实现万亿资产的目标,都怪 go 太垃圾。
    ewBuyVmLZMZE
        33
    ewBuyVmLZMZE  
       Dec 4, 2022
    你贴的代码有一定的安全性问题,可以参考我这个实现。

    https://github.com/bookstairs/bookhunter/blob/master/internal/file/decompress.go
    changyang
        34
    changyang  
       Dec 4, 2022
    @yanqiyu 恩必
    LANB0
        35
    LANB0  
       Dec 4, 2022
    C:你在说什么? golang 这点代码都还不够我 zip 格式头逐字段解析呢?
    vanton
        36
    vanton  
       Dec 4, 2022
    有那么多库可以用,你这样自己找麻烦么
    liubaicai
        37
    liubaicai  
       Dec 4, 2022
    @mmdsun “这些示例需要将以下 NuGet 包添加到项目中:” 你仔细看看
    blankmiss
        38
    blankmiss  
       Dec 4, 2022
    java 不是一样的 正是因为这样才有很多轮子作者
    JohnBull
        39
    JohnBull  
       Dec 4, 2022
    shell 省事,可你嫌不 cool 啊
    oldshensheep
        40
    oldshensheep  
       Dec 4, 2022
    @blankmiss Java 可不一样
    https://gist.github.com/oldshensheep/bea5bd4c313f27884bc87dced9917bf6
    带完整的错误处理和流关闭处理,核心函数一共 19 行。
    Fuhuang
        41
    Fuhuang  
       Dec 4, 2022
    不,是你原来习惯的.Net 太实用了
    adoyle
        42
    adoyle  
       Dec 4, 2022   ❤️ 1
    已 block (善意提醒以后别回我的评论,我看不到的)
    lincanbin
        43
    lincanbin  
       Dec 4, 2022
    slice contain 、max 、min 也没有。
    习惯就好。
    bthulu
        44
    bthulu  
    OP
       Dec 5, 2022
    @liubaicai 仔细看过了, 并不需要导入任何 nuget 包
    bthulu
        45
    bthulu  
    OP
       Dec 5, 2022
    @adoyle block 谁还不会啊, 已 block (善意提醒以后别回我的评论,我也看不到的)
    dragonsunmoon
        46
    dragonsunmoon  
       Dec 5, 2022
    只能说明 go 的生态还不行, 自带的标准库比不上 .net 和 java. 开源的工具库项目里, 很少有类似有基金会支持的开源项目, 代码质量和后续维护都令人担忧, 大家都不得不自己造轮子
    dragonsunmoon
        47
    dragonsunmoon  
       Dec 5, 2022
    有一说一, go 的标准库是真的简陋, 不好用. 就连个 decimal 标准库里都没有. 感觉设计实现标准库的人, 完全没有做过业务系统, api 的易用性完全是一点都不考虑, 唉...
    blsm
        48
    blsm  
       Dec 7, 2022
    go 的生态确实不太行,标准库太简陋了。不内置,官方出个工具包也行
    chinaufo
        49
    chinaufo  
       Dec 19, 2022
    golang 内置不行就是不行,为什么不敢承认呢
    allgy
        50
    allgy  
       Dec 26, 2022
    厨子不行怪灶台
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2781 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 119ms · UTC 09:57 · PVG 17:57 · LAX 02:57 · JFK 05:57
    ♥ Do have faith in what you're doing.