{"id":15331320,"url":"https://github.com/flimzy/gopherjs","last_synced_at":"2025-10-10T01:31:43.401Z","repository":{"id":57611161,"uuid":"41175542","full_name":"flimzy/gopherjs","owner":"flimzy","description":"A compiler from Go to JavaScript for running Go code in a browser","archived":false,"fork":true,"pushed_at":"2023-06-07T21:40:26.000Z","size":3887,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-18T10:12:42.256Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"gopherjs/gopherjs","license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flimzy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-21T20:15:15.000Z","updated_at":"2015-08-21T20:15:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/flimzy/gopherjs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flimzy%2Fgopherjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flimzy%2Fgopherjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flimzy%2Fgopherjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flimzy%2Fgopherjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flimzy","download_url":"https://codeload.github.com/flimzy/gopherjs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235892403,"owners_count":19061859,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-01T09:55:15.696Z","updated_at":"2025-10-10T01:31:38.095Z","avatar_url":"https://github.com/flimzy.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"GopherJS - A compiler from Go to JavaScript\n-------------------------------------------\n\n[![Circle CI](https://circleci.com/gh/gopherjs/gopherjs.svg?style=svg)](https://circleci.com/gh/gopherjs/gopherjs)\n\nGopherJS compiles Go code ([golang.org](http://golang.org/)) to pure JavaScript code. Its main purpose is to give you the opportunity to write front-end code in Go which will still run in all browsers. Give GopherJS a try on the [GopherJS Playground](http://gopherjs.github.io/playground/).\n\n### What is supported?\nNearly everything, including Goroutines ([compatibility table](https://github.com/gopherjs/gopherjs/blob/master/doc/packages.md)). Performance is quite good in most cases, see [HTML5 game engine benchmark](http://ajhager.github.io/enj/).\n\n### Installation and Usage\nGet or update GopherJS and dependencies with:\n\n```\ngo get -u github.com/gopherjs/gopherjs\n```\n\nNow you can use  `gopherjs build [files]` or `gopherjs install [package]` which behave similar to the `go` tool. For `main` packages, these commands create a `.js` file and `.js.map` source map in the current directory or in `$GOPATH/bin`. The generated JavaScript file can be used as usual in a website. Use `gopherjs help [command]` to get a list of possible command line flags, e.g. for minification and automatically watching for changes. If you want to run the generated code with Node.js, see [this page](https://github.com/gopherjs/gopherjs/blob/master/doc/syscalls.md).\n\n*Note: GopherJS will try to write compiled object files of the core packages to your $GOROOT/pkg directory. If that fails, it will fall back to $GOPATH/pkg.*\n\n### Performance Tips\n\n- Use the `-m` command line flag to generate minified code.\n- Apply gzip compression (http://en.wikipedia.org/wiki/HTTP_compression).\n- Use `int` instead of `(u)int8/16/32/64`.\n- Use `float64` instead of `float32`.\n\n### Community\n- [#gopherjs Channel on Gophers Slack](https://gophers.slack.com/messages/gopherjs/) (invites to Gophers Slack are available [here](http://blog.gopheracademy.com/gophers-slack-community/#how-can-i-be-invited-to-join:2facdc921b2310f18cb851c36fa92369))\n- [Google Group](https://groups.google.com/d/forum/gopherjs)\n- [Bindings to JavaScript APIs and libraries](https://github.com/gopherjs/gopherjs/wiki/bindings)\n- [GopherJS on Twitter](https://twitter.com/GopherJS)\n\n### Getting started\n#### Interacting with the DOM\nThe package `github.com/gopherjs/gopherjs/js` (see [documentation](http://godoc.org/github.com/gopherjs/gopherjs/js)) provides functions for interacting with native JavaScript APIs. For example the line\n\n```js\ndocument.write(\"Hello world!\");\n```\n\nwould look like this in Go:\n\n```go\njs.Global.Get(\"document\").Call(\"write\", \"Hello world!\")\n```\n\nYou may also want use the [DOM bindings](http://dominik.honnef.co/go/js/dom), the [jQuery bindings](https://github.com/gopherjs/jquery) (see [TodoMVC Example](https://github.com/gopherjs/todomvc)) or the [AngularJS bindings](https://github.com/gopherjs/go-angularjs). Those are some of the [bindings to JavaScript APIs and libraries](https://github.com/gopherjs/gopherjs/wiki/bindings) by community members.\n\n#### Providing library functions for use in other JavaScript code\nSet a global variable to a map that contains the functions:\n\n```go\npackage main\n\nimport \"github.com/gopherjs/gopherjs/js\"\n\nfunc main() {\n\tjs.Global.Set(\"pet\", map[string]interface{}{\n\t\t\"New\": New,\n\t})\n}\n\ntype Pet struct {\n\tname string\n}\n\nfunc New(name string) *js.Object {\n\treturn js.MakeWrapper(\u0026Pet{name})\n}\n\nfunc (p *Pet) Name() string {\n\treturn p.name\n}\n\nfunc (p *Pet) SetName(name string) {\n\tp.name = name\n}\n```\n\nFor more details see [Jason Stone's blog post](http://legacytotheedge.blogspot.de/2014/03/gopherjs-go-to-javascript-transpiler.html) about GopherJS.\n\n### Architecture\n\n#### General\nGopherJS emulates a 32-bit environment. This means that `int`, `uint` and `uintptr` have a precision of 32 bits. However, the explicit 64-bit integer types `int64` and `uint64` are supported. The `GOARCH` value of GopherJS is \"js\". You may use it as a build constraint: `// +build js`.\n\n#### Goroutines\nGoroutines are fully supported by GopherJS. The only restriction is that you need to start a new goroutine if you want to use blocking code called from external JavaScript:\n\n```go\njs.Global.Get(\"myButton\").Call(\"addEventListener\", \"click\", func() {\n  go func() {\n    [...]\n    someBlockingFunction()\n    [...]\n  }()\n})\n```\n\nHow it works:\n\nJavaScript has no concept of concurrency (except web workers, but those are too strictly separated to be used for goroutines). Because of that, instructions in JavaScript are never blocking. A blocking call would effectively freeze the responsiveness of your web page, so calls with callback arguments are used instead.\n\nGopherJS does some heavy lifting to work around this restriction: Whenever an instruction is blocking (e.g. communicating with a channel that isn't ready), the whole stack will unwind (= all functions return) and the goroutine will be put to sleep. Then another goroutine which is ready to resume gets picked and its stack with all local variables will be restored. This is done by preserving each stack frame inside a closure.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflimzy%2Fgopherjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflimzy%2Fgopherjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflimzy%2Fgopherjs/lists"}