Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Langkah bayi dengan Go

Langkah bayi dengan Go

WBOY
WBOYasal
2024-08-05 19:28:13380semak imbas

Baby steps with Go

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.

Halangan pertama: import

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:

  • peringkat atas memerlukan go.mod yang mengisytiharkan nama modul modul
  • Saya kemudiannya boleh menetapkan direktori src/ di peringkat atas, dan src/main.go untuk meletakkan fungsi utama saya, dengan pengisytiharan utama pakej di bahagian atas
  • meletakkan kod dalam fail lain adalah mudah seperti mencipta fail seperti src/others.go dengan pengisytiharan utama pakej.
  • Semua fungsi dan pembolehubah tersedia terus dalam mana-mana fail lain pakej utama , tetapi fail tersebut perlu dinyatakan dengan jelas semasa dalam perjalanan membina panggilan FILES

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.

Melakukan tugas asas

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.

  • Pengendalian rentetan dilakukan melalui pakej rentetan
  • Pengendalian tatasusunan mempunyai beberapa fungsi asli, di mana corak_susun_dasar = append(susun_asas, item1, item2) - ia juga berfungsi untuk memanjangkan tatasusunan dengan nilai-nilai yang lain melalui tambahan(asas, tatasusunan lain...)
  • Pengendalian ralat dilakukan dengan menyalurkan objek ralat biasanya, tetapi tidak semestinya.
  • lib "log" wujud untuk log no-faffing prakonfigurasi yang berguna. Ia termasuk log.Panggilan maut(mesej) yang merekodkan ralat, serta segera keluar.
  • Memanggil subproses adalah mudah melalui pustaka "os/exec", menggunakan corak exec.Command(base, args...)

Dua tugasan yang lazim layak mendapat perenggan mereka sendiri.

Ralat pengendalian

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)

Penghuraian Hujah

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.

Tujuan dan kes penggunaan Go

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

  • mudah untuk bermula
  • binari tersusun, tiada pergantungan masa jalan
  • bahasa mudah dengan jenis ialah satu langkah daripada skrip shell
  • sokongan berbilang pemprosesan yang didakwa mudah

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn