การใช้ WebAssembly (WASM) ร่วมกับ Golang

Sharing is caring!

แนะนำการใช้งาน WebAssembly (WASM) กับภาษา Go สำหรับสร้าง Web Application ที่มีประสิทธิภาพสูง พร้อมตัวอย่างและขั้นตอนใช้งานจริง


WebAssembly คืออะไร?

WebAssembly หรือ WASM คือมาตรฐานใหม่ที่ช่วยให้เราสามารถรันโค้ดภาษาอื่น (เช่น Go, Rust, C++) บน Browser ได้ด้วย performance ระดับ native โดยไม่ต้องเขียนด้วย JavaScript ล้วนอีกต่อไป

ข้อดี:

  • รันเร็วกว่า JavaScript
  • ปลอดภัย (รันใน sandbox)
  • ทำงานร่วมกับ JavaScript ได้

Golang รองรับ WebAssembly ไหม?

ใช่! ตั้งแต่ Go 1.11 เป็นต้นมา เราสามารถ build โค้ด Go ให้เป็น WebAssembly ได้โดยใช้ target: GOOS=js GOARCH=wasm


เริ่มต้นใช้งาน WASM กับ Go

1. ติดตั้ง Go รุ่นล่าสุด

ตรวจสอบให้แน่ใจว่าใช้ Go เวอร์ชัน 1.18 ขึ้นไป

go version

2. สร้างไฟล์ main.go

package main

import (
    "syscall/js"
)

func main() {
    alert := js.Global().Get("alert")
    alert.Invoke("Hello from WASM + Go!")
}

3. Build ให้เป็น .wasm

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

4. เพิ่มไฟล์ runtime wasm_exec.js

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

สร้าง HTML เพื่อรัน WebAssembly

<!DOCTYPE html>
<html>
  <head><meta charset="utf-8"></head>
  <body>
    <h1>Golang + WASM Demo</h1>
    <script src="wasm_exec.js"></script>
    <script>
      const go = new Go();
      WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
        go.run(result.instance);
      });
    </script>
  </body>
</html>

Run ด้วย Local HTTP Server

python3 -m http.server 8080

แล้วเปิด http://localhost:8080 เพื่อดูผลลัพธ์


สื่อสารระหว่าง Go ↔ JavaScript

Go เรียก JS

js.Global().Call("alert", "จาก Go สู่ JS")

JS เรียก Go Function

func add(this js.Value, args []js.Value) interface{} {
    sum := args[0].Int() + args[1].Int()
    return js.ValueOf(sum)
}

func main() {
    js.Global().Set("addFromGo", js.FuncOf(add))
    select {} // keep alive
}

เรียกจาก JS:

let result = addFromGo(1, 2);

ข้อจำกัดของ WASM + Go

  • ขนาด binary ใหญ่ (~2MB)
  • ยังไม่รองรับ threading หรือ syscall แบบเต็มรูปแบบ
  • ช้ากว่า native บางส่วน (แต่ยังเร็วกว่า JS)

Use Case ที่เหมาะกับ Go + WASM

  • แปลงไฟล์ / ประมวลผลใน browser
  • WebAssembly module แทน backend บางส่วน
  • ซ้อน logic ที่เขียนด้วย Go แล้วใช้ใน frontend

ตัวอย่างโปรเจกต์ Open Source ที่ใช้ Go + WASM


สรุป

WebAssembly ช่วยให้เราสามารถใช้ความสามารถของภาษา Go บน browser ได้ โดยไม่ต้องพึ่ง JavaScript เต็มรูปแบบ เป็นทางเลือกที่น่าสนใจสำหรับ frontend-heavy application ที่ต้องการ performance หรือ security ที่สูงขึ้น

แม้จะยังมีข้อจำกัดบางอย่าง แต่การใช้งาน WASM กับ Golang ก็เติบโตต่อเนื่อง และเหมาะกับหลาย use case ที่ต้องการ native performance บนเว็บ


คำค้น (SEO Keywords)

  • Go WebAssembly
  • WASM Go ภาษาไทย
  • WebAssembly กับ Golang
  • Run Go บน Browser
  • Build .wasm จาก Go
  • WASM integration JavaScript Go
  • HTML + Go WebAssembly

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *