前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023年9月13日 Go生态洞察:WASI支持在Go中的实现

2023年9月13日 Go生态洞察:WASI支持在Go中的实现

作者头像
猫头虎
发布2024-04-08 15:22:21
1250
发布2024-04-08 15:22:21
举报

2023年9月13日 Go生态洞察:WASI支持在Go中的实现 🌐

摘要

🐯 猫头虎博主在此,带大家一起探索Go语言的新天地!在本篇博客中,我们将深入研究Go 1.21版本如何通过WASI syscall API为WebAssembly提供支持。准备好,一起在Go的世界中冲浪吧!不要忘记,搜索“Go WASI”可以发现更多精彩内容!

引言

自从Go 1.11引入对WebAssembly的支持以来,Go语言与Wasm的结合愈发紧密。如今,Go 1.21版在这一领域又迈出了新步伐,引入了针对WASI preview 1 syscall API的新端口wasip1。让我们一探究竟,看看Go如何利用WASI,进一步扩展其WebAssembly的能力。

正文

🚀 WebAssembly简介

WebAssembly(Wasm)最初为Web设计,是一种二进制指令格式,能够让开发者在浏览器中以接近原生速度运行高性能、低层次的代码。Go在1.11版本首次加入了对Wasm的编译支持,通过js/wasm端口实现。

🛠️ WebAssembly System Interface(WASI)

WASI为Wasm可执行文件定义了一个syscall API,允许它们与文件系统、系统时钟、随机数据工具等系统资源进行交互。WASI的最新版本被称为wasi_snapshot_preview1,Go中相应的GOOS值为wasip1。随着API的不断发展,Go未来可能会添加新的GOOS以支持它们。

🌟 Go中的WASI使用方法

要在Go中使用WASI,首先确保安装了至少1.21版本的Go。在本示例中,我们使用Wasmtime作为宿主运行我们的二进制文件。首先,我们有一个简单的main.go

代码语言:javascript
复制
package main

import "fmt"

func main() {
    fmt.Println("Hello world!")
}

我们可以使用以下命令为wasip1构建它:

代码语言:javascript
复制
$ GOOS=wasip1 GOARCH=wasm go build -o main.wasm main.go

然后,使用wasmtime执行生成的文件:

代码语言:javascript
复制
$ wasmtime main.wasm
Hello world!
🧪 使用wasip1运行go测试

除了构建和运行二进制文件外,我们还希望能够直接运行go test。通过将misc/wasm目录添加到您的PATH中,可以使用所选的Wasm宿主运行测试。这是通过go testPATH中找到misc/wasm/go_wasip1_wasm_exec文件时自动执行它来实现的。

代码语言:javascript
复制
$ export PATH=$PATH:$(go env GOROOT)/misc/wasm
$ GOOS=wasip1 GOARCH=wasm go test ./...
📦 使用go:wasmimport包装Wasm函数

Go 1.21还引入了一种新的编译器指令:go:wasmimport。这使我们能够将对注释函数的调用转换为对宿主模块名称和函数名称指定的函数的调用。例如,wasip1 syscall API定义了random_get函数,并通过Go标准库中定义的函数包装器暴露给Go标准库。

🚧 限制

Wasm是单线程架构,没有并行性。

在Wasm中,wasip1 API缺少对网络套接字的完整实现,这是Go标准库中一些最受欢迎功能的重要组成部分。

🔮 Go中Wasm的未来

wasip1/wasm端口的添加只是我们希望为Go带来的Wasm能力的开始。请关注相关的议题跟踪器,了解更多关于在Wasm中导出Go函数(go:wasmexport)、32位端口和未来WASI API兼容性的提案。

🌟 参与其中

如果您正在尝试Wasm和Go并希望做出贡献,请参与进来!Go问题跟踪器跟踪所有正在进行的工作,Gophers Slack上的#webassembly频道是讨论Go和WebAssembly的好地方。

总结

本文被猫头虎的Go生态洞察专栏收录,详情点击这里。我们深入探讨了Go 1.21如何通过新端口wasip1支持WASI,这是Go在WebAssembly领域的一大步。希望你们喜欢这次的探索旅程!

参考资料
  1. WebAssembly 官网
  2. WASI 官网
  3. Wasmtime
  4. Go语言议题跟踪器
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2023年9月13日 Go生态洞察:WASI支持在Go中的实现 🌐
    • 摘要
      • 引言
        • 正文
          • 🚀 WebAssembly简介
          • 🛠️ WebAssembly System Interface(WASI)
          • 🌟 Go中的WASI使用方法
          • 🧪 使用wasip1运行go测试
          • 📦 使用go:wasmimport包装Wasm函数
          • 🚧 限制
          • 🔮 Go中Wasm的未来
          • 🌟 参与其中
          • 总结
          • 参考资料
      相关产品与服务
      腾讯云服务器利旧
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档