博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用go编写webassembly
阅读量:4250 次
发布时间:2019-05-26

本文共 1864 字,大约阅读时间需要 6 分钟。

使用go编写webassembly

 

webassembly是什么?

WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable target for compilation of high-level languages like C/C++/Rust, enabling deployment on the web for client and server applications.

是可以支持在web浏览器或者v8等环境下的二进制格式,想具体了解可以查看

本文只介绍如何使用golang生成wasm文件,并在浏览器上执行。

开始

需要先升级go到1.11版本

编写需要编译成wasm文件的go文件

// main.gopackage mainfunc main() {	println("Hello, WebAssembly!")}

执行build命令

GOARCH=wasm GOOS=js go build -o test.wasm main.go

注意这个是在mac或者linux操作系统下执行的命令,在windows下应该设置环境变量再执行编译命令

$env:GOARCH="wasm";$env:GOOS="js";go build -o test.wasm main.go

命令执行完后,后生成test.wasm文件,这个就是可以在浏览器上运行的二进制文件

添加其他依赖

复制$(go env GOROOT)/misc/wasm/下的wasm_exec.htmlwasm_exec.js两个文件到当前目录

搭建web服务器

// test.gopackage mainimport (	"flag"	"log"	"net/http"	"strings")var (	listen = flag.String("listen", ":8080", "listen address")	dir    = flag.String("dir", ".", "directory to serve"))func main() {	flag.Parse()	log.Printf("listening on %q...", *listen)	log.Fatal(http.ListenAndServe(*listen, http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {		if strings.HasSuffix(req.URL.Path, ".wasm") {			resp.Header().Set("content-type", "application/wasm")		}		http.FileServer(http.Dir(*dir)).ServeHTTP(resp, req)	})))}

运行web服务

go run test.go

测试

在浏览器中打开http://localhost:8080/wasm_exec.html,点击页面中的run按钮,即可看到控制台打印Hello, WebAssembly!

这样我们就已经可以使用go编写一个可以运行在浏览器的程序了

如何使用js

使用go的js库syscall/js

// main.gopackage mainimport "syscall/js"func sum(args []js.Value) {	var sum int	for _, val := range args {		sum += val.Int()	}	println(sum)}func registerCallbacks() {	js.Global().Set("sum", js.NewCallback(sum))}func main() {	c := make(chan struct{}, 0)	println("Hello, WebAssembly!")	registerCallbacks()	<-c}

重新编译后,刷新页面,点击run按钮,就会为window对象挂载一个sum函数,在控制台可以调用

 

操作dom

在go中可以获取window对象来达到操作dom的效果,做一个计算器

转载地址:http://ojkei.baihongyu.com/

你可能感兴趣的文章
Python笔记:访问或修改 Pandas Series 中的元素以及相关运算
查看>>
Python笔记:Pandas DataFrames 的使用
查看>>
Python笔记:在Pandas中处理NaN值
查看>>
Python笔记:初识Matplotlib和Seaborn
查看>>
Typescript 中的接口的实现
查看>>
Typescript中的泛型的使用
查看>>
JavaScript中使用offset时遇到的bug
查看>>
java基础入门(一)
查看>>
Java基础入门(二)
查看>>
Java基础入门(三)
查看>>
Java基础入门(四)
查看>>
Java基础入门(十)
查看>>
Java基础入门(完结篇)
查看>>
Java进阶之面向对象(一)——继承
查看>>
Java进阶之自定义ArrayList&斗地主发牌案例
查看>>
JavaWeb之filter&listener&文件上传
查看>>
JavaWeb之Ajax&json
查看>>
BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用
查看>>
转载:在 Windows 10 下遇到移动硬盘不自动分配盘符的问题
查看>>
DDR2 SSTL_18标准
查看>>