百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

把 Go 当脚本语言用(go脚本怎么运行)

toyiye 2024-06-30 09:53 31 浏览 0 评论

Go 作为一种可用于创建高性能网络和并发系统的编程语言,它的生态应用变得越来越广泛[1],同时,这也激发了开发人员使用 Go 作为脚本语言的兴趣。虽然目前 Go 还未准备好作为脚本语言 “开箱即用” 的特性,用来替代 Python 和 Bash ,但是我们只需要一点点准备工作就可以达到想要的目标。

正如来自 Codelang 的 Elton Minetto 所说的那样[2],Go 作为一门脚本语言的同时,也具有相当大的吸引力,这不仅包括 Go 本身强大的功能和简洁的语法,还包括对 goroutines 的良好支持等。Google 公司的软件工程师 Eyal Posener[3] 为 Go 用作脚本语言提供了更多的理由[4],例如,丰富的标准库和语言的简洁性使得维护工作变得更加容易。与之相对的是,Go 的贡献者和前 Google 公司员工 David Crawshaw 则强调了使用 Go 编写脚本任务的便利程度[5],因为几乎所有的程序员都在花费大量的时间编写复杂的程序。

基本上,我一直在编写 Go 程序,偶尔会写写 Bash、perl 和 python 。有时候,这些编程语言会落入我的脑海。

对于日常任务和不太频繁的脚本编写任务,倘若能够使用相同的编程语言,它将会大大提高效率。Cloudflare 公司的工程师 Ignat Korchagin 指出,Go 是一种强类型语言,它能够帮助 Go 脚本变得更加可靠,并且避免出现像拼写之类的小错误,从而不会出现发生在运行时的报错[6]

Codenation 使用 Go 编写的脚本文件,用来自动化地执行重复性的任务,这不仅是开发流程的一部分,还是其 CI/CD 管道中的任务。在 Codenation 内部,Go 脚本是通过 `go run`[7] 来执行的,go run 是 Go 构建工具链中的默认命令,能够一步一步地编译和运行 Go 程序。Posener 写道:“事实上,go run 并非作为解释器来使用。”

[...] bash 和 python 都是解释型语言 —— 它们在读取脚本的时候,然后执行脚本文件。另一方面,当您键入 go run 时,Go 编译器就会编译程序,然后运行它们。Go 程序的编译时间很短,这使它看起来就像是解释型语言一般。

为了让 Go 编写的脚本在 shell 脚本程序中表现良好,Codenation 的工程师使用了许多有用的 Go 软件包:

  • github.com/fatih/color[8] 是用于输出对应编码颜色的包。
  • github.com/schollz/progressbar[9] 是用于为执行时间过久的任务创建进度条的包。
  • github.com/jimlawless/whereami[10] 是用于捕获源代码的文件名、行号、函数等信息的包,这对于改正错误信息十分有用!
  • github.com/spf13/cobra[11] 是用于更轻松地创建带有输入选项和相关文档的复杂脚本的包。

Crawshaw 写道:“ 对于 Codenation 来说,虽然使用命令行工具 go run 来运行 Go 程序非常有效,但是它并非最完美的解决方案。” 特别是,Go 缺乏对读取-求值-输出循环 (REPL) 的支持,并且无法轻松地将 Shebang ( 译者注:Unix 系统中,通常称 #sharpshe;而称!bang ) 集成在一起,这使得脚本可以像二进制程序一样执行。此外,比起短小精悍的脚本文件,Go 错误处理更适合大型程序项目使用。由于这些原因,他开始研究 Neugram[12],该项目旨在创建一个 Go 克隆程序用来解决上述所有限制。不巧的是,Neugram 项目现在似乎已经被废弃,这可能是由于 Go 语法的所有细节的复杂性[13]

Gomacro[14] 项目使用了与 Neugram 类似的方法,它是一种 Go 的解释器,还支持类似 Lisp 的宏,既可以生成代码,又可以实现某种形式的泛型[15]

Gomacro 几乎是一个完整的 Go 解释器,它使用纯 Go 语言实现。它提供了交互式的REPL 模式和脚本模式,并且在运行时不需要 Go 构建工具链。(除了在在一种非常特殊的情况以外:在运行时导入第三方包。)

除了非常适合写脚本外,Gomacro 还旨在使得 Go 成为一种中间语言,表示要将它解释为 Go 的标准详细规范[16],还会提供 Go 源代码的调试器[17]

尽管在使用 Go 编写脚本的情况下,Gomacro 为其提供了最大灵活性,但不幸的是,它不是标准的 Go 语言,这引起了另一种程度的担忧。Posener 对使用标准的 Go 语言作为脚本语言的可能性进行了详细分析[18],包括针对丢失 Shebang 的解决方法。但是,这些解决方法都在某种程度上均有不足的体现。

似乎没有完美的解决方案,而且我也不明白为什么不能有一个完美的解决方案。看起来,运行 Go 脚本的方式最为简单,而最没有问题的方法就是使用 go run 命令。[...] 这就是我为什么认为在该语言领域上,仍需要做未完成的工作。同样的,我认为更改程序语言用来忽略 Shebang 不会有任何的危害。

但是,对于 Linux 系统,这里可能会有一个高级技巧,能够在具有完全 Shebang 支持的情况下,从命令行运行 Go 脚本。由 Korchagin 举例子并说明的这种方法,依赖于 Shebang 对 Linux 内核的支持,以及从 Linux 用户空间扩展受到支持二进制格式的可能性。长话短说,Korchagin 建议使用以下方式注册二进制:

nbsp;Echo ':golang:E::go::/usr/local/bin/gorun:OC' | sudo tee /proc/sys/fs/binfmt_misc/register
:golang:E::go::/usr/local/bin/gorun:OC

这样就可以设置完全标准的 Go 语言的可执行位,例如:

package main
import (
    "fmt"
    "os"
)
func main() {
    s := "world"

    if len(os.Args) > 1 {
        s = os.Args[1]
    }

    fmt.Printf("Hello, %v!", s)
    fmt.Println("")

    if s == "fail" {
        os.Exit(30)
    }
}

然后执行:

nbsp;chmod u+x helloscript.go
nbsp;./helloscript.go
Hello, world!
nbsp;./helloscript.go gopher
Hello, gopher!
nbsp;./helloscript.go fail
Hello, fail!
nbsp;Echo $?
30

尽管这种方法无法提供对 REPL 的支持,但是 Shebang 可能足以满足典型的用例。


via: https://www.infoq.com/news/2020/04/go-scripting-language/

作者:Sergio De Simone[19]译者:sunlingbot[20]校对:polaris1119[21]

本文由 GCTT[22] 原创编译,Go 中文网[23] 荣誉推出

参考资料

[1]

越来越广泛: https://blog.golang.org/survey2019-results

[2]

正如来自 Codelang 的 Elton Minetto 所说的那样: https://dev.to/codenation/using-golang-as-a-scripting-language-jl2

[3]

Eyal Posener: https://posener.github.io/about/

[4]

更多的理由: https://gist.github.com/posener/73ffd326d88483df6b1cb66e8ed1e0bd

[5]

强调了使用 Go 编写脚本任务的便利程度: https://news.ycombinator.com/item?id=15623106

[6]

帮助 Go 脚本变得更加可靠,并且避免出现像拼写之类的小错误,从而不会出现发生在运行时的报错: https://blog.cloudflare.com/using-go-as-a-scripting-language-in-linux/

[7]

go run: https://golang.org/cmd/go/#hdr-Compile_and_run_Go_program

[8]

github.com/fatih/color: https://github.com/fatih/color

[9]

github.com/schollz/progressbar: https://github.com/schollz/progressbar

[10]

github.com/jimlawless/whereami: https://github.com/jimlawless/whereami

[11]

github.com/spf13/cobra: https://github.com/spf13/cobra

[12]

Neugram: https://github.com/neugram/ng

[13]

由于 Go 语法的所有细节的复杂性: https://news.ycombinator.com/item?id=15623244

[14]

Gomacro: https://github.com/cosmos72/gomacro

[15]

泛型: https://github.com/cosmos72/gomacro#generics

[16]

解释为 Go 的标准详细规范: https://github.com/cosmos72/gomacro/blob/master/doc/code_generation.pdf

[17]

提供 Go 源代码的调试器: https://github.com/cosmos72/gomacro#debugger

[18]

Posener 对使用标准的 Go 语言作为脚本语言的可能性进行了详细分析: https://gist.github.com/posener/73ffd326d88483df6b1cb66e8ed1e0bd

[19]

Sergio De Simone: https://www.infoq.com/profile/Sergio-De-Simone/

[20]

sunlingbot: https://github.com/sunlingbot

[21]

polaris1119: https://github.com/polaris1119

[22]

GCTT: https://github.com/studygolang/GCTT

[23]

Go 中文网: https://studygolang.com/

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码