Gopherjs編譯GO代碼(GO.DEV)到純JavaScript代碼。其主要目的是讓您有機會在GO中編寫前端代碼,該代碼仍將在所有瀏覽器中運行。
syscall/js軟件包實現與上游GO 1.16兼容。在Gopherjs遊樂場上嘗試Gopherjs。
幾乎所有內容,包括Goroutines(兼容性文檔)。在大多數情況下,性能非常好,請參見HTML5遊戲引擎基準測試。不支持CGO。
Gopherjs需要1.19或更新。如果您需要較舊的GO版本,則可以使用舊的Gopherjs版本。
使用go install安裝Gopherjs:
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
如果go version報告的本地GO分發比GO 1.19更新,則需要將GOPHERJS_GOROOT環境變量設置為包含GO 1.19分發的目錄。例如:
go install golang.org/dl/go1.19.13@latest
go1.19.13 download
export GOPHERJS_GOROOT="$(go1.19.13 env GOROOT)" # Also add this line to your .profile or equivalent.
現在,您可以使用gopherjs build [package] , gopherjs build [files]或gopherjs install [package] ,其行為與go工具相似。對於main軟件包,這些命令在當前目錄或$GOPATH/bin中創建.js文件和.js.map源地圖。生成的JavaScript文件可以像往常一樣在網站中使用。使用gopherjs help [command]獲取可能的命令行標誌列表,例如用於縮小並自動觀察更改。
gopherjs生成代碼時使用平台的默認GOOS值。支持的GOOS值為: linux , darwin 。如果您在另一個平台上(例如,Windows或FreeBSD),則需要將GOOS環境變量設置為受支持的值。例如, GOOS=linux gopherjs build [package] 。
注意:Gopherjs將嘗試將核心軟件包的編譯對象文件寫入您的$ Goroot/PKG目錄。如果失敗了,它將返回到$ gopath/pkg。
如果要使用gopherjs run或gopherjs test在本地運行生成的代碼,請安裝node.js 18(或較新)。
在支持的GOOS平台上,可以提供系統調用(文件系統訪問等)。有關如何執行的說明,請參見Doc/syscalls.md。
gopherjs serve是您可以在開發過程中使用的有用命令。默認情況下,它將啟動在“:8080”上使用的HTTP服務器,然後用Gopherjs動態編譯您的GO軟件包並提供它們。
例如,導航到http://localhost:8080/example.com/user/project/應該編譯並運行GO Package example.com/user/project 。生成的JavaScript輸出將在http://localhost:8080/example.com/user/project/project.js (.js文件名等於基本目錄名稱)。如果該目錄包含index.html ,則將提供最小的index.html ,其中包括<script src="project.js"></script> ,導致執行JavaScript。所有其他靜態文件也將提供。
如果需要,在瀏覽器中刷新會重建服務文件。彙編錯誤將以終端和瀏覽器控制台顯示。此外,它將用於$ goroot和$ gopath的源。
如果您包括一個論點,那將是一切都提供的根源。例如,如果您運行gopherjs serve github.com/user/project則將在http:// localhost:8080/mypkg/mypkg.js提供github.com/user/project/mypkg的生成的JavaScript。
有一些Gopherjs特定的環境變量:
GOPHERJS_GOROOT如果設置,gopherjs使用此值作為默認的goroot值,而不是將系統goroot用作默認的goroot值GOPHERJS_SKIP_VERSION_CHECK如果設置為true,gopherjs將不會在Goroot中檢查GO版本是否與Gopherjs版本的兼容。這主要對於針對未發行版本的GO測試Gopherjs很有用。-m命令行標誌生成縮小代碼。int代替(u)int8/16/32/64 。float64而不是float32 。軟件包github.com/gopherjs/gopherjs/js (請參閱文檔)提供了與本機JavaScript API進行交互的功能。例如行
document . write ( "Hello world!" ) ;在Go中看起來像這樣:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )您可能還需要使用DOM綁定,jQuery綁定(請參見TODOMVC示例)或AngularJS綁定。這些是社區成員與JavaScript API和圖書館的一些綁定。
將一個全局變量設置為包含函數的地圖:
package main
import "github.com/gopherjs/gopherjs/js"
func main () {
js . Global . Set ( "pet" , map [ string ] interface {}{
"New" : New ,
})
}
type Pet struct {
name string
}
func New ( name string ) * js. Object {
return js . MakeWrapper ( & Pet { name })
}
func ( p * Pet ) Name () string {
return p . name
}
func ( p * Pet ) SetName ( name string ) {
p . name = name
}有關更多詳細信息,請參見Jason Stone的有關Gopherjs的博客文章。
Gopherjs模擬了32位環境。這意味著int , uint和uintptr的精度為32位。但是,支持顯式64位整數int64和uint64 。
該環境的GOOS值是js , GOARCH是ecmascript 。在編寫特定於平台的代碼時,您可以在構建約束中使用這些值。 (gopherjs 1.17及以上的舊版本使用js作為GOARCH 。)
所有init功能運行後, main函數都像往常一樣執行。 JavaScript回調也可以調用GO功能,即使已退出了main函數。因此, main函數的結束不應被視為應用程序的末尾,也不應結束其他goroutines的執行。
在瀏覽器中,調用os.Exit (例如,通過log.Fatal間接使用)也不會終止程序的執行。為了方便起見,它調用runtime.Goexit立即終止調用Goroutine。
Gopherjs完全支持Goroutines。唯一的限制是,如果要使用來自外部JavaScript的封鎖代碼,則需要啟動新的Goroutine:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})它的工作原理:
JavaScript沒有並發概念(除Web工作人員外,但是這些概念是嚴格分開的,無法用於Goroutines)。因此,JavaScript中的說明永遠不會阻止。阻止調用將有效地凍結網頁的響應能力,因此使用回調參數的呼叫。
Gopherjs做一些繁重的工作來解決此限制:每當指令阻止(例如與未準備好的通道進行通信)時,整個堆棧將放鬆(=所有功能返回),並且Goroutine將入睡。然後,另一條準備恢復的goroutine將被恢復,其所有本地變量的堆棧將被恢復。
如果您想更改GoPherjs編譯器,請參閱開發人員指南,以獲取其他開發人員信息。