WebAssembly and Go: Why Does a Modern Web Developer Need This?
\n\nHave you ever dreamed of running high-performance Go code directly in the browser? Or perhaps you wanted to reuse an existing Go library in a web interface without rewriting it in JavaScript? If so, you've come to the right place. WebAssembly (Wasm) combined with Go is not just a trendy fad, but a real tool for creating applications that push the boundaries of browser capabilities.
\n\nIn this article, we'll break down what WebAssembly is, why Go is ideal for generating Wasm modules, and most importantly — we'll write real code. We won't be copying boring manuals. We'll create a useful tool: a fast client-side data parser that runs 10 times faster than pure JavaScript. Let's go!
\n\nWhat is WebAssembly in Simple Terms?
\n\nImagine JavaScript is a car with an automatic transmission. It's convenient, predictable, but not always fast. WebAssembly is a race car. It's a binary instruction format that executes at near-native speed. Browsers (Chrome, Firefox, Safari, Edge) can run Wasm code in an isolated sandbox, giving it direct access to memory and the CPU.
\n\nKey features of WebAssembly:
\n- \n
- Speed: Executes at near-native speed (C/C++, Rust, Go). \n
- Security: The sandbox prevents direct system access (just like JavaScript). \n
- Portability: Works everywhere there's a modern browser. \n
- Size: Compact binary file (.wasm). \n
And this is where Go enters the stage. Unlike C or Rust, Go has a built-in compiler for WebAssembly (GOOS=js GOARCH=wasm). This means you can take any Go package, compile it into .wasm, and run it in the browser. Sounds like magic, right?
\n\nWhy Go Specifically for WebAssembly?
\n\nYou might have a reasonable question: "Why use Go when there's Rust or AssemblyScript?" The answer lies in Go's philosophy:
\n- \n
- Simplicity: Go is famous for its minimalist grammar. You write code that is easy to read and maintain. \n
- Goroutines: Goroutines work in WebAssembly! You can run concurrent computations without blocking the main thread. \n
- Ecosystem: A huge number of libraries (parsers, cryptography, data processing) can be reused without changes. \n
- Low entry barrier: If you know Go, you don't need to learn a new language to work with Wasm. \n
The only downside is the binary file size. The Go runtime adds weight (usually 2-5 MB). But for serious applications (image editors, simulations, games), this is not critical.
\n\nPractice: Parsing Data in Go and Running in the Browser
\n\nLet's create an application that takes a string of numbers as input (e.g., "12, 34, 56, 78") and outputs the sum and arithmetic mean. This is a typical task for ETL processes or log processing. In JavaScript, this can be done, but in Go — it's faster.
\n\nStep 1: Writing a Go Function with JS Export
\n\nCreate a file main.go. The main rule: we cannot use fmt.Println directly in the browser. Instead, we will return results through the global object global (in Go this is syscall/js).
package main\n\nimport (\n "strconv"\n "strings"\n "syscall/js"\n)\n\n// calculate — function that will be called from JavaScript\nfunc calculate(this js.Value, args []js.Value) interface{} {\n if len(args) == 0 {\n return map[string]interface{}{\n "error": "No argument passed",\n }\n }\n\n input := args[0].String()\n parts := strings.Split(input, ",")\n \n var sum float64\n cou