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 也支持一些基本的控制语句,比如 iffor

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 加点“脚本魔法”的更多相关文章

  1. 不同格式图片相互转换的开源库分享(使用CxImage,并有VC6的配置过程)

    不同格式图片相互转换的开源库分享 一.背景 笔者在项目的开发中,需要调用windows下的COM接口SetIconLocation来实现桌面快捷方式.而我们项目中给定的图片格式为png格式,SetIc ...

  2. 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 & ...

  3. 【GoLang】GoLang 微服务、开源库等参考资料

    参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries ...

  4. CocoaPods的安装及使用/利用开源库Diplomat实现分享及第三方登录/git的使用

    <<史上最简洁版本>> 1.gem sources -l查看 当前的源 //1.1 sudo -i..以下都是以管理员的身份来操作的 2.gem sources --remov ...

  5. 分享6款优秀的 AR/VR 开源库

    今天,为大家推荐几款优秀的 AR/VR 开源库,希望能对大家有所帮助~ 1.AR.js AR.js 是一款应用于 Web 的高效增强现实(AR)库,基于 three.js + jsartoolkit5 ...

  6. [开源] gnet: 一个轻量级且高性能的 Golang 网络库

    Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Ev ...

  7. 使用 Golang 代码生成图表的开源库对比

    本文的目标读者 对用 Golang 代码生成折线图.扇形图等图表有兴趣的朋友. 本文摘要 主要介绍 Go 中用以绘图的开源库,分别是: GitHub - wcharczuk/go-chart: go ...

  8. Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目

    Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...

  9. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  10. 快快快!27个提升效率的iOS开源库推荐

    文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...

随机推荐

  1. Go 监控告警入门 Opentelemetry

    前言 Opentelemetry 分布式链路跟踪( Distributed Tracing )的概念最早是由 Google 提出来的,发展至今技术已经比较成熟,也是有一些协议标准可以参考.目前在 Tr ...

  2. linux中级——libcurl库访问百度

    libcurl简介: libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持H ...

  3. Ubuntu 安裝 RIME 輸入法

    RIME (Rime Input Method Engine,中州韻,中州韵)是一款很火的輸入法,虽然我目前还不知道它为什么火,不过先用用再说. 首先要吐槽一下 RIME 的说明文档,我感觉有点乱,第 ...

  4. python png 转 icon文件

    pip install pillow from PIL import Image def png_to_ico(png_path, ico_path): img = Image.open(png_pa ...

  5. 利用分布式锁在ASP.NET Core中实现防抖

    前言 在 Web 应用开发过程中,防抖(Debounce) 是确保同一操作在短时间内不会被重复触发的一种有效手段.常见的场景包括防止用户在短时间内重复提交表单,或者避免多次点击按钮导致后台服务执行多次 ...

  6. Coursera self-driving2, State Estimation and Localization Week3, GNSS IMU for pose estimation

    如何表示旋转?三种方法 1. rotation matrix 2. unit quaternions 四元数 3. Euler angles 4. compare 坐标系 ECIF - Earth-C ...

  7. 单个48TB大小SQL Server数据库备份导致日志文件无法截断

    单个48TB大小SQL Server数据库备份导致日志文件无法截断 SQL Server 版本:SQL Server 2019背景在一个48T大小的单数据库环境中,采用简单恢复模式,日志文件大小限制为 ...

  8. CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式

          近期,第十九届中国图象图形学学会青年科学家会议(简称"会议")在广州召开.会议由中国图象图形学学会(CSIG)主办,琶洲实验室.华南理工大学.中山大学.中国图象图形学学 ...

  9. STEP: 用于多变量时间序列预测的预训练增强时空图神经网络《Pre-training Enhanced Spatial-temporal Graph Neural Network for Multivariate Time Series Forecasting》(时间序列预测)

    2023年12月27日,看一篇老师给的论文. 论文:Pre-training Enhanced Spatial-temporal Graph Neural Network for Multivaria ...

  10. CSS & JS Effect – Show More

    效果 show more 是很常被使用的效果, 因为空间总是不够的丫. 比起 scroll, show more 的体验通常会好一些, 尤其在手机, 它有更好的引导. 实现思路   1. 卡片需要一个 ...