有没有将go语言编译成javascript代码实现go开发前端?
网友回复
GopherJS是一个将GO编绎成JavaScript的开源项目, Github开源地址:https://github.com/gopherjs/gopherjs
GopherJS将GO代码编绎成纯的JavaScript代码。它的主要目的是让你有机会使用GO语言来写前端代码。你可以在线玩一玩。 你可以使用GO优雅的类型系统和编绎时检查系统,因此你有机会发现大量的潜在BUG,并可以更好的进行重构。想像一下你之前要处理多少有关JavaScript遗留的参数问题,因为你不确定会不会还有人在用这些老API。GopherJS会豪无怨言地帮你解决这些问题。你可以放心,这种BUG将不会再出现。 Goroutines 注* Goroutines是Go语言中一种轻量级的并发实现机制;可以理解为轻量级的多线程机制,不同的是Goroutines运行时还可以访问当前上下文。JavaScript没有并发的概念(除了web workers,但是与Goroutines不同,他们被隔离地太彻底了)。所以,JavaScript中的代码永远不会被阻塞。一个阻塞的调用将会让你的网页停止响应。所以我们使用了一个带参回调来代替。
GopherJS对于这种限制做了大量的工作: 当一个指令被阻塞(比如通信中的一个通道 channel没有好),整个栈就不会被执行(等待所有的函数都被调用过以后),其它goroutine会暂时休息。然后另外一个准备执行的goroutine会恢复运行(与本地变量一起恢复)。这种机制通过一个闭包来实现。 这种机制生成的代码性能非常好,但是还是没有非阻塞系统(基于原生JS回调)的好。这是GopherJS努力去克服的一面。 但是它也有一个优点,外部JavaScript从来不会被阻塞执行,但你可以使用go语法在JS中达到阻塞的效果。
这是一个Go编绎到JavaScript的示例
package main import ( "fmt" "github.com/gopherjs/gopherjs/js" ) func main() { fmt.Println("Hello, playground") js.Global.Call("alert", "Hello, JavaScript") println("Hello, JS console") }
编译后的javascript代码
$packages["main"] = (function() { var $pkg = {}, fmt = $packages["fmt"], js = $packages["github.com/gopherjs/gopherjs/js"], main; main = function() { fmt.Println(new ($sliceType($emptyInterface))([new $String("Hello, playground")])); $global.alert($externalize("Hello, JavaScript", $String)); console.log("Hello, JS console"); }; $pkg.$run = function($b) { $packages["github.com/gopherjs/gopherjs/js"].$init(); $packages["runtime"].$init(); $packages["errors"].$init(); $packages["sync/atomic"].$init(); $packages["sync"].$init(); $packages["io"].$init(); $packages["math"].$init(); $packages["unicode"].$init(); $packages["unicode/utf8"].$init(); $packages["bytes"].$init(); $packages["syscall"].$init(); $packages["strings"].$init(); $packages["time"].$init(); $packages["os"].$init(); $packages["strconv"].$init(); $packages["reflect"].$init(); $packages["fmt"].$init(); $pkg.$init(); main(); }; $pkg.$init = function() { }; return $pkg; })();
sms-activate中的虚拟手机号为啥无法用作google的手机号码验证?
app如何判断自己的网络连接是经过代理传输的?
有没有开源的andriod安卓设备集中管理工具?
acejs如何监听回车并获取上一行文本是否是注释?
SSL证书中OV和DV有啥区别,该如何选择?
python如何批量压缩目录及子目录图片到指定大小内?
google账号如何更改地区与国家?
为啥我的安卓手机chatgpt app打开报错Something went wrong. You may be connected to a disallowed ISP. If you are us
c#如何修改windows的代理设置?
国内华为andriod安卓苹果ios手机如何使用chatgpt4o的app?