菜单
文档breadcrumb arrow Grafana k6breadcrumb arrow 扩展breadcrumb arrow 解释breadcrumb arrow 关于 Go 到 JS 桥
开源

关于 Go 到 JS 桥

所有 k6 和 xk6 二进制文件都内嵌了一个 JavaScript 引擎,sobek,您的测试脚本运行在该引擎上。

如果您理解 Go 内部机制和 JavaScript 运行时之间的*桥*,您将加深对 k6 扩展工作原理的概念性认识。

Go 到 JavaScript 桥特性

该桥具有一些我们应该强调的特性

  • Go 方法名称在 JS 中访问时从*Pascal* 转换为*Camel* 大小写。例如,IsGreater 变为 isGreater

  • Go 字段名称从*Pascal* 转换为*Snake* 大小写。例如,结构体字段 ComparisonResult string 在 JS 中变为 comparison_result

  • 字段名称可以使用 `js` 结构体标签明确指定。例如,将字段声明为ComparisonResult string `js:"result"`或使用以下方式在 JS 中隐藏`js:"-"`.

类型转换和原生构造函数

JavaScript 运行时透明地将 Go 类型(如 int64)转换为其等效的 JS 类型。对于无法转换的复杂类型,您的脚本可能会因 TypeError 而失败,这要求您将对象显式转换为 sobek.Objectsobek.Value

Go
func (*Compare) XComparator(call sobek.ConstructorCall, rt *sobek.Runtime) *sobek.Object {
	return rt.ToValue(&Compare{}).ToObject(rt)
}

上面的代码片段还演示了 sobek 的*原生构造函数*特性,方法可以成为 JS 构造函数。具有此签名的函数可以在 JS 中使用 new compare.Comparator() 创建 Comparator 实例。虽然这对 JS 来说更符合习惯用法,但它仍然具有接收 sobek.Runtime 的好处。