рдореВрд▓ рд▓реЗрдЦред
рдлрд░рд╡рд░реА 2017 рдореЗрдВ, рдмреНрд░реИрдб рдлрд┐рдЯреНрдЬрд╝рдкреИрдЯреНрд░рд┐рдХ рдЯреАрдо рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдиреЗ рднрд╛рд╖рд╛ рдореЗрдВ WebAssembly рд╕рдорд░реНрдерди рдмрдирд╛рдиреЗ рдХрд╛
рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ред рдЪрд╛рд░ рдорд╣реАрдиреЗ рдмрд╛рдж, рдирд╡рдВрдмрд░ 2017 рдореЗрдВ,
рдЧреЛрдлрд░рдЬреЗрдПрд╕ рд▓реЗрдЦрдХ рд░рд┐рдЪрд░реНрдб рдореБрдЬрд┐рдпреЛрд▓ рдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЧрд╕реНрдд 2018 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ
рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг
1.11 рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рдЧрднрдЧ рд╕рднреА рддрдХрдиреАрдХреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореА рдореЗрдВ рд╕реА рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдпрд╣ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдбреЙрдХ рдХрдВрдЯреЗрдирд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдЬреЛ рд▓реЗрдЦрдХ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИрдВ :
я╗┐docker container run -dP nlepage/golang_wasm:examples
рдлрд┐рд░
рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдЬрд╛рдПрдВ : 32XXX /, рдФрд░ рдПрдХ рд▓рд┐рдВрдХ рд╕реЗ рджреВрд╕рд░реЗ рд▓рд┐рдВрдХ рдкрд░ рдЬрд╛рдПрдВред
рд╣рд╛рдп рд╡рд╛рд╕рдо!
рдореВрд▓ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ (рдпрд╣рд╛рдВ рддрдХ
рдХрд┐ рд░реВрд╕реА рдореЗрдВ рднреА), рддреЛ рдЪрд▓рд┐рдП рдмрд╕ рдФрд░ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЧреЛ рдХрд╛ рдПрдХ рддрд╛рдЬрд╝рд╛ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдЬреЛ рдХрд┐ рдореАрд╕рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВ
рдХрджрдо рд╕реЗ рдХрджрдо рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛
рд╕реНрдерд╛рдкрдирд╛ , рдмрд╕ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ
рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рд╕реА рдЧреЛ ,
рдЧрд┐рддреБрдм рдкрд░ рдЧреЛрд▓рдм-рд╡рд╛рд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдпрд╛ рдЖрдк
nlepage / golang_wasm рд╕реЗ рдПрдХ рдЫрд╡рд┐ рднреА рддреЗрдЬреА рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рдЖрдк рдкрд╛рд░рдВрдкрд░рд┐рдХ
helloworld.go
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
я╗┐GOOS=js GOARCH=wasm go build -o test.wasm helioworld.go
GOOS рдФрд░ GOARCH рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
nlepage / golang_wasm рдЫрд╡рд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдПрдХ
Dockerfile
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
FROM nlepage/golang_wasm COPY helloworld.go /go/src/hello/ RUN go build -o test.wasm hello
рдЕрдВрддрд┐рдо рдЪрд░рдг
wasm_exec.html
рдФрд░
wasm_exec.js
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
misc/wasm
рдпрд╛
рдЧреЛрдХрд░ рдЫрд╡рд┐
nlepage / golang_wasm рдореЗрдВ
/usr/local/go/misc/wasm/
рдореЗрдВ
test.wasm
рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред
test.wasm
рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдмреНрд░рд╛рдЙрдЬрд╝рд░ (wasm_exec.js рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓ test.wasm рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред
рдЖрдкрдХреЛ рдмрд╕ nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 3 рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЗрдВ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдм wasm_exec.html "рд░рди" рдмрдЯрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ (рдпрд╣ рдХреЗрд╡рд▓ рддрднреА
test.wasm
рд╣реЛрдЧрд╛ рдЬрдм
test.wasm
рд╕рд╣реА рдврдВрдЧ
test.wasm
рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ MIME рдкреНрд░рдХрд╛рд░ рдХреЗ
application/wasm
рд╕рд╛рде
test.wasm
рдХреЛ рдкрд░реЛрд╕рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред (рдЙрджрд╛ред nginx рдХреЛ рдПрдХ
рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП mime.types рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдЖрдк
nlepage / golang_wasm рд╕реЗ nginx рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╢реНрдЪрд┐рдд MIME рдкреНрд░рдХрд╛рд░,
wasm_exec.html
рдФрд░
wasm_exec.js
рдХреЛрдб> / usr / рд╢реЗрдпрд░ / nginx / html / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЕрдм "рд░рди" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдлрд┐рд░ рдЕрдкрдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЖрдк рдХрдВрд╕реЛрд▓ рджреЗрдЦреЗрдВрдЧреЗред рдЧреНрд░реАрдЯрд┐рдВрдЧ рдЧреНрд░реАрдЯрд┐рдВрдЧ ("рд╣реИрд▓реЛ рд╡рд╛рд╕реЛ" "))ред
рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
рдЧреЛ рд╕реЗ рдЬреЗрдПрд╕ рдХреЛ рдмреБрд▓рд╛рдУ
рдЕрдм рдЬрдм рд╣рдордиреЗ рдЧреЛ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдкрд╣рд▓рд╛ WebAssembly рдмрд╛рдЗрдирд░реА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдирдП syscall / js рдкреИрдХреЗрдЬ рдХреЛ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓,
js.go
рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдПрдХ рдирдпрд╛
js.Value
рдкреНрд░рдХрд╛рд░
js.Value
рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
js.Value.Get()
рдФрд░ js.Value.Set()
рд▓реМрдЯреЗрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдлрд╝реАрд▓реНрдб рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВредjs.Value.Index()
рдФрд░ js.Value.SetIndex()
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░реАрдб рдПрдВрдб рд░рд╛рдЗрдЯ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВредjs.Value.Call()
рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рддрд╛ рд╣реИредjs.Value.Invoke()
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рддрд╛ рд╣реИредjs.Value.New()
рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
js.Value.Int()
рдпрд╛ js.Value.Bool()
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реА рдЧреЛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рддрд░реАрдХреЗред
рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ:
js.Undefined()
js.Value рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд undefined
редjs.Null()
js.Value
рд╕рдВрдмрдВрдзрд┐рдд null
редjs.Global()
js.Value
рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛редjs.ValueOf()
рдЖрджрд┐рдо рдЬрд╛рдУ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА js.Value
Os.StdOut рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдЗрдП рдЗрд╕реЗ
window.alert()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдирд╛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
рдЪреВрдВрдХрд┐ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╣реИрдВ, рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдХреЛрдк рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдХреЛрдк рд╕реЗ рдЕрд▓рд░реНрдЯ () рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
alert := js.Global().Get("alert")
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕
js.Value
рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ
alert
рд╡реЗрд░рд┐рдПрдмрд▓ рд╣реИ, рдЬреЛ
window.alert
JS рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдФрд░ рдЖрдк
js.Value.Invoke()
рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
alert.Invoke("Hello wasm!")
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрдирд╡реЙрдЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ js.ValueOf () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдордирдорд╛рдиреА рд░рд╛рд╢рд┐ рд▓реЗрддрд╛
interface{}
рдФрд░ рд╡реИрд▓реНрдпреВрдСрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реА рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рд╣рдорд╛рд░реЗ рдирдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
package main import ( "syscall/js" ) func main() { alert := js.Global().Get("alert") alert.Invoke("Hello Wasm!") }
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд┐рд░реНрдл
test.wasm
рдирд╛рдордХ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░
wasm_exec.html
рдФрд░
wasm_exec.js
рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ
wasm_exec.js
рдХрд┐ рдпрд╣ рдерд╛ред
рдЕрдм, рдЬрдм рд╣рдо "рд░рди" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЕрд▓рд░реНрдЯ рд╡рд┐рдВрдбреЛ рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
examples/js-call
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдЬреЗрдПрд╕ рд╕реЗ рдХреЙрд▓ рдЬрд╛рдУред
рдЬреЗрдПрд╕ рдХреЛ рдЧреЛ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЪрд▓реЛ
syscall/js
рдкреИрдХреЗрдЬ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓
callback.go
ред
js.Callback
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЧреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП js.Callback
рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░редjs.NewCallback()
рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ js.NewCallback()
рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ ( js.Value
рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ), рдФрд░ js.Callback
рд▓реМрдЯрд╛рддрд╛ рд╣реИред- рд╕рдХреНрд░рд┐рдп рдХреЙрд▓рдмреИрдХ рдФрд░
js.Callback.Release()
рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдореИрдХреЗрдирд┐рдХ, рдЬрд┐рдиреНрд╣реЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред js.NewEventCallback()
рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдкрдЯреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ 1 рддрд░реНрдХ - рдПрдХ рдШрдЯрдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдХреБрдЫ рд╕рд░рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ: JS
fmt.Println()
рдХреЛ JS рд╕рд╛рдЗрдб рд╕реЗ
fmt.Println()
ред
рд╣рдо рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Go рд╕реЗ рдХреЙрд▓рдмреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП
wasm_exec.html
рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВрдЧреЗред
async function run() { console.clear(); await go.run(inst); inst = await WebAssembly.instantiate(mod, go.ImportObject);
рдпрд╣ рддрддреИрдпрд╛ рдмрд╛рдЗрдирд░реА рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреА рд╣реИ, рдлрд┐рд░ рдЕрдЧрд▓реЗ рд░рди рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рддреА рд╣реИред
рдЖрдЗрдП рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЧреЛ рдХреЙрд▓рдмреИрдХ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░
Promise
рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛:
let printMessage
рдЕрдм рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
run()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ:
async function run() { console.clear()
рдФрд░ рдпрд╣ JS рдХреА рддрд░рдл рд╣реИ!
рдЕрдм, рдЧреЛ рднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЗрдПрд╕ рдкрдХреНрд╖ рдХреЛ рднреЗрдЬреЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
var done = make(chan struct{})
рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди
printMessage()
рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
func printMessage(args []js.Value) { message := args[0].Strlng() fmt.Println(message) done <- struct{}{}
рддрд░реНрдХ рд╕реНрд▓рд╛рдЗрд╕
[]js.Value
рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреЛ рд▓рд╛рдЗрди рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реНрд▓рд╛рдЗрд╕ рддрддреНрд╡ рдкрд░
js.Value.String()
рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдм рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:
callback := js.NewCallback(printMessage) defer callback.Release()
рдлрд┐рд░ рдЬреЗрдПрд╕ рдлрд╝рдВрдХреНрд╢рди
setPrintMessage()
рдХреЙрд▓
setPrintMessage()
, рдЬреИрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ
setPrintMessage()
window.alert()
:
setPrintMessage := js.Global.Get("setPrintMessage") setPrintMessage.Invoke(callback)
рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ:
<-done
рдпрд╣ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рдмреИрдХ рдХреЛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдЧреЛрд░рдЖрдЙрдЯ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореБрдЦреНрдп рдЧреЛрд░рдЖрдЙрдЯ рдХреЛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ wasm рдмрд╛рдЗрдирд░реА рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкрд░рд┐рдгрд╛рдореА Go рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
я╗┐package main import ( "fmt" "syscall/js" ) var done = make(chan struct{}) func main() { callback := js.NewCallback(prtntMessage) defer callback.Release() setPrintMessage := js.Global().Get("setPrintMessage") setPrIntMessage.Invoke(callback) <-done } func printMessage(args []js.Value) { message := args[0].Strlng() fmt.PrintIn(message) done <- struct{}{} }
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддрд░рд╣,
test.wasm
рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓
test.wasm
ред рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде
wasm_exec.html
рдХреЛ рдмрджрд▓рдирд╛
wasm_exec.html
, рдФрд░
wasm_exec.js
рдкреБрди: рдЙрдкрдпреЛрдЧ
wasm_exec.js
рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм, рдЬрдм рдЖрдк "рд░рди" рдмрдЯрди рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрджреЗрд╢ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ! (рдФрд░ рдХрдард┐рдиред)
рдбреЙрдХ рдлрд╝рд╛рдЗрд▓ рдмреЛрд▓реА рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг
examples/go-call
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред
рд▓рдВрдмрд╛ рдХрд╛рдо
рдЬреЗрдПрд╕ рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдЬреЗрдПрд╕ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬреЗрдПрд╕ рдХреА рддрд░рдл рд╕реЗред
рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЧреЛ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЬреЗрдПрд╕ рдХреА рдУрд░ рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдХреБрдЫ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рдХреНрдпреЛрдВ рдирд╣реАрдВ, рдореИрдВ wasm рдмрд╛рдЗрдирд░реА рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдХреЙрд▓рдмреИрдХ рдХреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрди рдХреЙрд▓реЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред
рдЗрд╕ рдмрд╛рд░, рдЖрдЗрдП рдЧреЛ рдкрдХреНрд╖ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЬреЗрдПрд╕ рдкрдХреНрд╖ рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝реЗрдВред
рд╣рдорд╛рд░рд╛ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди
printMessage()
рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛:
я╗┐var no int func printMessage(args []js.Value) { message := args[0].String() no++ fmt.Printf("Message no %d: %s\n", no, message) }
рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ JS рд╕рд╛рдЗрдб рдореЗрдВ рднреЗрдЬрдирд╛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ:
я╗┐callback := js.NewCallback(printMessage) defer callback.Release() setPrintMessage := js.Global().Get("setPrintMessage") setPrIntMessage.Invoke(callback)
рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдЦреНрдп рдЧреЛрд░реЛрдЗрди рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЪреИрдирд▓ рдирд╣реАрдВ
done
ред рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдЧреЛрд░реЛрдЗрди рдХреЛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЦрд╛рд▓реА
select{}
:
select{}
рдпрд╣ рд╕рдВрддреЛрд╖рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм рдмрдВрдж рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдирд░реА рд╡рд╛рд╢ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рдЯрдХрд╛ рд░рд╣реЗрдЧрд╛ред
рдЖрдк рдкреГрд╖реНрда рдкрд░ рдкрд╣рд▓реЗ рдХреЗ
beforeunload
рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдИрд╡реЗрдВрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп рдЧреЛрд░реЛрдЗрди рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
var beforeUnloadCh = make(chan struct{})
рдЗрд╕ рдмрд╛рд░, рдирдпрд╛ рдкрд╣рд▓реЗ
beforeUnload()
рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдПрдХ рдПрдХрд▓
js.Value
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ:
func beforeUnload(event js.Value) { beforeUnloadCh <- struct{}{} }
рдлрд┐рд░ рдЗрд╕реЗ
js.NewEventCallback()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ рдФрд░ рдЗрд╕реЗ JS рд╕рд╛рдЗрдб рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:
beforeUnloadCb := js.NewEventCallback(0, beforeUnload) defer beforeUnloadCb.Release() addEventLtstener := js.Global().Get("addEventListener") addEventListener.Invoke("beforeunload", beforeUnloadCb)
рдЕрдВрдд рдореЗрдВ, рдкрд╣рд▓реЗ
beforeUnloadCh
рдЪреИрдирд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде рдЦрд╛рд▓реА рдмреНрд▓реЙрдХрд┐рдВрдЧ
select
рдХреЛ
beforeUnloadCh
:
<-beforeUnloadCh fmt.Prtntln("Bye Wasm!")
рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
я╗┐package main import ( "fmt" "syscall/js" ) var ( no int beforeUnloadCh = make(chan struct{}) ) func main() { callback := js.NewCallback(printMessage) defer callback.Release() setPrintMessage := js.Global().Get("setPrintMessage") setPrIntMessage.Invoke(callback) beforeUnloadCb := js.NewEventCallback(0, beforeUnload) defer beforeUnloadCb.Release() addEventLtstener := js.Global().Get("addEventListener") addEventListener.Invoke("beforeunload", beforeUnloadCb) <-beforeUnloadCh fmt.Prtntln("Bye Wasm!") } func printMessage(args []js.Value) { message := args[0].String() no++ fmt.Prtntf("Message no %d: %s\n", no, message) } func beforeUnload(event js.Value) { beforeUnloadCh <- struct{}{} }
рдкрд╣рд▓реЗ, рдЬреЗрдПрд╕ рдХреА рдУрд░ рд╕реЗ, wasm рдмрд╛рдЗрдирд░реА рдХрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛:
я╗┐const go = new Go() let mod, inst WebAssembly .instantiateStreaming(fetch("test.wasm"), go.importObject) .then((result) => { mod = result.module inst = result.Instance document.getElementById("runButton").disabled = false })
рдЪрд▓реЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмрд╛рдЗрдирд░реА рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ:
я╗┐(async function() { const go = new Go() const { instance } = await WebAssembly.instantiateStreaming( fetch("test.wasm"), go.importObject ) go.run(instance) })()
рдФрд░ тАЬрд░рдитАЭ рдмрдЯрди рдХреЛ рдПрдХ рдореИрд╕реЗрдЬ рдлреАрд▓реНрдб рдФрд░ рдПрдХ рдмрдЯрди
printMessage()
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВред
я╗┐<input id="messageInput" type="text" value="Hello Wasm!"> <button onClick="printMessage(document.querySelector('#messagelnput').value);" id="prtntMessageButton" disabled> Print message </button>
рдЕрдВрдд рдореЗрдВ,
setPrintMessage()
рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдХреЙрд▓рдмреИрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
я╗┐let printMessage; function setPrintMessage(callback) { printMessage = callback; document.querySelector('#printMessageButton').disabled = false; }
рдЕрдм, рдЬрдм рд╣рдо "рдкреНрд░рд┐рдВрдЯ рд╕рдВрджреЗрд╢" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рдкрд╕рдВрдж рдХрд╛ рдПрдХ рд╕рдВрджреЗрд╢ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдореБрджреНрд░рд┐рдд рдХреЙрд▓ рдХрд╛рдЙрдВрдЯрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдХреЗ рдкреНрд░рд┐рдЬрд░реНрд╡ рд▓реЙрдЧ рдмреЙрдХреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреЗрдЬ рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо "рдмрд╛рдп рд╡рд╛рд╕рдо" рд╕рдВрджреЗрд╢ рджреЗрдЦреЗрдВрдЧреЗред
рд╕реНрд░реЛрдд рдЬреАрдердм рдкрд░
examples/long-running
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдФрд░ рдлрд┐рд░?
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реАрдЦрд╛
syscall/js
API рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдЪреАрдЬреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдЬрд╛рдирддреЗ рд╣реИрдВ рддреЛ рдЖрдк
рд▓реЗрдЦрдХ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧреЛ рдХреЙрд▓рдмреИрдХ рд╕реЗ рд╕реАрдзреЗ рдЬреЗрдПрд╕ рдХрд╛ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╕рднреА рдХреЙрд▓рдмреИрдХ рдПрдХ рд╣реА рдЧреЛрд░рдЖрдЙрдЯ рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХреБрдЫ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдпрд╛ рдЧреЛрд░рдЖрдЙрдЯ рдмрдирд╛рдирд╛ рди рднреВрд▓реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдк рдЕрдиреНрдп рд╕рднреА рдХреЙрд▓рдмреИрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдВрдЧреЗред
рд╕рднреА рдореВрд▓ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИ рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╕рднреА рдЧреЛрд░рдЖрдЙрдЯ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣
рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ ред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреЗрд╡рд▓ fmt рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рд╕рдм рдХреБрдЫ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рднрд╛рдЧрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ Node.js. рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ
рдЕрдВрдд рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдЧреЛ рдХреЛ рд╢реБрджреНрдз рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдХрд┐рд╕реА рдиреЗ
hajimehoshi рдХрд╛ рдорд╛рдкрди рдХрд┐рдпрд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдг рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрдХрдиреАрдХ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЧреЛ 1.11 рдХреЛ рдЕрднреА рддрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╡реЗ
рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреАрдбрд╝рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ ред
рдореБрдЦреНрдп рдиреЛрдЯреНрд╕, рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦрдХ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рд╕реЗ рдореМрдЬреВрджрд╛ рдЧреЛ рдХреЛрдб рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реИред рд▓реЗрдХрд┐рди рдирдП рдорд╛рдирдХреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрдлрд╝рд▓рд╛рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ wasm рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╡реЗрдм рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╣рдордд рд╣реИрдВ, рдЖрд╕рд╛рдиреА рд╕реЗ?