Golang中WASM如何处理JavaScript的`||`逻辑运算符
Golang中WASM如何处理JavaScript的||逻辑运算符
请先回答以下问题再提交问题,谢谢!
你使用的 Go 版本是什么(go version)?
golang/go 主分支构建版本
go version devel +0c9be48a90 Wed Jun 20 04:38:48 2018 +0000 darwin/amd64
你做了什么?
我想知道如何在 Golang WASM 中实现 JavaScript 的逻辑运算符,例如 100 || 0 会返回 100,
我是否需要根据文档自己实现 or 函数来完成上述逻辑运算符操作:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators?
func or(i ...js.Value) {
...
}
谢谢!
更多关于Golang中WASM如何处理JavaScript的`||`逻辑运算符的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Go编程语言已经包含了OR运算符。以下是您可以参考的运算符快速列表:https://www.tutorialspoint.com/go/go_operators.htm
我担心您对这门语言的基础知识完全不熟悉,建议您通过学习Go指南来补充知识:https://tour.golang.org/welcome/1
更多关于Golang中WASM如何处理JavaScript的`||`逻辑运算符的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
很抱歉,我从您最初的帖子中没有理解到这一点,但感谢您的澄清。据我了解,使用 Go 编写 WebAssembly 时,您只需编写有效的 Go 代码,然后将其编译为 WebAssembly。
请查看这篇文章中关于生成 Wasm 的部分:https://blog.gopheracademy.com/advent-2017/go-wasm/
我知道 Go 语言支持逻辑运算符
很抱歉没有详细描述我的问题
我的意思是,在使用 Go 主分支的最新代码编译后,难道当时还不支持 wasm 吗?
那么,我的问题是如何在此时实现 JavaScript 的 || 逻辑运算。这个运算现在是否已支持?我尝试使用 js.New 或 js.Get 配合一些代码,但都失败了。
我需要自己实现一个 JavaScript 函数吗?
根据文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators,JavaScript 和 Go 语言的逻辑运算仍然存在差异。
在 Go WebAssembly (WASM) 中处理 JavaScript 的逻辑运算符时,由于 Go 和 JavaScript 的类型系统差异,确实需要自己实现相应的逻辑函数。JavaScript 的 || 运算符会返回第一个真值(truthy value),而 Go 的 || 运算符返回的是布尔值。
以下是一个实现 JavaScript 风格 || 逻辑运算符的示例:
package main
import (
"syscall/js"
)
// or 函数模拟 JavaScript 的 || 运算符
// 返回第一个真值(truthy value),如果没有真值则返回最后一个值
func or(this js.Value, args []js.Value) interface{} {
for _, arg := range args {
if isTruthy(arg) {
return arg
}
}
// 如果没有真值,返回最后一个参数
if len(args) > 0 {
return args[len(args)-1]
}
return js.ValueOf(nil)
}
// isTruthy 判断一个 js.Value 是否为真值
func isTruthy(v js.Value) bool {
// 处理不同的 JavaScript 类型
switch v.Type() {
case js.TypeUndefined, js.TypeNull:
return false
case js.TypeBoolean:
return v.Bool()
case js.TypeNumber:
return v.Float() != 0 && !v.IsNaN()
case js.TypeString:
return v.String() != ""
case js.TypeObject, js.TypeFunction, js.TypeSymbol:
return true
default:
return true
}
}
func main() {
// 将 or 函数暴露给 JavaScript
js.Global().Set("goOr", js.FuncOf(or))
// 保持程序运行
<-make(chan bool)
}
使用示例:
在 JavaScript 中调用这个函数:
// 模拟 JavaScript 的 100 || 0
console.log(goOr(100, 0)); // 输出: 100
// 模拟 JavaScript 的 0 || "hello"
console.log(goOr(0, "hello")); // 输出: "hello"
// 模拟 JavaScript 的 null || "default"
console.log(goOr(null, "default")); // 输出: "default"
// 模拟 JavaScript 的 false || true
console.log(goOr(false, true)); // 输出: true
对于 && 运算符的实现:
// and 函数模拟 JavaScript 的 && 运算符
func and(this js.Value, args []js.Value) interface{} {
for _, arg := range args {
if !isTruthy(arg) {
return arg
}
}
// 如果所有值都是真值,返回最后一个参数
if len(args) > 0 {
return args[len(args)-1]
}
return js.ValueOf(true)
}
对应的 JavaScript 调用:
// 模拟 JavaScript 的 100 && 0
console.log(goAnd(100, 0)); // 输出: 0
// 模拟 JavaScript 的 100 && 200
console.log(goAnd(100, 200)); // 输出: 200
这种实现方式确保了在 Go WASM 中能够正确处理 JavaScript 风格的逻辑运算符语义。

