Gopherjs mengkompilasi kode go (go.dev) ke kode javascript murni. Tujuan utamanya adalah untuk memberi Anda kesempatan untuk menulis kode front-end di Go yang masih akan berjalan di semua browser.
syscall/js lengkap yang kompatibel dengan Hulu GO 1.16.Cobalah gopherjs di taman bermain gopherjs.
Hampir semuanya, termasuk goroutine (dokumentasi kompatibilitas). Kinerja cukup bagus dalam banyak kasus, lihat HTML5 Game Engine Benchmark. CGO tidak didukung.
Gopherjs membutuhkan go 1.19 atau lebih baru. Jika Anda memerlukan versi GO yang lebih lama, Anda dapat menggunakan rilis Gopherjs yang lebih lama.
Instal gopherjs dengan go install :
go install github.com/gopherjs/[email protected] # Or replace 'v1.19.0-beta1' with another version.
Jika distribusi GO lokal Anda seperti yang dilaporkan oleh go version lebih baru dari GO 1.19, maka Anda perlu mengatur variabel lingkungan GOPHERJS_GOROOT ke direktori yang berisi distribusi GO 1.19. Misalnya:
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.
Sekarang Anda dapat menggunakan gopherjs build [package] , gopherjs build [files] atau gopherjs install [package] yang berperilaku mirip dengan alat go . Untuk paket main , perintah ini membuat file .js dan peta sumber .js.map di direktori saat ini atau di $GOPATH/bin . File JavaScript yang dihasilkan dapat digunakan seperti biasa di situs web. Gunakan gopherjs help [command] untuk mendapatkan daftar bendera baris perintah yang mungkin, misalnya untuk minifikasi dan secara otomatis menonton perubahan.
gopherjs menggunakan nilai GOOS default platform Anda saat menghasilkan kode. Nilai GOOS yang didukung adalah: linux , darwin . Jika Anda berada di platform yang berbeda (misalnya, Windows atau FreeBSD), Anda harus mengatur variabel lingkungan GOOS ke nilai yang didukung. Misalnya, GOOS=linux gopherjs build [package] .
Catatan: Gopherjs akan mencoba menulis file objek yang dikompilasi dari paket inti ke direktori $ goroot/pkg Anda. Jika itu gagal, itu akan kembali ke $ gopath/pkg.
Jika Anda ingin menggunakan gopherjs test gopherjs run atau Gopherjs untuk menjalankan kode yang dihasilkan secara lokal, instal node.js 18 (atau lebih baru).
Pada platform GOOS yang didukung, dimungkinkan untuk membuat panggilan sistem (akses sistem file, dll.) Tersedia. Lihat DOC/SYSCALL.MD untuk instruksi tentang cara melakukannya.
gopherjs serve adalah perintah yang berguna yang dapat Anda gunakan selama pengembangan. Ini akan memulai server HTTP yang melayani ": 8080" secara default, kemudian secara dinamis mengkompilasi paket GO Anda dengan gopherjs dan melayani mereka.
Misalnya, menavigasi ke http://localhost:8080/example.com/user/project/ harus mengkompilasi dan menjalankan paket go example.com/user/project . Output JavaScript yang dihasilkan akan dilayani di http://localhost:8080/example.com/user/project/project.js (nama file .js akan sama dengan nama direktori dasar). Jika direktori berisi index.html itu akan dilayani, jika tidak, indeks index.html yang mencakup <script src="project.js"></script> akan disediakan, menyebabkan JavaScript dieksekusi. Semua file statis lainnya juga akan disajikan.
Menyegarkan di browser akan membangun kembali file yang dilayani jika diperlukan. Kesalahan kompilasi akan ditampilkan di terminal, dan di konsol browser. Selain itu, ini akan melayani $ goroot dan $ gopath untuk Sourcemaps.
Jika Anda memasukkan argumen, itu akan menjadi akar dari mana semuanya disajikan. Misalnya, jika Anda menjalankan gopherjs serve github.com/user/project maka javascript yang dihasilkan untuk paket github.com/user/project/mypkg akan disajikan di http: // localhost: 8080/mypkg/mypkg.js.
Ada beberapa variabel lingkungan khusus gopherjs:
GOPHERJS_GOROOT - jika diatur, gopherjs menggunakan nilai ini sebagai nilai goroot default, alih -alih menggunakan sistem goroot sebagai nilai goroot defaultGOPHERJS_SKIP_VERSION_CHECK - Jika diatur ke true, gopherjs tidak akan memeriksa versi go di goroot untuk kompatibilitas dengan rilis gopherjs. Ini terutama berguna untuk menguji gopherjs terhadap versi GO yang belum dirilis.-m untuk menghasilkan kode yang lebih tinggi.int alih -alih (u)int8/16/32/64 .float64 bukan float32 . Paket github.com/gopherjs/gopherjs/js (lihat dokumentasi) menyediakan fungsi untuk berinteraksi dengan API JavaScript asli. Misalnya baris
document . write ( "Hello world!" ) ;akan terlihat seperti ini di Go:
js . Global . Get ( "document" ). Call ( "write" , "Hello world!" )Anda mungkin juga ingin menggunakan binding DOM, binding jQuery (lihat contoh TODOMVC) atau binding AngularJS. Itu adalah beberapa binding ke JavaScript API dan perpustakaan oleh anggota masyarakat.
Tetapkan variabel global ke peta yang berisi fungsi:
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
}Untuk detail lebih lanjut, lihat posting blog Jason Stone tentang gopherjs.
Gopherjs meniru lingkungan 32-bit. Ini berarti bahwa int , uint dan uintptr memiliki ketepatan 32 bit. Namun, tipe integer 64-bit eksplisit int64 dan uint64 didukung.
Nilai GOOS dari lingkungan ini adalah js , dan nilai GOARCH adalah ecmascript . Anda dapat menggunakan nilai-nilai ini dalam kendala build saat menulis kode khusus platform. (Gopherjs 1.17 dan lebih lama menggunakan js sebagai nilai GOARCH .)
Fungsi main dieksekusi seperti biasa setelah semua fungsi init telah berjalan. Callback JavaScript juga dapat memohon fungsi GO, bahkan setelah fungsi main keluar. Oleh karena itu akhir fungsi main tidak boleh dianggap sebagai akhir dari aplikasi dan tidak mengakhiri pelaksanaan goroutine lainnya.
Di browser, memanggil os.Exit (misalnya secara tidak langsung oleh log.Fatal ) juga tidak menghentikan pelaksanaan program. Untuk kenyamanan, itu memanggil runtime.Goexit untuk segera mengakhiri goroutine panggilan.
Goroutine sepenuhnya didukung oleh gopherjs. Satu -satunya batasan adalah bahwa Anda perlu memulai goroutine baru jika Anda ingin menggunakan kode pemblokiran yang dipanggil dari javascript eksternal:
js . Global . Get ( "myButton" ). Call ( "addEventListener" , "click" , func () {
go func () {
[ ... ]
someBlockingFunction ()
[ ... ]
}()
})Cara kerjanya:
JavaScript tidak memiliki konsep konkurensi (kecuali pekerja web, tetapi mereka terlalu terpisah untuk digunakan untuk goroutine). Karena itu, instruksi dalam JavaScript tidak pernah memblokir. Panggilan pemblokiran akan secara efektif membekukan respons halaman web Anda, jadi panggilan dengan argumen callback digunakan sebagai gantinya.
Gopherjs melakukan beberapa pengangkatan berat untuk mengatasi pembatasan ini: Setiap kali instruksi memblokir (misalnya berkomunikasi dengan saluran yang belum siap), seluruh tumpukan akan melepas (= semua fungsi kembali) dan goroutine akan ditidurkan. Kemudian goroutine lain yang siap dilanjutkan dipilih dan tumpukannya dengan semua variabel lokal akan dipulihkan.
Jika Anda ingin membuat perubahan pada kompiler gopherjs, lihat pedoman pengembang untuk informasi pengembang tambahan.