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 versiondan 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, pkgdan srcfolder. 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 ~/workdan menetapkan GOPATHpemboleh 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/bindirektori ke jalan saya, untuk kemudahan menjalankan program Go dari mana-mana direktori:

eksport GOPATH = $ RUMAH / tempat kerja

eksport PATH = $ PATH: $ (pergi env GOPATH) / tong sampah

Utiliti bahasa Go akan dipasang GOPATHsecara lalai, jadi meletakkan GOPATH/bindirektori 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, GOPATHlalai ke $HOME/goUnix dan MacOS dan %USERPROFILE%/goWindows.

Pergi bahasa Go, editor, dan IDE

Beberapa utiliti Go dipasang sebagai sebahagian daripada pakej dengan penyusunnya. Yang lain boleh dipasang dengan go getarahan. 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 gofmtarahan 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 Printfpanggilan 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 toolsubkomando. Pada pemasangan saya, go toolkembalikan senarai alat yang diketahui berikut:

alat $ go

addr2line

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 GOPATHsudah 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 --installjuga 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 randfungsi?

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 dieksport

prog.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 forgelung 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 switchdan deferpernyataan 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 packagepernyataan untuk program semasa, dan dengan importpernyataan untuk pakej luaran yang digunakan. Dalam program sederhana ini, mainadalah paket program itu sendiri, dan mengimport fmtsehingga dapat dicetak, dan math/ randsehingga dapat menghasilkan angka rawak.

Pelbagai kaedah randbergantung pada waktu jam untuk menghasilkan nombor secara rawak, tetapi waktunya tetap di gotourpersekitaran. 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 gotourpersekitaran, 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.Piadalah 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 0atau false. Dalam C / C ++, penyusun menandakan pemboleh ubah yang belum dimulakan.

Jawapan 5.k adalah bilangan bulat, kerana diinisialisasi menjadi 3.