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 我热爱开源,更喜爱那些花费宝贵的业 ...
随机推荐
- 通过JUnit源码分析学习编程的奇技淫巧
打开 Maven仓库,左边选项栏排在第一的就是测试框架与工具,今天的文章,V 哥要来聊一聊程序员必备的测试框架JUnit 的源码实现,整理的学习笔记,分享给大家. 有人说,不就一个测试框架嘛,有必要去 ...
- Codeforces Round 911 (Div. 2) D
Codeforces Round 911 (Div. 2) D D. Small GCD 题意 定义\(f(a,b,c)\)为\(a,b,c\)中较小两个数的\(gcd\),给定数组\(a_{1... ...
- 零基础学习人工智能—Python—Pytorch学习(八)
前言 本文介绍卷积神经网络的上半部分. 其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多 ...
- visual studio安装MFC模板
计算机图形学 奇怪的重点 需要单击选中使用C++的桌面开发 才会跳出右侧的选项 要么就是展开右侧的收缩
- 使用 iRingo 解锁本该属于你的苹果服务
为什么别人的 Spotlight 可以通过航班号查询航班信息,而我的不行?为什么别人的 Spotlight 可以直接看英超联赛的比分信息?为什么我的 Apple News 打不开?这其实是因为这些功能 ...
- Html 使用scss爆红
使用 <style lang="less" scoped> </style> 即可
- web 3d 技术预研及数据可视化技术
web 3D 技术 白纸一张,先理一理概念: webGL 是low level 库,three.js 是high level 库,一般只要理解webGL里的概念,实际用thee.js 开发更容易 3D ...
- 消息队列初见:一起聊聊引入系统mq 之后的问题
消息队列前文目录 消息队列初见:一起聊聊引入系统mq 之后的问题 https://www.cnblogs.com/yizhiamumu/p/16573472.html 分布式事务实战方案汇总 http ...
- JS常见的API扩展形式(prototype、jquery、vue插件封装)以及怎样设计出易扩展的表单验证功能?
常见的API扩展形式 prototype 比如我现在有一个需求,给定一个字符串,给方法传递一个参数为数字类型来确定当前字符串重复次数,例如: 'abc'.repeatStringNumTimes(3) ...
- 前端基本功——面试必问系列(1):都2024了,还没吃透Promise?一文搞懂
写在前面: 大家好,我是山里看瓜,该系列文章是为了帮助大家不管面试还是开发对前端的一些基本但是很重要的知识点认识更加深入和全面. 想写这个系列文章的初衷是:我发现前端的很多基本知识,使用起来很简单,定 ...