The web design and pages for my personal website.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.4 KiB

WebAssembly and Go(lang)

Some notes, links and tips for working with WebAssembly programs written in Go.



Quick synopsis of an example WASM app in Go that fetches a PNG image over HTTP and draws it into a canvas.

// +build js,wasm

package main

import (

func main() {
	href := js.Global().Get("location").Get("href")
	u, err := url.Parse(href.String())
	if err != nil {
	u.Path = "/logo.png"

	log.Println("loading image file: " + u.String())
	resp, err := http.Get(u.String())
	if err != nil {
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
	enc := base64.StdEncoding.EncodeToString(b)

	canvas := js.Global().Get("document").Call("getElementById", "canvas")
	ctx := canvas.Call("getContext", "2d")
	image := js.Global().Call("eval", "new Image()")
	image.Call("addEventListener", "load", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		ctx.Call("drawImage", image, 0, 0)
		return nil
	image.Set("src", "data:image/png;base64,"+enc)

	canvas.Call("addEventListener", "click", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		js.Global().Get("window").Call("alert", "Don't click me!")
		return nil

	select {}



  • Cat-o-licious is a simple game using SDL2 and originally targeted toward desktop applications. The author ported the engine over to WASM using the HTML5 Canvas API in place of SDL2 functions.
  • golang-wasm-example at time of writing shows a simple WASM app in Go that fetches a PNG image and renders it into an HTML5 Canvas. The Go portion was also copied above.
  • sdl-canvas-wasm is a C++ example that natively uses SDL2 and compiles to WebAssembly. Live demo here.