WebAssembly рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдЧреЛ рдкрд░ рдлреНрд░рдВрдЯреЗрдВрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдореВрд▓ рд▓реЗрдЦред

рдлрд░рд╡рд░реА 2017 рдореЗрдВ, рдмреНрд░реИрдб рдлрд┐рдЯреНрдЬрд╝рдкреИрдЯреНрд░рд┐рдХ рдЯреАрдо рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдиреЗ рднрд╛рд╖рд╛ рдореЗрдВ WebAssembly рд╕рдорд░реНрдерди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ред рдЪрд╛рд░ рдорд╣реАрдиреЗ рдмрд╛рдж, рдирд╡рдВрдмрд░ 2017 рдореЗрдВ, рдЧреЛрдлрд░рдЬреЗрдПрд╕ рд▓реЗрдЦрдХ рд░рд┐рдЪрд░реНрдб рдореБрдЬрд┐рдпреЛрд▓ рдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЧрд╕реНрдд 2018 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг 1.11 рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рдЧрднрдЧ рд╕рднреА рддрдХрдиреАрдХреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореА рдореЗрдВ рд╕реА рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдпрд╣ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдбреЙрдХ рдХрдВрдЯреЗрдирд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓реЗрдЦрдХ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИрдВ :

я╗┐docker container run -dP nlepage/golang_wasm:examples # Find out which host port is used docker container ls 

рдлрд┐рд░ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдЬрд╛рдПрдВ : 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 // Our reference to the Go callback let printMessageReceived // Our promise let resolvePrintMessageReceived // Our promise resolver function setPrintMessage(callback) { printMessage = callback resolvePrintMessageReceived() } 

рдЕрдм рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП run() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ:

 async function run() { console.clear() // Create the Promise and store its resolve function printMessageReceived = new Promise(resolve => { resolvePrintMessageReceived = resolve }) const run = go.run(inst) // Start the wasm binary await printMessageReceived // Wait for the callback reception printMessage('Hello Wasm!') // Invoke the callback await run // Wait for the binary to terminate inst = await WebAssembly.instantiate(mod, go.importObject) // reset instance } 

рдФрд░ рдпрд╣ JS рдХреА рддрд░рдл рд╣реИ!

рдЕрдм, рдЧреЛ рднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЗрдПрд╕ рдкрдХреНрд╖ рдХреЛ рднреЗрдЬреЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

  var done = make(chan struct{}) 

рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди printMessage() рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 func printMessage(args []js.Value) { message := args[0].Strlng() fmt.Println(message) done <- struct{}{} // Notify printMessage has been called } 

рддрд░реНрдХ рд╕реНрд▓рд╛рдЗрд╕ []js.Value рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреЛ рд▓рд╛рдЗрди рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реНрд▓рд╛рдЗрд╕ рддрддреНрд╡ рдкрд░ js.Value.String() рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдм рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:

 callback := js.NewCallback(printMessage) defer callback.Release() // to defer the callback releasing is a good practice 

рдлрд┐рд░ рдЬреЗрдПрд╕ рдлрд╝рдВрдХреНрд╢рди 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 рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╡реЗрдм рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╣рдордд рд╣реИрдВ, рдЖрд╕рд╛рдиреА рд╕реЗ?

Source: https://habr.com/ru/post/hi417563/


All Articles