关于 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.Object
或 sobek.Value
。
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
的好处。