Gotx是一个Go语言(Golang)的解释器和运行环境,只有单个可执行文件,绿色、跨平台,无需安装任何Go语言环境就可以直接运行Go语言代码,支持绝大多数Go语言标准库,以及一些有用的第三方包/库,可以进行图形界面(GUI)编程,自带代码编辑器和REPL命令行交互式运行环境,支持代码脚本加密,堪称Go语言开发者的神器。Gotx适合的使用场景主要是:
Gotx基于yaegi这个非常优秀的Go语言解释器,在此基础上提供了更为丰富的运行环境支持和内置的第三方包。Gotx同时也提供一个纯命令行版本Gotxc。
Gotx的安装非常简单,只需要到其下载页面下载对应操作系统的压缩包,解压后仅一个可执行文件,放入合适的文件夹(目录)中即可,最好放到系统的PATH环境变量中,这样可以更方便地执行。Gotx的下载页面在这里,Github主页面在这里。
下面举例说明Gotx的特性用法。
直接运行gotx程序不带任何参数即进入交互式运行环境REPL,可以尝试像脚本一样运行Go语言的代码,对Go语言编译运行惯了的开发者来说,应该是非常高兴的。
C:\Users\Administrator>gotx> import "math/rand"0xc0001926a0> println(rand.Int())9119787617706712871> printf("1.6 * 3.8 = %v\n", 1.6 * 3.8)1:28: undefined: printf> import("tk")0xc000192d00> tk.Pl("1.6 * 3.8 = %v", 1.6 * 3.8)1.6 * 3.8 = 6.08<nil>> import "fmt"0xc000193160> fmt.Printf("1.6 * 3.8 = %v\n", 1.6 * 3.8)1.6 * 3.8 = 6.0817>
可以看出,我们可以随时导入Go语言的标准包或第三方包,并使用Go语言完全相同的语法来进行类似Python这种解释执行的脚本语言式的即时编程与调试。虽然解释执行相对速度较慢,但在非特别需要大量高速计算的情况下已经足够,并且无需像Go语言那样每次修改哪怕一行代码也要重新编译执行,真正需要高效率的时候,可以在代码调试基本没问题后再拿到Go语言环境中编译即可。
使用quit()函数或exit(1)函数来退出Goxt的REPL环境,直接Ctrl-C也可以。
Gotx也可以直接运行Go语言的代码文件,这也是Gotx最常使用的方式,大多数情况下,会被直接拿来执行一个“.go”为后缀的Go语言的文件,也可以执行以“.gt”结尾的Gotx自身的代码文件,这两种文件有可能稍有不同,因为Gotx内置了一些函数,例如printfln等,也有一些微小的差异,例如简化了一些常用第三方库的导入包明,但不使用这些特性的话,大多数情况下这两种代码文件是一样的。
C:\Users\Administrator>type d:\goprjs\src\github.com\topxeq\gotx\scripts\basic.gtpackage mainimport ( "math/rand" "tk")func main() { tk.Pl("1.2 * 3.8 = %v", 1.2*3.8) printfln("random number: %v", rand.Int())}C:\Users\Administrator>gotx d:\goprjs\src\github.com\topxeq\gotx\scripts\basic.gt1.2 * 3.8 = 4.56random number: 2622618270577455181C:\Users\Administrator>
本例中执行了一个basic.gt代码文件,可以看出,这段代码与Go语言代码基本完全一致,仅有两处微小区别,一是对于第三份包github.com/topxeq/tk使用了短路径tk来进行导入,另外使用了内置函数printfln(相当于printf函数多输出了一个回车换行符),如果为了完全与Go语言兼容,可以按适当的方法写即可,例如包导入可以写作 "github.com/topxeq/tk",printfln这一句可以写作printf("random number: %v\n", rand.Int())即可,就是稍稍麻烦一些而已。
直接输入
gotx -edit
即可启动一个Gotx内置的代码编辑器进行代码编写,也可以后带文件名编辑一个已有的代码文件,例如,
gotx -edit basic.gt
效果如下所示:
gotx -example basic.gt
直接运行Gotx云端Gitee库中的例子代码.
gotx -example -view basic
可以省略最后的文件扩展名。另外,-view参数也可以用于查看其他方式读入的代码,例如从文件中的。
C:\Users\Administrator>gotx -example -view basicpackage mainimport ( "math/rand" "tk")func main() { tk.Pl("1.2 * 3.8 = %v", 1.2*3.8) printfln("random number: %v", rand.Int())}
也可以用这种方法加重定向将代码保存,例如,
gotx -example -view basic > d:\scripts\a.gt
gox -remote https://yourdomain.com/basica.gt
Gotx将从指定的网址下载该代码并执行,这种方式比较方便远程调试。
gotx -encrypt=mycode basic.gt
加密的文件将在扩展名中加上一个字母e。注意将mycode换为自己所需的加密密码,并不要忘记,否则无法取回。
gotx -decrypt=mycode basic.gte
gotx -decrun=mycode basic.gte
或远程网络的也可以
gotx -decrun=mycode -example basic.gte
Gotx中内置了第三方包Giu,可以编写一般的图形界面程序,需要系统支持OpenGL。
package mainimport ( "os" "github.com/AllenDang/giu")var text1 stringfunc onButton1Click() { // evaluate the expression in the text input t := text1 rs := eval(t) println(rs) // set the result back into the text input text1 = rs //string(rs)}// close the window, also terminate the applicationfunc onButton2Click() { os.Exit(1)}// main window loopfunc loop() { // set the layout of GUI layoutT := []giu.Widget{ giu.Label("Enter an expression."), giu.InputText("", 0, &text1), // widgets in line layout is aligned left to right giu.Line(giu.Button("Calculate", onButton1Click), giu.Button("Close", onButton2Click)), } giu.SingleWindow("Calculator", layoutT)}func main() { // text1 used to hold the string value of the text input // notice: text1 is a pointer // setup the title, size (width and height, 400*200), style and font-loading function of main window, mainWindow := giu.NewMasterWindow("Calculator", 400, 200, giu.MasterWindowFlagsNotResizable, nil) // show the window and start the message loop giu.LoopWindow(mainWindow, loop)}
执行效果:
十几行程序就实现了一个图形界面的计算器。
有些电脑环境不支持图形界面,例如租用的云端服务器,此时可以使用Gotx的命令行版本Gotxc,除了与图形界面有关的功能,其他功能都可以使用,也是非常方便的。