Golang 开源库分享:anko - 给 Go 加点“脚本魔法”
GitHub 仓库链接:https://github.com/mattn/anko
1. anko 是干嘛用的?
anko 是一个可以让 Go 项目支持脚本语言的小工具。换句话说,就是我们可以给 Go 项目加点“脚本魔法”,在程序跑起来之后还能动态地改代码逻辑。比如,你在写一个应用,想让用户可以随时调整设置或控制程序的某些行为,而不需要每次都去改代码重新编译,这时候就可以用 anko。
2. 为什么会用到 anko?
有时候我们的项目需要灵活一点。比如:
- 做一个游戏,想让用户自己定义规则。
- 写一个自动化脚本,想让用户随时调整参数。
- 做后台管理工具,管理员可以直接在网页上写脚本来控制一些业务流程。
如果这些逻辑写在代码里,就得不停地改代码重启服务。而用 anko 就可以把这些逻辑写成脚本,用户想怎么改就怎么改,还不用重启,轻松方便。
3. 如何开始使用 anko?
anko 安装起来也很简单,只需要几行代码就能用上。首先安装:
go get github.com/mattn/anko
然后我们在代码里引入:
import "github.com/mattn/anko/vm"
4. 让 anko 跑起来
假设我们有一段小脚本,想动态地执行它。下面是一个简单的例子:
package main
import (
"fmt"
"github.com/mattn/anko/vm"
)
func main() {
env := vm.NewEnv() // 创建一个新的脚本环境
// 写一段小脚本代码
script := `
x = 5
y = 10
z = x + y
z
`
// 执行脚本
result, err := env.Execute(script)
if err != nil {
fmt.Println("出错了:", err)
} else {
fmt.Println("脚本运行结果:", result) // 输出:15
}
}
5. 用 Go 变量控制脚本
如果想在脚本里使用 Go 程序的变量,可以用 Define 方法定义变量,然后在脚本里直接用。例如:
env := vm.NewEnv()
env.Define("name", "Anko") // 在脚本里定义 name 变量
script := `
"Hello, " + name + "!"
`
result, err := env.Execute(script)
fmt.Println(result) // 输出 "Hello, Anko!"
6. 让脚本调用 Go 函数
不仅可以传变量,还可以把 Go 的函数给脚本用。举个例子,假如我们有个打招呼的函数 greet:
package main
import (
"fmt"
"github.com/mattn/anko/vm"
)
func greet(name string) string {
return "Hello, " + name
}
func main() {
env := vm.NewEnv()
env.Define("greet", greet) // 把 greet 函数传给脚本
script := `
greet("Anko")
`
result, err := env.Execute(script)
fmt.Println(result) // 输出 "Hello, Anko"
}
7. 用 anko 实现简单的逻辑
anko 也支持一些基本的控制语句,比如 if 和 for:
script := `
sum = 0
for i = 1; i <= 5; i++ {
sum += i
}
sum
`
result, _ := env.Execute(script)
fmt.Println("Sum is:", result) // 输出 15
8. anko 的优缺点
优点
- 灵活:可以在不重启程序的情况下改代码逻辑,非常适合需要频繁调整规则或逻辑的场景。
- 易于集成:可以直接把 Go 的函数和变量传递给脚本,让脚本和 Go 程序无缝结合。
- 语法简单:大多数人可以快速上手,用 Go 写代码的同学用这个库没啥学习成本。
缺点
- 性能限制:解释器相对慢一些,不适合执行复杂、频繁的计算任务。
- 功能不如高级脚本语言:没有像 JavaScript 或 Python 那么强大的功能,主要适合轻量级的动态任务。
9. anko 适合哪些场景?
- 动态配置:比如管理系统里定义一些规则,不用每次都改代码。
- 业务规则引擎:很多应用需要灵活配置规则,
anko是一个轻量级的选择。 - 自动化脚本:运行一些自动化任务,允许用户在界面里直接编写脚本控制任务。
总结
anko 是一个让 Go 支持脚本的好工具。它的轻量、灵活和简单特性,让我们可以在 Go 应用里嵌入脚本语言,用户可以自由定义一些规则或逻辑,非常适合后台管理、自动化任务、游戏规则等应用场景。

Golang 开源库分享:anko - 给 Go 加点“脚本魔法”的更多相关文章
- 不同格式图片相互转换的开源库分享(使用CxImage,并有VC6的配置过程)
不同格式图片相互转换的开源库分享 一.背景 笔者在项目的开发中,需要调用windows下的COM接口SetIconLocation来实现桌面快捷方式.而我们项目中给定的图片格式为png格式,SetIc ...
- C和FORTRAN的快速傅里叶/余弦/正弦变换(Fast Fourier/Cosine/Sine Transform)开源库分享
Takuya Ooura: General Purpose FFT Package, http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html. Free C & ...
- 【GoLang】GoLang 微服务、开源库等参考资料
参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries ...
- CocoaPods的安装及使用/利用开源库Diplomat实现分享及第三方登录/git的使用
<<史上最简洁版本>> 1.gem sources -l查看 当前的源 //1.1 sudo -i..以下都是以管理员的身份来操作的 2.gem sources --remov ...
- 分享6款优秀的 AR/VR 开源库
今天,为大家推荐几款优秀的 AR/VR 开源库,希望能对大家有所帮助~ 1.AR.js AR.js 是一款应用于 Web 的高效增强现实(AR)库,基于 three.js + jsartoolkit5 ...
- [开源] gnet: 一个轻量级且高性能的 Golang 网络库
Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Ev ...
- 使用 Golang 代码生成图表的开源库对比
本文的目标读者 对用 Golang 代码生成折线图.扇形图等图表有兴趣的朋友. 本文摘要 主要介绍 Go 中用以绘图的开源库,分别是: GitHub - wcharczuk/go-chart: go ...
- Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目
Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...
- 各种Android UI开源框架 开源库
各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...
- 快快快!27个提升效率的iOS开源库推荐
文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...
随机推荐
- 如何快速在 Apache DolphinScheduler 新扩展一个任务插件?
作者 | 代立冬 编辑 | Debra Chen Apache DolphinScheduler 是现代数据工作流编排平台,具有非常强大的可视化能力,DolphinScheduler 致力于使数据工程 ...
- 卷积神经网络CNN实战:MINST手写数字识别——数据集下载与网络训练
数据集下载 这一部分比较简单,就不过多赘述了,把代码粘贴到自己的项目文件里,运行一下就可以下载了. from torchvision import datasets, transforms # 定义数 ...
- 全网最适合入门的面向对象编程教程:41 Python 常用复合数据类型-队列(FIFO、LIFO、优先级队列、双端队列和环形队列)
全网最适合入门的面向对象编程教程:41 Python 常用复合数据类型-队列(FIFO.LIFO.优先级队列.双端队列和环形队列) 摘要: 在 Python 中,队列(Queue)是一种常用的数据结构 ...
- sipp模拟uas发送update
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 但是fs在处理update消息时候有BUG,为了复现问题,使用sipp模拟uas,发送update并发送DTMF码. 本文档记录si ...
- Vue3 比 Vue2 快的体现-第一部分
Vue3 比 Vue2 快的原因 首先体现在 Diff算法的优化上, Vue2 中的 虚拟DOM对比采用全量对比策略,这样的话每次渲染也就把静态dom节点做对比了.在Vue3 中 Diff算法 优化了 ...
- CSS – Grid
前言 有一种布局方式叫 Layout Grid 网格布局. 在 Figma – Layout Grid 有介绍过. 在 RWD 概念篇 也有讲到过 要实现这种布局, 可以用 Flex 也可以用 Gri ...
- Java Web 拾遗
许是年纪大了,老是回忆起以前的点点滴滴.翻看当初的代码,如同偶遇多年未见的前女友,曾经一起深入交流的情谊在颔首之间消散,令人烦躁. 今天就来聊聊老生常谈的 Java Web 开发.缘于一个简单的Spr ...
- keycloak~关于授权码认证中的scope的实践
前言 在 Keycloak 14.0.0 中,使用 protocol/openid-connect/auth 接口获取授权码时,scope 参数是可选的,但它确实有作用.下面是关于 scope 参数的 ...
- 【VMware VCF】使用 SFTP 服务器备份 VCF 核心组件的配置文件。
可以定期对 VMware Cloud Foundation 环境中的相关核心组件(如 SDDC Manager.NSX Manager 以及 vCenter Server 等)创建配置备份,以防止当意 ...
- 大模型应用开发初探 : 基于Coze创建Agent
大家好,我是Edison. 最近学习了一门课程<AI Agent入门实战>,了解了如何在Coze平台上创建AI Agent,发现它对我们个人(C端用户)而言十分有用,分享给你一下. Coz ...