首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go每日一库之152:gomacro(终端运行go代码)

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

作者头像
luckpunk
发布于 2023-10-02 00:16:14
发布于 2023-10-02 00:16:14
63500
代码可运行
举报
运行总次数:0
代码可运行

[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 自带了一个这样的编程环境:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ 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 代码即可。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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 程序中:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 就可以工作了:它会自动下载、编译和导入一个包,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言实战笔记(二)| Go开发工具
在Go语言中,我们很多操作都是通过go命令进行的,比如我们要执行go文件的编译,就需要使用go build命令,除了build命令之外,还有很多常用的命令,这一次我们就统一进行介绍,对常用命令有一个了解,这样我们就可以更容易的开发我们的Go程序了。
飞雪无情
2018/08/28
7150
深度阅读之《Mastering Go》
写在前面:这本书前前后后花了挺长时间,去年 11 月份就开始读了,中间又断了,直到最近才捡起来看完。
梦醒人间
2021/04/23
7010
深度阅读之《Mastering Go》
Machine Learning With Go 第4章:回归
我们将探究的第一组机器学习技术通常被称为回归(regression),我们可以将回归理解为一个变量(例如销售额)的变化是如何影响到其他变量(如用户数)的。对于机器学习技术来说,这是一个很好的开端,它们是构成其他更加复杂技术的基础。
charlieroro
2022/06/02
1.6K0
Machine Learning With Go 第4章:回归
Go语言交叉编译工具gox
交叉编译是为了在不同平台编译出其他平台的程序,比如在Linux编译出Windows程序,在Windows能编译出Linux程序,32位系统下编译出64位程序,今天介绍的gox就是其中一款交叉编译工具。
平也
2020/04/03
1.8K0
使用 Act 本地运行 GitHub Actions
GitHub Actions 为仓库开发者提供了执行定制化 Job 的能力,开发者可以使用各种 Job 基于代码仓库运行测试、构建、发布等操作,实现 CI/CD 等工作流。
陆道峰
2024/07/02
1.5K0
使用 Act 本地运行 GitHub Actions
爬虫+反爬虫+js代码混淆
在日常开发工作业务场景中,你可能会遇到重复性的业务工作脚本功能维护。笔者分析了下,其在修改业务代码后,大致都会遇到如下问题:
李昂君
2023/03/16
4K0
爬虫+反爬虫+js代码混淆
Go 每日一库之 plot
本文介绍 Go 语言的一个非常强大、好用的绘图库——plot。plot内置了很多常用的组件,基本满足日常需求。同时,它也提供了定制化的接口,可以实现我们的个性化需求。plot主要用于将数据可视化,便于我们观察、比较。
用户7731323
2020/09/08
1.5K0
Golang开发环境搭建
Windows 系统上推荐使用这种方式。现在的操作系统基本上都是 64 位的,所以选择 64 位的 go1.15.windows-amd64.msi 下载即可,如果操作系统是 32 位的,选择 go1.15.windows-386.msi 进行下载。
PayneWu
2020/12/18
2.4K0
Golang开发环境搭建
常见编程语言对REPL支持情况小结
最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”。当然这个观点有点偏激,但我们可以探究一下,我们常用的编程语言里面,哪些支持REPL,哪些不支持,还有REPL的一些概况。 在一般的脚本语言中,有REPL是常态, 因为REPL非常的方便。 编程术语 REPL (Read-Eval-Print Loop) 中文的话有翻译成“交互式解释器”或“交互式编程环境”的。 不过我觉得不用翻译,直接REPL就好了,这样的术语,翻译成中文后,读者更难理解。下面是对 REPL 的解
Albert陈凯
2018/04/04
1.7K0
跨平台构建 Docker 镜像新姿势,x86、arm 一把梭
在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上。特别是 Docker 席卷全球之后,我们可以轻松地在 ARM 设备上通过容器部署各种好玩的应用,而不用在意各种系统的差异性。
米开朗基杨
2019/11/25
43.6K1
跨平台构建 Docker 镜像新姿势,x86、arm 一把梭
Go语言环境搭建详解
最近写了很多Go语言的原创文章,其中Go语言实战系列30篇,近15W字,还有最近更新的Go经典库系列,不过通过大家的咨询来看,还是想要一些入门的知识,这一篇文章写于2017年初,这里再更新一下,发给大家。
飞雪无情
2018/08/28
9740
golang调用python3,并使用python模块中的方法
因项目需要,很多代码和python模块是go语言没有的,虽然有个项目是转化python代码到golang代码,但是还没开始用,关键是python引用的模块如此之多,不可能都去转换对吧。
hotqin888
2022/03/10
4K0
golang调用python3,并使用python模块中的方法
Linux编译C++
1)此时脚本开始运行 2)选择python3解释编译ycm文件 此时脚本文件会问你是选择python2还是python3来编译ycm文件?我在这里选择3,在此之前请安装python3 3)开始安装插件 4)此时vimplus就安装成功了
承苏凯
2020/07/24
24.3K0
M1 Mac上更好的 Golang 使用方案
本篇文章,将分享如何在苹果 M1 Mac 设备上,来进行高效、可靠的 Golang 开发环境的安装和管理。
soulteary
2022/05/12
1.4K0
M1 Mac上更好的 Golang 使用方案
PsySH——PHP交互式控制台
[导读] 今天在Github上发现了一个挺有意思的PHP项目:PsySH。 百度了一番,发现没有任何关于它的中文文章,经过研究,决定写本篇博文来讲述一下。 如果对你有所帮助,请留下你的回复 PsySH is a runtime developer console, interactive debugger and REPL for PHP. PsySH是一个PHP的运行时开发平台,交互式调试器和Read-Eval-Print Loop (REPL)。 说的简单点,就像你用firebug的console调试
wangxl
2018/03/08
2.3K0
PsySH——PHP交互式控制台
Open Policy Agent(OPA) 入门实践
本篇我来为你介绍一个我个人很喜欢的,通用策略引擎,名叫 OPA,全称是 Open Policy Agent。
Jintao Zhang
2021/12/09
2.6K0
Open Policy Agent(OPA) 入门实践
Go 包概念及其机制详解&内置工具使用简介 【Go语言圣经笔记】
现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或模块的方式被重用。
Steve Wang
2021/12/06
1.7K0
Go 包概念及其机制详解&内置工具使用简介 【Go语言圣经笔记】
Go语言环境搭建详解(2020版)
最近写了很多Go语言的原创文章,其中Go语言实战系列30篇,近15W字,还有最近更新的Go经典库系列,不过通过大家的咨询来看,还是想要一些入门的知识,这一篇文章写于2017年初,这3年多Go更新了很多版本,所以需要更新下这篇文章。
飞雪无情
2020/11/05
6.5K0
我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
今天继续关于Go开发经验的分享,这次的主题是关于Go的交叉编译和条件编译,伴随着我对自己打不过、惹不起的壕同事小张还有运维们的碎碎念。
KevinYan
2020/09/27
2.8K0
我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译
云原生(三十) | Kubernetes篇之应用商店-Helm介绍
​应用商店-Helm一、简介二、安装1、用二进制版本安装每个Helm版本都提供了各种操作系统的二进制版本,这些版本可以手动下载和安装。 下载 需要的版本 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz) 在解压目中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm) #!/usr/bin/env bash# Copyright The Helm Authors.## Licensed under
Lansonli
2022/07/12
8180
云原生(三十) | Kubernetes篇之应用商店-Helm介绍
相关推荐
Go语言实战笔记(二)| Go开发工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档