Tutorial Go: Mulakan dengan Google Go
Mengapa anda mahu menggunakan bahasa Go? Pada dasarnya, ia adalah bahasa yang ringkas, ringkas, selamat, dan disusun pantas dengan ciri-ciri serentak yang indah, dan dengan mudah mengendalikan projek besar. Ini juga sumber terbuka percuma, walaupun pada asalnya dikembangkan di Google.
Menurut Rob Pike, salah satu perancang bahasa, "tujuan proyek Go adalah untuk menghilangkan kelambatan dan kekokohan pengembangan perisian di Google, dan dengan demikian membuat proses lebih produktif dan terukur. Bahasa itu dirancang oleh dan untuk orang-orang yang menulis - dan membaca dan membuat debug dan menyelenggara - sistem perisian yang besar. "
Sesuai dengan tujuan tersebut, Go tidak mempunyai banyak ciri dari beberapa bahasa lain yang menonjol — dan itu sebenarnya kekuatan. Go tidak berorientasikan objek, ia tidak mempunyai fail header atau deklarasi ke depan, ia tidak mempunyai hierarki jenis, ia tidak mempunyai kaedah atau kelebihan operator, ia tidak mempunyai generik, ia tidak mempunyai mesin maya untuk runtime, ia tidak mempunyai pengecualian, dan tidak mempunyai penegasan.
Sebaliknya, apa yang Go berfungsi dengan baik. Ia dapat menyusun program besar dalam beberapa saat. Ia mempunyai coroutine overhead rendah (disebut goroutine ) yang dapat berkomunikasi dengan cekap melalui saluran . Ia mempunyai komposisi antara muka dan antara muka. Di samping itu, Go menyokong fungsi kelas pertama, fungsi pesanan tinggi, jenis fungsi yang ditentukan pengguna, literal fungsi, penutupan, dan nilai pulangan berganda-dengan kata lain, ia menyokong gaya pengaturcaraan fungsional dalam bahasa yang sangat ditaip.
Sekiranya anda ingin meminta salah satu ciri yang hilang yang saya nyatakan di atas, anda mungkin ingin membaca perbincangan mengenai perubahan bahasa dalam bahasa Go FAQ: Jawapannya biasanya "Tidak, kerana ..." Secara umum, program Go terbaik adalah direka dari awal untuk menggunakan ciri bahasa Go, dan bukannya diterjemahkan secara harfiah dari bahasa lain yang menggunakan abstraksi yang berbeza.
Pasang Go
Arahan ringkas untuk memasang Go muncul di repositori sumber. Anda boleh memuat turun siaran binari Go untuk Windows, MacOS, dan Linux atau memasang Go dari sumber. Anda akan mendapat arahan untuk memasang sumber Go dari GitHub.
Sekiranya anda sudah memasang Go, anda harus memeriksa versi binaan semasa di bahagian bawah //golang.org/ dan kemudian periksa versi terpasang anda dari baris arahan:
versi $ go
Sekiranya pemasangan anda sudah usang, muat turun dan pasang versi semasa. Mulakan semula mana-mana arahan arahan terbuka (Windows) atau terminal. Jalankan semula go version
dan pastikan bahawa versi adalah yang anda harapkan; jika tidak, mungkin ada versi Go yang lebih lama yang dipasang di tempat lain yang perlu dikeluarkan.
(Tidak, saya tidak paranoid. Saya berjaya memasuki situasi yang saya jelaskan dengan menggunakan Homebrew untuk memasang satu versi dan pakej MacOS standard untuk memasang versi berikutnya sebulan atau lebih. Mereka memasang ke lokasi yang berlainan di $PATH
. Setelah mengetahui apa yang telah berlaku, saya dapat menyahpasang versi lama dengan Homebrew.)
Pilihan pemasangan lain, jika anda mahukan sokongan dan ganti rugi dan anda mampu membayar, adalah menggunakan ActiveGo.
Setelah anda memasang pengompil dan alat Go, anda harus menjalani latihan menyusun dan menjalankan program Go, seperti yang dijelaskan dalam bahagian "Uji pemasangan anda" pada halaman pemasangan.
Siapkan persekitaran Go anda
Pergi pengaturcara biasanya menyimpan semua kod mereka dalam satu ruang kerja, dengan bin
, pkg
dan src
folder. Di dalam setiap folder, projek biasanya mempunyai jalan yang berkaitan dengan repositori Git, seperti GitHub atau GitLab. Sebagai contoh, saya menyimpan semua kod bahasa Go saya ~/work
dan menetapkan GOPATH
pemboleh ubah persekitaran saya ke $HOME/work
. Laluan ke folder kod sumber "hello.go" saya adalah $GOPATH/src/github.com/meheller/hello
.
Saya juga menambah GOPATH/bin
direktori ke jalan saya, untuk kemudahan menjalankan program Go dari mana-mana direktori:
eksport GOPATH = $ RUMAH / tempat kerjaeksport PATH = $ PATH: $ (pergi env GOPATH) / tong sampah
Utiliti bahasa Go akan dipasang GOPATH
secara lalai, jadi meletakkan GOPATH/bin
direktori di jalan juga memudahkan anda dan editor dan IDE yang sedar akan mencarinya. Anda boleh memasang sebahagian besar utiliti dengan $go get
setelah anda mengetahui mana yang anda perlukan dan laluan repositorinya. Repositori biasanya mudah dicari dengan carian Google. Dalam beberapa kes, pemalam editor untuk Go akan memasang utiliti (contohnya gocode
) secara automatik.
Sekiranya anda tidak menetapkannya sendiri, GOPATH
lalai ke $HOME/go
Unix dan MacOS dan %USERPROFILE%/go
Windows.
Pergi bahasa Go, editor, dan IDE
Beberapa utiliti Go dipasang sebagai sebahagian daripada pakej dengan penyusunnya. Yang lain boleh dipasang dengan go get
arahan. Utiliti baris arahan Go yang paling banyak digunakan disenaraikan di bawah.
Nama | Sinopsis |
---|---|
go |
Menguruskan kod sumber Go dan menjalankan perintah lain yang disenaraikan di sini. |
cgo |
Membolehkan pembuatan pakej Go yang memanggil kod C. |
cover |
Program untuk membuat dan menganalisis profil liputan yang dihasilkan oleh go test -coverprofile . |
fix |
Program Finds Go yang menggunakan ciri lama bahasa dan perpustakaan dan menulisnya semula untuk menggunakan yang lebih baru. |
fmt |
Pakej Formats Go. Juga tersedia sebagai gofmt arahan bebas dengan pilihan yang lebih umum. |
godoc |
Mengekstrak dan menghasilkan dokumentasi untuk pakej Go. |
vet |
Memeriksa kod sumber Go dan melaporkan konstruk yang mencurigakan, seperti Printf panggilan yang argumennya tidak sesuai dengan rentetan format. |
Cara biasa memanggil sebahagian besar perintah ini adalah sebagai subkomando go
, misalnya go fmt
. Yang lain perlu dipanggil melalui go tool
subkomando. Pada pemasangan saya, go tool
kembalikan senarai alat yang diketahui berikut:
alat $ goaddr2line
asm
binaan
cgo
menyusun
penutup
jarak
dokumen
menetapkan
pautan
nm
objdump
pek
pprof
test2json
lawatan
jejak
doktor haiwan
Alat-alat ini didokumentasikan sebagai sebahagian daripada senarai lengkap perintah Go. Ngomong-ngomong, pastikan alat anda GOPATH
sudah siap sebelum menambahkan alat Go, atau plugin editor Go yang menggunakan alat Go.
Repositori Go tidak mempunyai sokongan editor atau IDE sejak versi 1.4, tetapi ada banyak yang mengetahui tentang Go, baik di luar kotak atau dengan modul tambahan. Saya membincangkan banyak perkara dalam artikel 2017; ada juga senarai tidak rasmi yang dikendalikan oleh masyarakat Golang.

IDE bahasa Go kegemaran saya adalah GoLand (ditunjukkan di atas; dinamakan semula dari Gogland sejak saya menulis artikel pada tahun 2017) dan Komodo. Kedua-duanya adalah produk berbayar dengan percubaan percuma.
Anda mahu memasang debugging Delve for Go. Di MacOS, anda mungkin juga perlu menambahkan utiliti baris perintah ke Xcode, dan mungkin menambahkan pautan lembut ke debugserver
, seperti yang dijelaskan dalam komen 5 Jun dalam senarai masalah Delve. Berlari xcode-select --install
juga akan menyelesaikan masalah mengenai mencari debugserver
, walaupun secara kasar.
Editor Go-sedar kegemaran saya dengan GUI adalah Atom dan Visual Studio Code; kedua-duanya percuma. Sekiranya anda memilih Atom, pertimbangkan untuk menambahkan pakej go-plus dan go-debug; jika anda memilih Visual Studio Code, pertimbangkan untuk menambahkan vscode-go.
Sekiranya anda pengguna Vim atau Emacs yang tegar, tentu saja tetap dengan apa yang anda tahu — bukan kerana saya boleh mengeluarkan editor anda dari tangan anda yang sejuk dan mati. Vim-go menambah sokongan bahasa Go untuk Vim, dan mode go menambahkan sokongan bahasa Go untuk Emacs.
Jelajah Pergi
Anda boleh belajar dengan banyak melalui “A Tour of Go,” sama ada dalam talian atau luar talian. Dengan mengandaikan bahawa anda telah menyelesaikan pemasangan tempatan penyusun dan alat Go, anda boleh memasang lawatan untuk dijalankan secara tempatan dengan menjalankan dua arahan berikut:
$ pergi dapatkan golang.org/x/tour/gotour$ gotour
Baris kedua harus memulakan pelayan web dan membuka tetingkap penyemak imbas. Ini akan kelihatan seperti lawatan dalam talian, tetapi mungkin berjalan lebih cepat kerana ia membina dan menjalankan sampel kod pada mesin anda sendiri. Tekan Ctrl-C di tetingkap arahan untuk menghentikan pelayan apabila anda selesai.
Lawatan ini terbahagi kepada tiga bahagian. Saya mahu anda menjalani keseluruhan lawatan, termasuk kuiz, tetapi saya akan meringkaskan setiap bahagian di bawah ini sebagai gambaran keseluruhan, dan menanyakan beberapa soalan kepada anda. Saya memberikan jawapan kepada soalan saya di akhir artikel (tidak mengintip!).
Dasar bahasa Go

Pelajaran Asas Go 1

Soalan 1. Dalam contoh ini, terdapat tiga bungkusan. Apa itu, dan bagaimana mereka digunakan? Mengapa program selalu mengembalikan nombor yang sama walaupun ada rand
fungsi?
Perhatikan bahawa saya belum memanggil Pelajaran 2. Jangan melangkau pelajaran hanya kerana saya belum mengomentari mereka.
Pelajaran Asas Go 3

Sekiranya anda menjalankan contoh ini, anda akan melihat mesej ralat:
prog.go: 9: 14: tidak boleh merujuk kepada nama math.pi yang tidak dieksportprog.go: 9: 14: tidak ditentukan: math.pi
Soalan 2. Mengapa kesalahan? Bagaimana anda boleh membetulkan program ini?
Pelajaran Asas Go 4

Soalan 3. Bandingkan pernyataan ini dengan yang setara di C. Apa yang berbeza?
Pelajaran Asas Go 8

Soalan 4. Mengapa program ini tidak menimbulkan kesalahan?
Pelajaran Asas Go 10

Soalan 5. Apakah jenisnya k
? Kenapa? Sekiranya jenisnya tidak jelas, lihat Pelajaran 11 untuk mengetahui cara memaparkannya.
Pelajaran Asas Go 12

Pelajaran ini menjawab soalan yang saya ajukan dalam Pelajaran 8.
Pelajaran Kawalan Aliran Go 1

Soalan 6. Bagaimana ini berbeza dengan for
gelung dalam bahasa kegemaran anda? Adakah anda fikir konstruksi gelung lain dalam bahasa kegemaran anda perlu? Adakah maklumat tambahan dalam tiga pelajaran seterusnya mengubah fikiran anda?
Pelajaran Kawalan Aliran Go 7

Sebelum menjalankan program ini, periksa meja dan tuliskan apa yang anda fikir akan dicetak. Jalankan program. Adakah anda betul? Sekiranya tidak, apa yang anda tidak faham?
Pelajaran Kawalan Aliran Go 8

Ini adalah jenis latihan yang mungkin anda lakukan pada awal wawancara papan putih. Luangkan masa anda semasa anda menyelesaikannya. Katakan apa yang anda fikirkan semasa anda mengatasi masalah tersebut.
Soalan 7. Bahagian kawalan aliran yang selebihnya penting untuk difahami. Setelah melalui pelajaran 9 hingga 13, jelaskan Pernyataan switch
dan defer
pernyataan dengan cara yang dapat dilakukan oleh pengaturcara C, Java, atau JavaScript.
Pergi Lebih Banyak Jenis Pelajaran 1

Sebelum menjalankan program ini, periksa meja dan tuliskan apa yang anda fikir akan dicetak. Jalankan program. Adakah anda betul? Sekiranya tidak, apa yang anda tidak faham?
Bagaimana perasaan anda tentang Go yang mempunyai pointer tetapi bukan aritmetik penunjuk?
Selidiki bahagian Lebih Banyak Jenis sehingga anda dapat melakukan latihan dalam Pelajaran 18. Soalan 8. Apa yang anda pelajari mengenai susunan dan potongan Go? Sekarang selesaikan latihan.
Teruskan menjalani latihan dalam Pelajaran 23.
Soalan 9. Terangkan Tujuan map
. Mengapa anda mahu menggunakannya?
Selesaikan bahagian Lebih Banyak Jenis.
Soalan 10. Bolehkah Go digunakan sebagai bahasa pengaturcaraan yang berfungsi, walaupun telah disusun? Kapan dan mengapa anda menggunakan penutup?
Kaedah dan antara muka

Lakukan semua 25 pelajaran di bahagian ini bermula dengan //tour.golang.org/methods/1.
Soalan 11. Setelah selesai, terangkan bagaimana penggunaan kaedah dan antara muka Go berbeza dengan kelas C ++. Mana yang lebih anda sukai? Kenapa?
Pergi bersamaan

Goroutine adalah salah satu ciri utama Go for concurrency. Pada pelajaran pertama di bahagian serentak, cuba periksa program (di bawah) dan tuliskan apa yang anda fikir akan dicetak.

Jalankan program. Adakah anda betul? Terangkan apa yang sebenarnya berlaku, dan mengapa.
Saluran adalah cara untuk menyegerakkan goroutine secara implisit. Dalam pelajaran seterusnya (di bawah), cuba sekali lagi periksa program sebelum menjalankannya.

Soalan 12. Mengapa hanya ada satu saluran dalam contoh ini, walaupun terdapat dua panggilan goroutine?
Pernyataan pilih membolehkan goroutine menunggu beberapa operasi komunikasi. Apakah urutan penyataan yang dijalankan dalam program di bawah ini?

Latihan pada pokok binari yang setara adalah perkara lain yang mungkin anda hadapi dalam temu ramah papan tulis. Luangkan masa anda dan terangkan pemikiran anda semasa anda melaksanakan penyelesaian. Begitu juga, lakukan latihan untuk menggunakan web crawler seolah-olah anda sedang dalam temu ramah.
Jawapan untuk soalan Go
Jawapan 1. Pakej ditentukan oleh package
pernyataan untuk program semasa, dan dengan import
pernyataan untuk pakej luaran yang digunakan. Dalam program sederhana ini, main
adalah paket program itu sendiri, dan mengimport fmt
sehingga dapat dicetak, dan math
/ rand
sehingga dapat menghasilkan angka rawak.
Pelbagai kaedah rand
bergantung pada waktu jam untuk menghasilkan nombor secara rawak, tetapi waktunya tetap di gotour
persekitaran. Sebagai latihan susulan, cari pakej dan kaedah yang melaporkan waktu (petunjuk: lihat di sini jika anda terjebak), dan gunakan untuk mencetak waktu semasa. Jalankan ini berkali-kali di gotour
persekitaran, dan juga buat program secara tempatan dan jalankannya berkali-kali di mesin anda sendiri.
Jawapan 2. Eksport di Go mesti selalu ditulis dengan huruf besar, dan bahasanya peka huruf besar kecil. math.Pi
adalah kaedah yang betul.
Jawapan 3. Dalam pernyataan pemboleh ubah C / C ++ ikuti bentuknya (contohnya
int i, j, k;
), sedangkan di Go jenisnya mengikut nama pemboleh ubah dan boleh dihilangkan selagi jenis itu dapat disimpulkan. Dalam C / C ++ jenis pengembalian mendahului nama fungsi, sedangkan di Go muncul setelah senarai parameter fungsi dan sebelum badan fungsi. Dalam C / C ++, titik koma di belakang adalah wajib.
Jawapan 4. Tidak membuang kesalahan kerana pemboleh ubah Go yang tidak ditetapkan diinisialisasi ke nilai sifar jenis, misalnya 0
atau false
. Dalam C / C ++, penyusun menandakan pemboleh ubah yang belum dimulakan.
Jawapan 5.k
adalah bilangan bulat, kerana diinisialisasi menjadi 3
.