Go lang 실습

golang wasm - 1

컴닥 2024. 3. 5. 16:31
반응형

웹어셈블리 (WebAssembly)

https://dongwoo.blog/2017/06/06/%EB%B2%88%EC%97%AD-%EC%B9%B4%ED%88%B0%EC%9C%BC%EB%A1%9C-%EC%86%8C%EA%B0%9C%ED%95%98%EB%8A%94-%EC%9B%B9%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC/

https://namu.wiki/w/WebAssembly

https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC

https://d2.naver.com/helloworld/8786166

https://reintech.io/blog/a-guide-to-gos-syscall-js-package-go-and-webassembly

https://tech.kakao.com/2021/05/17/frontend-growth-08/

https://medium.com/@yujso66/%EB%B2%88%EC%97%AD-%EC%9B%B9%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%97%90-%EC%A3%BC%EB%AA%A9%ED%95%98%EB%9D%BC-280ff4e9ce01

 

wasm 사용 준비

 

go 1.11 이후..

C:\MyProjects\go_wasm>go version
go version go1.22.0 windows/amd64

 

GOROOT

C:\MyProjects\go_wasm>go env GOROOT
C:\Program Files\Go

 

GOROOT\misc\wasm\wasm_exec.js
파일 필요. 작업폴더로 복사할 것.

"C:\Program Files\Go\misc\wasm\" 폴더 확인

C:\MyProjects\go_wasm>dir "C:\Program Files\Go\misc\wasm\"              
 C 드라이브의 볼륨: OS
 볼륨 일련 번호: B457-0D6A

 C:\Program Files\Go\misc\wasm 디렉터리

2024-02-29  오후 03:33    <DIR>          .
2024-02-29  오후 03:33    <DIR>          ..
2024-02-02  오후 06:09               603 go_js_wasm_exec
2024-02-02  오후 06:09             1,342 go_wasip1_wasm_exec
2024-02-02  오후 06:09             1,303 wasm_exec.html
2024-02-02  오후 06:09            16,687 wasm_exec.js
2024-02-02  오후 06:09             1,151 wasm_exec_node.js
               5개 파일              21,086 바이트
               2개 디렉터리  286,364,139,520 바이트 남음

 

wasm 사용

 

main.go 작성

package main

import "syscall/js"

func main() {
	println("Wasm loaded.") // 웹 브라우저 콘솔로 출력됩니다. 

	// js.Global()로 Javascript의 Global 네임스페이스에 엑세스할 수 있습니다.
	js.Global().Get("console").Call("log", "Hello World!")
	
	alert := js.Global().Get("alert")
	alert.Invoke("Hello Wasm!")
}

 

main.go 컴파일

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

고 언어에서는 다른 OS로의 컴파일을 지원... 

헉 main.wasm 크기가 1547KB

 

index.html 작성

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go WebAssembly Example</title>
</head>

<body>
    <script src="./static/wasm_exec.js"></script>
    <script>
        async function runWasm() {
            const go = new Go();
            const result = await WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject);
            go.run(result.instance);
        }

        runWasm();
    </script>
</body>

</html>

 

서버 작동
본인은 VS 코드 익스텐션 이용.
https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

 

결과

golang에서 js 네임스페이스에 접속해서 JS로 작성된 함수를 실행하는 것은 성공. 
그럼 그 반대는... 

반응형