首页 > 其他分享 >Go每日一库之152:gomacro(终端运行go代码)

Go每日一库之152:gomacro(终端运行go代码)

时间:2023-10-01 09:01:23浏览次数:40  
标签:gomacro 152 ... 一库 fmt go REPL Go

[gomacro](https://github.com/cosmos72/gomacro) 是一个近乎完整的 Go 解释器,用纯 Go 实现,它同时提供交互式 REPL 和脚本模式,并且在运行时不需要 Go 工具链(除了一些非常特殊的场景:在运行时导入第三方包)。它在 Go 标准库之外有两个依赖项:github.com/peterh/linergolang.org/x/tools/go/packages

REPLRead-Eval-Print Loop 的缩写,是一种简单的,交互式的编程环境,其中 REPL 分别指:

  • Read:获得用户输入
  • Eval:对输入求值
  • Print:打印、输出求值的结果
  • Loop:循环,可以不断地重复 Read-Eval-Print

REPL 对于学习一门新的编程语言非常有帮助,你可以在这个交互环境里面通过输出快速验证你的理解是不是正确。比如我们最常使用的 Python 自带了一个这样的编程环境:

➜  ~ python3
Python 3.8.9 (default, Mar 30 2022, 13:51:16)
[Clang 13.1.6 (clang-1316.0.21.2.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 1
>>> a + 2
3
>>> print(a - 2)
-1
>>>

功能

Gomacro 就是这样一个针对 Go 语言的一个 REPL 工具,它可以被用来:

  • 一个独立的可执行文件,具有交互式 Go REPL、行编辑和代码补全功能:只需在命令行中运行 gomacro,然后输入 Go 代码即可。
$ gomacro
[greeting message...]

gomacro> import "fmt"
gomacro> fmt.Println("hello, world!")
hello, world!
14      // int
<nil>   // error
gomacro>
  • 只需要按下 TAB 键就可以自动提示,再按 TAB 键可以循环完成可能的内容。行编辑主要遵循 Emacs。Ctrl+AHome 跳到行首,Ctrl+EEnd 跳到行尾,Ald+D 删除从光标开始的单词......
  • 一个试验的 Go 泛型工具
  • Go 源码 debug 工具
  • 一个交互式工具,如果你使用已编译的 Go 与科学库(物理学、生物信息学、统计学......),你可以从 gomacro REPL 导入相同的库(在 Linux 和 Mac OS X 上立即生效,在其他平台上需要重新启动),交互式地调用它们,检查结果,将它们反馈给其他函数/库,所有这些都在一个会话中完成。导入的库将被编译,而不是解释,所以它们将和编译后的 Go 一样快。
  • 只需几行代码即可将 Eval() 和脚本功能添加到你的 Go 程序中:
package main
 import (
     "fmt"
     "reflect"
     "github.com/cosmos72/gomacro/fast"
 )
 func RunGomacro(toeval string) reflect.Value {
     interp := fast.New()
     vals, _ := interp.Eval(toeval)
     // for simplicity, only use the first returned value
     return vals[0].ReflectValue()
 }
 func main() {
     fmt.Println(RunGomacro("1+1"))
 }
  • 一种在没有 Go 编译器的情况下即时执行 Go 源代码的方法:你可以运行 gomacro FILENAME.go。或者你可以在 Go 源文件的开头插入一行 #!/usr/bin/env gomacro,然后使用 chmod +x FILENAME.go 将该文件标记为可执行文件,最后使用 ./FILENAME.go 即可执行它(仅适用于在类 Unix 系统上:Linux、*BSD、Mac OS X ...)
  • Go 代码生成工具:gomacro 最初是作为向 Go 添加类似 Lisp 的宏的实验开始的,它们对于简化代码生成非常有用。宏是普通的 Go 函数,其特殊之处仅在于一个方面:在编译代码之前执行,其输入输出为代码

安装

需要 Go 1.13+ 版本,Gomacro 是纯 Go,理论上它应该可以在 Go 编译器支持的任何平台上运行。以下组合经过测试并已知有效:

  • Linux: amd64,386, arm64, arm, mips, ppc64le
  • Mac OS X: amd64,386 (386 binaries running on amd64 system)
  • Windows: amd64,386
  • FreeBSD: amd64,386
  • Android: arm64, arm

执行下面的命令即可安装:

go get -u github.com/cosmos72/gomacro

使用

如果你在 Linux 或 Mac OS X 上运行 gomacro,那么 import 就可以工作了:它会自动下载、编译和导入一个包,如下所示:

$ gomacro
[greeting message...]

gomacro> import ( "gonum.org/v1/floats"; "gonum.org/v1/plot" )
// debug: running "go get gonum.org/v1/gonum/floats gonum.org/v1/plot" ...
go: downloading gonum.org/v1/plot v0.11.0
[... more messages from go toolchain ...]
// debug: running "go mod tidy" ...
go: downloading github.com/go-fonts/latin-modern v0.2.0
go: downloading rsc.io/pdf v0.1.1
go: downloading github.com/go-fonts/dejavu v0.1.0
// debug: compiling plugin "/home/max/go/src/gomacro.imports/gomacro_pid_187824/import_1" ...
gomacro> plot.New()
&{...} // *gonum.org/v1/plot.Plot

注意:在内部,gomacro 将编译和加载一个 Go 插件,其中包含 import ( ... ) 中列出的所有包的导出声明。

命令 go mod tidy 在编译插件之前会自动执行,它会尝试解决由于直接导入或间接导入同一包的不同版本而导致的任何版本冲突(即作为必需的依赖项)。

Go 插件目前仅在 Linux 和 Mac OS X 上受支持。

从 2.6 版开始,gomacro 还集成了调试器。输入方式有以下三种:

  • 在解释代码运行时按 CTRL+C
  • 在提示符下输入 : debug STATEMENT-OR-FUNCTION-CALL
  • 在代码中添加语句(表达式不够)"break"_ ="break",然后正常执行

在所有情况下,执行都将暂停,你将收到一个 debug> 提示符,该提示符接受以下命令:stepnextfinishcontinueenv [NAME]inspect EXPRlistprint EXPR-OR-STATEMENT

总体上的体验就是一个支持基本功能的 REPL,支持 Tab 自动补全(例如输入 fmt.Print 按 Tab 会在 fmt.Printfmt.Printffmt.Println 之前切换)、调试和简单的查看函数签名。gomacro 对于基本的快速验证代码运行结果是够的。

Git 仓库:https://github.com/cosmos72/gomacro

标签:gomacro,152,...,一库,fmt,go,REPL,Go
From: https://www.cnblogs.com/arena/p/17738568.html

相关文章

  • Go每日一库之151:aurora(终端输出上色)
    背景介绍今天跟大家推荐一款可以给终端输出上色的工具--aurora。极速上手准备工作初始化项目gomodinitaurora演示项目结构.├──go.mod├──go.sum└──main.go安装aurora包goget-ugithub.com/logrusorgru/aurora代码演示首先引入aurora库import.......
  • Go每日一库之149:PDF处理相关库
    PDF处理场景:pdf渲染pdf校验pdf加水印pdf获取页数pdf合并pdf拆分修复受损pdfpdf转png识别pdf中的字体pdf解密...一、HTML页面渲染PDF根据html页面渲染pdf,我使用过以下两种方案:wkhtmltopdfchromedp1.使用wkhtmltopdf渲染pdfwkhtmltopdf是一个命令行工具,用......
  • Go每日一库之148:base64Captcha(多种形式验证码)
    Base64captcha几行代码就可以定义自己内容的图形验证码库,支持任意unicode字符的内容.1.文档&DemoEnglish中文文档Playground2.快速上手2.1下载base64Captcha包goget-ugithub.com/mojocn/base64Captcha2.2在您的项目中使用base64Captcha2.2.1实现Store......
  • Go每日一库之147:goldmark(Markdown转html)
    简介使用Markdown书写结构化的文档和评论已经相当流行了,Web服务需要将用户编写的Markdown文本转换为html以便浏览器渲染,还常常需要对Markdown语法进行自定义扩展以实现个性化的功能。本期要介绍的**goldmark**就是Go生态中的一款Markdown解析器和扩展器,与GitHub......
  • Go每日一库之169:dongle(编解码、加解密)
    一个轻量级、语义化、对开发者友好的golang编码解码、加密解密库。安装使用//使用github库goget-ugithub.com/golang-module/dongleimport("github.com/golang-module/dongle")//使用gitee库goget-ugitee.com/golang-module/dongleimport("g......
  • Go每日一库之168:redsync(redis分布式锁)
    今天给大家推荐的是基于redis的Go版本的分布式锁工具:redsync。该工具也是redis官网上推荐的。redsync基于redis的高可用、高性能、防死锁、防误删的分布式锁实现,具有高性能、高可用、防死锁、防误删的特点。一、分布式锁基础知识什么是分布式锁锁,在编程语言中就是一个变量,该变......
  • Go每日一库之167:emoji(emoji表情)
    大家在使用微信或钉钉聊天时,一定使用过表情符号。今天就给大家介绍一个能够在终端上显示emoji表情符号的包:emoji。实现原理:emoji表情符号实际上就是在unicode编码表中有定义的一个编码。通过将符号的文字表示和对应的unicode编码进行一一对应,在使用时对文字符号进行替换成rune字......
  • Go每日一库之187:singleflight(合并重复调用)
    本文主要介绍Go语言中的singleflight包,包括什么是singleflight以及如何使用singleflight合并请求解决缓存击穿问题。singleflight目前(Go1.20)还属于Go的准标准库,它提供了重复函数调用抑制机制,使用它可以避免同时进行相同的函数调用。第一个调用未完成时后续的重复调用会等待,当第......
  • Go每日一库之186:sonic(高性能JSON库)
    介绍我们在日常开发中,常常会对JSON进行序列化和反序列化。Golang提供了encoding/json包对JSON进行Marshal/Unmarshal操作。但是在大规模数据场景下,该包的性能和开销确实会有点不够看。在生产环境下,JSON序列化和反序列化会被频繁的使用到。在测试中,CPU使用率接近10%,其中极端情况......
  • Go每日一库之184:katana(新一代爬虫框架)
    项目链接https://github.com/projectdiscovery/katana项目简介katana是一个使用golang编写的新一代爬虫框架,支持HTTP和headless抓取网页信息不仅可以作为库集成到Golang项目,还可以通过命令行直接抓取,对于有一些轻量级的抓取任务的开发者配合jq一起使用简直就是福......