Saya memutuskan untuk mencuba Go dalam perjalanan saya untuk memilih bahasa baharu yang berguna kepada kerjaya dan minat saya. Kali ini saya telah mencuba Go. Saya rasa apabila kesan pertama berlalu, ia cukup bagus.
Ini bukan lawatan berpandu, dan boleh dikatakan, tidak ditulis untuk orang lain selain diri saya, sebagai beberapa peringatan peribadi.
Saya memberi diri saya satu projek kecil untuk projek itu yang dipanggil Os-Release-Q . Hasrat saya adalah untuk dapat mempunyai binari pada mana-mana sistem yang saya uruskan, supaya saya boleh mencetak maklumat yang saya perlukan dengan tepat, tanpa perlu menghuraikan atau melihatnya.
Mencari di web banyak bercakap tentang mengimport pakej orang lain, tetapi sangat sedikit tentang mengatur kod sendiri. Malah dokumen memberi tumpuan kepada pergi dapatkan dan bukannya pemisahan kebimbangan.
Saya menghadapi sedikit halangan ini dalam setiap bahasa, kerana masing-masing mempunyai falsafah idiosinkratik sendiri tentang cara untuk mengatasinya, dan batasan yang ada atau dikenakan oleh masing-masing.
Daripada semua aktiviti yang saya lakukan dalam mempelajari asas-asas, datang daripada latar belakang yang kebanyakannya ular sawa, membahagikan kod saya kepada berbilang fail adalah perkara yang paling lama saya ambil untuk mendapatkan jawapan. Secara ringkasnya, saya dapati perkara berikut:
Untuk submodul tempatan, submodul mesti berada dalam folder. Ia boleh mengisytiharkan nama submodule pakej .
Katakan ia berada dalam src/submod/, dengan pelaksana utama dalam src/submod/submod.go. Dalam main.go kami mengimport "nama modul/src/submod" (dengan nama modul ditarik dari go.mod). Dan kemudian kita boleh memanggil submod.SomeFunction().
Kami ambil perhatian bahawa fungsi submodul hanya tersedia untuk pengimport jika nama mereka bermula dengan huruf besar. Jadi jangan lakukan submod.myFunction() - ia mestilah submod.MyFunction().
Pasti terdapat pertimbangan lain mengenai submodul dan import, tetapi setakat memastikan kod teratur dan diasingkan, ini adalah perkara yang penting.
Untuk memastikan keadaan waras, saya tergoda untuk hanya mempunyai satu fail yang mengisytiharkan pakej utama dan mengasingkan selebihnya ke dalam submodul - ini diimport secara automatik tanpa perlu diisytiharkan dalam senarai fail FILES go build.
Selepas saya menyelesaikan kekhususan Go ini, selebihnya jatuh ke tempat dengan mudah. Untuk setiap tugas asas sudah tentu terdapat entri StackOverflow, atau halaman GoByExample.com, dan lebih asas, rujukan bahasa Go.
Dua tugasan yang lazim layak mendapat perenggan mereka sendiri.
Pengendalian ralat asas sering diulas sebagai menyusahkan, benar-benar perlu menangani ralat di tengah-tengah aliran kawalan. Ini mungkin menjadi kutukan kepada pengaturcara yang datang daripada aliran kerja cuba/tangkap, tetapi mengendalikan isu pada titik di mana ia boleh berlaku tidaklah begitu teruk.
// explicit return item `err` forces us to be aware of it // but having the ability to check it in the same breath is not so bad if result, err := someCall(); err != nil { log.Fatal("Sorry.") } // Equally valid is /* result, err := someCall() if err != nil { log.Fatal("Sorry") } */ fmt.Println(result)
Bandingkan cara cuba/tangkap
try: result = someCall() print(result) except: print("Sorry") # a little divorced from potential origin of error sys.exit(1)
Saya tidak dapat tidak merasakan bahawa pelaksanaan perpustakaan bendera agak masak. Jelas sekali orang sudah terbiasa dan OK dengannya, memandangkan kelangsungan hidup dalam bentuk semasa.
Panggilan program -flag arg1 arg2 memberikan kita togol yang bendera ditetapkan untuk dilakukan, dan positionals := flags.Args() mengembalikan kepada kita tatasusunan ["arg1", "arg2"]
Walau bagaimanapun memanggil program arg1 arg2 -flag tidak bukan togol apa sahaja -flags sepatutnya lakukan, dan sebaliknya memberikan adalah positionals sebagai ["arg1", "arg2", "-flag"] di mana bendera tidak dihuraikan.
Ini mungkin berguna untuk menghantar dalam sub-panggilan seperti program colorize ls -l di mana ls -l diturunkan secara literal - supaya saya dapat melihat kes penggunaan.
Cuma kebanyakan program di luar sana membenarkan hujah bendera di mana-mana sahaja di sekitar item kedudukan. ls dir1/ -l dir2/ adalah sama dengan ls -l dir1/ dir2/, dan ini ialah konvensyen yang berpegang pada sebahagian besar perintah Unix dan Linux.
Mungkin ini adalah sesuatu yang perlu dibiasakan - dan patut dipanggil.
Paradigma import fail diketepikan, saya mendapati ia agak mudah untuk melaksanakan aplikasi asas saya. Sebarang kesalahan yang saya lakukan terasa agak jelas dan kesilapan itu bermakna. Rasanya saya hanya boleh fokus pada "menyiapkan sesuatu."
Daripada jumlah penggunaan saya yang sangat sedikit setakat ini, dan mengambil kira keperluan khusus saya, saya dapat melihat
Saya fikir mempunyai jenis jarang dan bukannya objek dan warisan akan menjadi penghalang, tetapi setakat ini baik. Saya bertahan tanpa mereka dalam bahasa lain, jadi saya rasa apabila saya dapat mentakrifkan antara muka dan jenis, ia akan berasa seperti satu langkah daripada Lua dan bash. Saya harap.
Salah satu sebab saya ingin meneroka bahasa tersusun kepada bahasa asli adalah untuk dapat menghasilkan perduaan yang boleh dielakkan dengan mudah, tanpa perlu bergantung pada versi tertentu masa jalan yang hadir.
Seorang rakan sekerja baru-baru ini berjalan ke meja saya dengan kecewa, cuba menyelesaikan mendapatkan Java 17 ke imej asas Node lama yang berdasarkan Debian 10 . Sama ada dia perlu menaik taraf versi Node untuk mendapatkan imej asas yang lebih baharu, menggunakan imej asas Debian baharu dan memasang serta mengkonfigurasi Node secara manual, atau menjelajah internet untuk mendapatkan repo tersuai yang dihoskan oleh goodness-knows-who for a goodness-knows -jika-digodam Java 17 yang akan dijalankan pada Debian 10.
Alangkah lebih mudah jika perisian yang digunakan tidak mempunyai kebergantungan masa jalan yang bercanggah...
Dari sudut pandangan ops, satu keuntungan besar yang saya rasa akan saya rasai ialah: Saya boleh menulis kod dengan mudah, dan membina binari ELF untuk kemudian digunakan pada "sistem X sewenang-wenangnya" dan tidak perlu bersaing dengan memastikan versi masa jalan yang betul disediakan dan menguruskan kebergantungan yang bercanggah.
Saya pasti ada faedah lain, dan saya telah mendengar banyak perkara yang diperkatakan tentang kemudahan penggunaan multithreading dan multiprocessing dalam Go, dan saya berhasrat untuk menyiapkan projek mini untuk meneroka perkara itu sebagai langkah seterusnya - mungkin sesuatu yang mungkin mendengar input pada berbilang saluran, dan melaksanakan beberapa tugas asas sebagai tindak balas. Saya mempunyai kes penggunaan untuk itu dalam beberapa tugasan automasi ujian yang pernah saya lakukan sebelum ini, jadi ia tidak asing bagi saya pada ketika ini.
Atas ialah kandungan terperinci Langkah bayi dengan Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!