性少妇vide0seⅹfree_国产剧情视频在线观看_日日碰夜夜爽_九九这里只有精品视频_性free毛茸茸偷窥videos_国产v亚洲

中培偉業IT資訊頻道
您現在的位置:首頁 > IT資訊 > 軟件研發 > 如何使用Web Assembly在瀏覽器中運行Go?

如何使用Web Assembly在瀏覽器中運行Go?

2020-08-13 16:23:09 | 來源:中培企業IT培訓網

如果熟悉Go  Playground,那么就會知道在瀏覽器中安裝Go暫存器有多方便。想給別人看一段代碼片段嗎?是否想快速測試一些語法?基于瀏覽器的代碼墊很有幫助。關于這一點,我創建了一個新的游樂場。關于這個新游樂場的妙處在于,它不使用遠程服務器來運行代碼,而只是用于對其進行編譯。該代碼在您的瀏覽器中使用Web  Assembly運行。

  它是如何工作的?

當用戶單擊“運行”時,代碼將發送回我們的服務器。服務器是用Go語言編寫的。因此,API的處理程序如下所示:

func compileCodeHandler(w http.ResponseWriter, r *http.Request) {

defer r.Body.Close()

// Get code from params

type parameters struct {

Code string

}

decoder := json.NewDecoder(r.Body)

params := parameters{}

err := decoder.Decode(?ms)

if err != nil {

respondWithError(w, 500, "Couldn't decode parameters")

return

}

// create file system location for compilation path

usr, err := user.Current()

if err != nil {

respondWithError(w, 500, "Couldn't get system user")

return

}

workingDir := filepath.Join(usr.HomeDir, ".wasm", uuid.New().String())

err = os.MkdirAll(workingDir, os.ModePerm)

if err != nil {

respondWithError(w, 500, "Couldn't create directory for compilation")

return

}

defer func() {

err = os.RemoveAll(workingDir)

if err != nil {

respondWithError(w, 500, "Couldn't clean up code from compilation")

return

}

}()

f, err := os.Create(filepath.Join(workingDir, "main.go"))

if err != nil {

respondWithError(w, 500, "Couldn't create code file for compilation")

return

}

defer f.Close()

dat := []byte(params.Code)

_, err = f.Write(dat)

if err != nil {

respondWithError(w, 500, "Couldn't write code to file for compilation")

return

}

// compile the wasm

const outputBinary = "main.wasm"

os.Setenv("GOOS", "js")

os.Setenv("GOARCH", "wasm")

cmd := exec.Command("go", "build", "-o", outputBinary)

cmd.Dir = workingDir

stderr, err := cmd.StderrPipe()

if err != nil {

respondWithError(w, 500, err.Error())

return

}

if err := cmd.Start(); err != nil {

respondWithError(w, 500, err.Error())

return

}

stdErr, err := ioutil.ReadAll(stderr)

if err != nil {

respondWithError(w, 500, err.Error())

return

}

stdErrString := string(stdErr)

if stdErrString != "" {

parts := strings.Split(stdErrString, workingDir)

if len(parts) < 2 {

respondWithError(w, 500, stdErrString)

return

}

respondWithError(w, 400, parts[1])

return

}

if err := cmd.Wait(); err != nil {

respondWithError(w, 500, err.Error())

return

}

// write wasm binary to response

dat, err = ioutil.ReadFile(filepath.Join(workingDir, outputBinary))

if err != nil {

respondWithError(w, 500, err.Error())

return

}

w.Write(dat)

}

如您所見,處理程序僅將代碼作為輸入,并以WASM字節片作為響應。

  前端呢?

前端非常簡單。首先,我們需要在頁面中包括Go WASM的官方執行者。假設您的計算機上已安裝Go,可以在以下位置找到此JavaScript文件:

$(go env GOROOT)/misc/wasm/wasm_exec.js

然后在您的html正文中包含腳本:  

  <!DOCTYPE html>
  <html>
  <head>
   <title>Qvault Classroom - Learn Coding</title>
  </head>
  <body>
  <script  src="wasm_exec.js"></script>
  </body>
  </html>

因為Qvault  Classroom的前端是作為Vue.js單頁應用程序編寫的,所以我創建了一個小的es6模塊,該模塊運行WASM字節數組并將輸出作為行數組返回:

const go = new window.Go();export default async function runGoWasm(rawData)  {

const result = await WebAssembly.instantiate(rawData, go.importObject);

let oldLog = console.log;

let stdOut = [];

console.log = (line) => {stdOut.push(line);};

await go.run(result.instance);

console.log = oldLog;

return stdOut;

}

關于如何使用Web Assembly在瀏覽器中運行Go 的內容,介紹到這里就結束了。如果還想了解更多關于Web  Assembly的信息,請繼續關注中培偉業。

標簽: 軟件研發
主站蜘蛛池模板: 欧美激情成人 | 黄色成年人 | 日本特级黄 | 69pao强力打造| 老熟妇性老熟妇性色 | 延禧宫略在线观看 | 少妇人妻精品一区二区 | 337p粉嫩大胆噜噜噜噜 | 国产高潮国语对白精品视频网站 | 无遮挡扒开双腿猛进入免费 | 日本午夜成年在线网站 | 姑娘第8集在线观看免费 | 视频一区二区中文字幕日韩 | 艳肉观音性三级dvd 欧美三级电影在线观看 | 大地资源二在线观看免费高清 | 在线吴梦梦视频一区二区 | 国产黄色在线免费观看 | 国产伦精品一区二区三区免费视频 | 欧美性猛交xxxⅹ乱大交小说一 | 国产欧美精品aaaaa久久 | 91粉色在线观看 | 欧美激情久久久久久久久久久 | 国产午夜性春猛交xxxx公交车 | 揉我胸啊嗯~喷水了视频 | 免费日韩视 | 国产后入清纯学生妹 | 欧美大片黄 | 在线观看免费高清www | 黄色日本免费 | 国产精品毛片一区二区三区四区 | 国产香蕉97碰碰视频碰碰看 | 在线吴梦梦视频一区二区 | 精品少妇无码一区视频 | 久久天天躁狠狠躁夜夜躁2020 | 2020最新无码福利视频 | 91精品久久久高潮叫床九色91 | 91黄在线看 | 欧美色图自拍 | 一区二区三区四区在线免费观看 | 久久大香香蕉国产 | 久久这里只有国产精品 |