を利用する reqR, reqW, _ := os.Pipe() // リクエスト用の Pipe resR, resW, _ := os.Pipe() // レスポンス用の Pipe // wasmimport で使う Host 関数の定義 hostBuilder.WithGoModuleFunction( api.GoModuleFunc(func(_ context.Context, mod api.Module, stack []uint64) { // Guest 側のメモリからレスポンスを取得する b, _ := mod.Memory().Read(uint32(stack[0]), uint32(stack[1])) resW.Write(b) // resW に書き込むと、resR で読み込める }), []api.ValueType{api.ValueTypeI32, api.ValueTypeI32}, []api.ValueType{} ) go func() { wasmRuntime.InstantiateModule( wazero.NewModuleConfig(). // Guest の Stdin にリクエスト読み込み用の Pipe を渡す WithStdin(reqR).WithStdout(os.Stdout).WithStderr(os.Stderr) ) }() reqW.Write("hello\n") // リクエストを書き込む。Guest の Stdin 経由で読み込む resp, _ := bufio.NewReader(resR).ReadString('\n') // 結果を resR 経由で読み込む 1. Host => Guest / Guest => Host の Pipe を作る 2. Host Function を定義し、Guest からの戻り値を Pipe に書き込む 3. WASMインスタンス起動時に STDIN に Pipe を渡す 4. Pipe 経由でリクエストを送る 5. Pipe 経由でレスポンスを受け取る