0%

Go Playground

支持多文件形式

https://play.golang.org/p/KLZR7NlVZNX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"play.ground/foo"
)

func main() {
foo.Bar()
}

-- go.mod --
module play.ground

-- foo/foo.go --
package foo

import "fmt"

func Bar() {
fmt.Println("The Go playground now has support for multiple files!")
}

// Output:

1
The Go playground now has support for multiple files!

支持远程库导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
"github.com/alphaqiu/EventEmitter/event" //我是远程库
)

const (
fireEvent event.EventType = "fire"
)

func main() {
fmt.Println("Hello, playground")
emitter := event.NewEmitter(2)
emitter.On(fireEvent, doEvent())
}

func doEvent() event.Callback {
return func(event event.Event) {}
}

支持测试用例

1
2
3
4
5
6
7
8
9
package main

import (
"testing"
)

func TestUnit(t *testing.T) {
t.Log("hello")
}

Playground 源码

https://github.com/golang/playground

原理

Web端输入的代码,被传输到服务端进行解析并编译成在NaCl下可执行的文件,在服务器端执行后将结果输出到Web端的过程。

Google Native Client(缩写为NaCl),是一个由谷歌所发起的开放源代码计划,采用BSD许可证。它采用沙盒)技术,让Intel x86ARMMIPS子集的机器代码直接在沙盒上运行。它能够从浏览器直接运行程序机器代码,独立于用户的操作系统之外,使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
2
% cd /opt/nacl_sdk
% ./naclsdk update

如果遇到报错如下:

1
2
third_party.fancy_urllib.InvalidCertificateException: Host storage.googleapis.com returned an invalid certificate ([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:727)):
To learn more, see http://code.google.com/appengine/kb/general.html#rpcssl

请修改nacl_sdk/sdk_tools/download.py文件,把以下内容注释掉:

1
2
ca_certs = os.path.join(SCRIPT_DIR, 'cacerts.txt')
request.set_ssl_info(ca_certs=ca_certs)

重新执行./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