支持多文件形式
https://play.golang.org/p/KLZR7NlVZNX
1 | package main |
// Output:
1 | The Go playground now has support for multiple files! |
支持远程库导入
1 | package main |
支持测试用例
1 | package main |
Playground 源码
https://github.com/golang/playground
原理
Web端输入的代码,被传输到服务端进行解析并编译成在NaCl下可执行的文件,在服务器端执行后将结果输出到Web端的过程。
Google Native Client(缩写为NaCl),是一个由谷歌所发起的开放源代码计划,采用BSD许可证。它采用沙盒)技术,让Intel x86、ARM或MIPS子集的机器代码直接在沙盒上运行。它能够从浏览器直接运行程序机器代码,独立于用户的操作系统之外,使Web应用程序可以用接近于机器代码运作的速度来运行,同时兼顾安全性。

这里有介绍Playground的内幕 https://www.oschina.net/translate/inside-the-go-playground?lang=chs&p=1
2017年Google已弃用NaCl转向Webassembly,但好处是它以Playground形式,可以实现实时在线编译执行Go示例代码,帮助快速实时解决和分享学习中遇到的问题。采用NaCl的方式和Webassembly并不冲突,
输入代码
前端Js控制,指定输入内容解析的格式,以及传输到后端处理的内容和方式。
解析和校验
解析和校验是交叉进行的,一边解析传来的的信息,把信息数据解析成Go代码块,检查是否使用mod模式或GOPATH模式,一边校验输入的内容是否符合语法规范,是否是Test模式,是否需要下载导入的包等等。
保存
把解析后的代码块以包的形式保存在服务器临时目录内。
编译
编译成nacl模式
1 | GOOS=nacl GOARCH=amd64p32 GOCACHE=/absolute/path go build -o a.out |
运行
在nacl 沙盒环境下运行,并捕捉结果
1 | sel_ldr_x86_64 -l /dev/null -S -e a.out |
返回结果
将运行捕捉的结果返回。
工具
${GOROOT}/misc/nacl/README介绍了在Native Client环境下运行程序所需的支持。Go 1.3以后版本都支持NaCl。
下载NaCl SDK,https://developer.chrome.com/native-client/sdk/download,解压后执行
1 | % cd /opt/nacl_sdk |
如果遇到报错如下:
1 | third_party.fancy_urllib.InvalidCertificateException: Host storage.googleapis.com returned an invalid certificate ([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)): |
请修改nacl_sdk/sdk_tools/download.py文件,把以下内容注释掉:
1 | ca_certs = os.path.join(SCRIPT_DIR, 'cacerts.txt') |
重新执行./naclsdk update,成功执行后,链接sel_ldr_x86_64这个文件。
1 | % ln -nfs /opt/nacl_sdk/pepper_49/tools/sel_ldr_x86_64 $GOPATH/bin/sel_ldr_x86_64 |