首页 > 其他分享 >Golang 开源库分享:anko - 给 Go 加点“脚本魔法”

Golang 开源库分享:anko - 给 Go 加点“脚本魔法”

时间:2024-11-01 11:41:50浏览次数:1  
标签:脚本 script 代码 anko Golang env 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 也支持一些基本的控制语句,比如 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 应用里嵌入脚本语言,用户可以自由定义一些规则或逻辑,非常适合后台管理、自动化任务、游戏规则等应用场景。

标签:脚本,script,代码,anko,Golang,env,Go
From: https://www.cnblogs.com/pingyeaa/p/18519865

相关文章

  • Go接口是什么
    Go接口是Go语言提供的一种抽象类型,它定义了一组方法,但是没有实现。而这些方法可以由任何满足接口定义的其他类型来实现。无论你是在编写库,还是构建大型的系统,理解和利用好Go接口都将极大地提升你的代码质量和编程效率。一、Go接口的定义和特征在Go语言中,接口是一种类型,它定义......
  • (开题报告)django+vue高校OA系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校OA系统的研究,现有研究主要集中在传统开发技术或单一功能模块的优化上。在国内外,虽然OA系统已广泛应用于企业等领域,但专门针对......
  • (开题报告)django+vuejavaweb学生宿舍管理系统论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于学生宿舍管理系统的研究,现有研究多集中于传统管理模式或单一功能模块的实现。在国内外,传统的学生宿舍管理方式主要依赖人工操作,效......
  • Goby 漏洞发布|Apache Solr /solr/admin/info/properties:/admin/info/key 权限绕过漏
    漏洞名称:ApacheSolr/solr/admin/info/properties:/admin/info/key权限绕过漏洞(CVE-2024-45216)EnglishName:ApacheSolr/solr/admin/info/properties:/admin/info/keyPermissionBypassVulnerability(CVE-2024-45216)CVSScore:7.3漏洞描述:ApacheSolr是一个开源搜索服......
  • ETLCloud遇上MongoDB:灵活数据流,轻松管理
    在当今数字化转型的大潮中,企业面临着数据管理的多重挑战。数据种类繁多、格式各异,传统关系型数据库往往难以满足这些复杂的需求。为了提升数据管理的灵活性与效率,越来越多的企业开始选择NoSQL数据库。而在众多NoSQL数据库中,MongoDB凭借其灵活的数据模型和强大的扩展性成为了佼佼者......
  • Flutter go_router库push导航后,浏览器地址栏的地址不更新的问题
    如果你使用.push()方法进行导航后,浏览器的地址栏的地址并没有更新,那是因为go_router经过了一次变更修改行为导致的。配置下边的GoRouter.optionURLReflectsImperativeAPIs=true;代码就行了。也可以去optionURLReflectsImperativeAPIs看属性说明。原文......
  • Django设置跨域请求解决方案
    Django设置跨域请求解决方案在现代Web开发中,跨域资源共享(CORS,Cross-OriginResourceSharing)是一个常见的需求。尤其是在前后端分离的开发模式下,Django作为后端框架,常常需要处理来自不同源的请求。本文将详细介绍如何在Django中设置跨域请求的解决方案,帮助开发者有效管理跨域请求......
  • 如何在 Go 中解析 yaml 文件
    Go语言没有内置解析yaml文件的功能,实现yaml的解析可以使用第三方库gopkg.in/yaml.v2和gopkg.in/yaml.v3。下面以解析config.yml文件为例,演示解析代码的过程。使用gogetgopkg.in/yaml.v3添加引用。在config目录下,新增文件config.yml文件,内容如下:mongodb:......
  • 计算机毕业设计-django仓库库存管理系统
    网站介绍:✌本网站专注专注于计算机技术领域的毕业设计辅导,提供JAVA、微信小程序、Python、APP、PHP、微服务、NET等毕设项目的定制和成品服务!✌一、项目介绍《django仓库库存管理系统》该项目含有源码、文档等资料、配套开发软件、软件安装教程、项目发布教程等。软件开发......
  • MongoDB关联另一个集合
    MongoDB本身并不支持传统关系数据库中的外键(foreignkey)概念,因为它是一个文档数据库,数据通常是以JSON格式存储的文档,并且不强制要求文档之间的关系。然而,你可以通过以下几种方式在MongoDB中实现类似外键的功能:1.引用(References)你可以在一个文档中存储另一个文档的ID,从而......