Gox语言中下载文件-GX50.1

Gox语言中可以使用基本的Go语言标准包(net/http包)进行文件下载,也可以使用内置的github.com/topxeq/tk包中的DownloadFile函数进行下载。另一种方法,也是可以更精细地控制的方法,是使用内置的github.com/cavaliercoder/grab包进行更方便、功能更全面的下载。

关于github.com/cavaliercoder/grab包的详细试用可以参看该包的参考文档

最简单的下载代码如下:

// 设定github.com/cavaliercoder/grab包的简称为grab
grab = github_cavaliercoder_grab

// 调用grab的Get函数进行简单的下载
resp, err = grab.Get(".", "https://github.com/cmderdev/cmder/releases/download/v1.3.16/cmder_mini.zip")

// 判断下载中是否出错
if err != nil {

    plerr(err)

    exit()

}

// 输出保存的本地文件名
println("Download saved to", resp.Filename)

pass()

实际有效代码仅一行,就实现了功能完整的下载,下载还支持断点续传的功能。

如果希望在下载时显示更多的信息,例如下载了多少字节、下载百分比等等,可以参考下面的代码:

grab = github_cavaliercoder_grab

client := grab.NewClient()
req, _ := grab.NewRequest(".", "https://github.com/cmderdev/cmder/releases/download/v1.3.16/cmder_mini.zip")

fmt.Printf("Downloading %v...\n", req.URL())
resp := client.Do(req)
fmt.Printf("  %v\n", resp.HTTPResponse.Status)

// 启动一个线程,每个100毫秒输出一次下载状态
go func() {
    for {
        tk.SleepMilliSeconds(100)
        fmt.Printf("\r  transferred %v / %v bytes (%.2f%%)",
                resp.BytesComplete(),
                resp.Size(),
                100*resp.Progress())
    }
}()

err := resp.Err()

if err != nil {
    fmt.Fprintf(os.Stderr, "Download failed: %v\n", err)
    os.Exit(1)
}

fmt.Printf("Download saved to ./%v \n", resp.Filename)

pass()

其中,使用了grab的NewClient函数来新建一个下载客户端,然后最重要的是启动一个线程来定时输出下载状态,代码比较好懂,因此没有过多的解释。代码运行的中间效果如下:

C:\Users\Administrator>gox -gopath downloadFile.gox
Downloading https://github.com/cmderdev/cmder/releases/download/v1.3.16/cmder_mini.zip...
  200 OK
  transferred 1583695 / 9584905 bytes (16.52%)

可以看到,使用Gox下载文件是非常方便的。

注意:

  • Gox语言是脱胎于Go语言(Golang)的开源脚本语言,解释执行,但相比Go语言更贴近高级语言,语法硬性限制也少一些;是一门偏向快速应用的语言,也可以说是一个集成工具;

  • Gox语言主要优势有三点:

    • 第一,Gox语言本身只有一个可执行文件,绿色免配置,下载即可使用,无需安装Go语言环境,无需编译,非常适合快速制作原型以及云服务器上的远程开发;
    • 第二,Gox中可以直接使用绝大多数Go语言标准库中的对象和方法函数,也内置了很多常用、优秀的第三方库,充分发挥Go语言多年积累的资源优势;
    • 第三,与很多其他主流语言不同,Gox语言着力解决了GUI图形界面编程的问题,内置了基于Fyne、Giu(imgui)、LCL、Sciter的多套图形界面编程库,直接可以进行快捷高效的图形界面开发(LCL、Sciter只需分别下载一个动态链接库文件,执行和分发时附带上即可),特别适合编写演示原型系统。

作为脚本语言,Gox语言性能肯定不如Go语言这样的编译型语言快,但由于Gox语言与Go语言的紧密联系,Gox语言编写的脚本可以很容易的改写成Go语言代码,编译执行后就可以发挥Go语言的速度优势了。因此,Gox语言也比较适合做初期的Go语言调试,还有一个更直接的方式是使用Gotx(在Gox官网上也有下载),这是使用完全和Go语言一样语法的解释器,可以理解成集成了Go语言标准库和不少第三方库的解释执行的Go语言,一样也不需要搭建Go语言环境。Gotx与Gox的区别在于,Gotx仍然遵循Go语言的文法,代码相对复杂一些,限制也多一些,但改写回Go语言准备编译执行时,基本上没有成本。

Gox的官网在这里,也可以在浏览器搜索引擎中直接搜索“gox语言”,Github页面在这里,在这里可以看到很多Gox语言的学习指南和实际应用实例。