Apakah pendekatan anda apabila anda perlu mempelajari sesuatu yang baharu? Saya mempunyai yang sangat spesifik dan sekali lagi saya mengujinya semasa belajar Golang!
Terlalu banyak kandungan untuk dibincangkan, tetapi matlamat saya di sini adalah untuk menyenaraikan perkara yang saya dapati berguna dan saya secara khusus meluangkan masa untuk belajar dengan betul.
Sejak 2 minggu lepas saya telah belajar dan membina aplikasi kecil dengan Golang. Pada masa ini hampir 50j kod melalui banyak strim langsung dan agak mengagumkan untuk mempelajari sesuatu yang sebelum ini saya mempunyai beberapa isu kecil dengan bahasa.
Dalam perjalanan dua minggu ini saya telah mencipta:
Dan semua ini kerana bos saya meminta saya, sekali lagi, untuk mempelajari teknologi baharu untuk mengusahakan beberapa ScyllaDB PoC dan demo... Saya tidak terlalu gembira dengan keputusan itu, tetapi baiklah, itu kerja saya.
Sepanjang tahun lepas, saya telah mempelajari Rust, dan ia mungkin masih terlalu rumit bagi saya, tetapi saya telah mempelajari beberapa konsep yang sangat hebat yang menjadikan peralihan saya kepada Go berfungsi seperti daya tarikan!
Dalam artikel ini saya akan memberikan anda beberapa petua dan nasihat untuk mempercepatkan aliran pembelajaran anda.
Saya seorang pembangun PHP dan saya sudah biasa dengan CLI TERBAIK yang pernah dibuat (ya, itu Artisan), namun sepanjang perjalanan saya sebagai pembangun, saya telah melalui projek hebat yang kebanyakannya telah..:
Apabila saya sampai ke persekitaran Go, ia bermula sebagai masalah sebenar. Sekurang-kurangnya bagi saya, pengalaman pembangun Golang dari segi alat dan dokumentasi boleh menjadi lebih baik. Memikirkan perkara ini, saya memutuskan untuk melalui 3 perintah yang anda PERLU BELAJAR pada mulanya.
Ingat: ini hanyalah panduan dengan penjelasan saya sendiri tentang sesuatu. Jika anda mahukan maklumat terperinci, buka dokumen :)
Juga: pergi docs payah tolong seseorang letakkan penyerlah sintaks di situ
Bergantung pada sama ada anda ingin memodulatkan aplikasi anda atau mempunyai persekitaran yang teratur, ini akan menjadi arahan yang paling berguna pada mulanya.
Perintah mod go mengurus semua kebergantungan dalam projek anda dan juga menjaga auto-alih keluar apa-apa yang tidak digunakan lagi.
Pertama, di dalam folder kosong baharu anda, mari kita mulakan modul baharu di dalam projek dengan go mod init:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Ini akan mencipta fail baharu dalam akar projek yang dipanggil go.mod, yang pada asasnya ialah kandungan pada masa ini:
Ini fail, jika anda mahu menyemaknya sendiri:
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Selepas itu, perkara seterusnya yang saya sangat suka ialah mod go tidy, yang pada asasnya menambah sebarang kebergantungan yang hilang dan mengalih keluar yang tidak digunakan.
go mod tidy
Yang kedua ini hanya untuk mengingati anda bahawa ini wujud dan ia sangat berguna! Mungkin persekitaran anda akan menjalankannya SETIAP KALI dan anda akan terbiasa melihat import lenyap :p
Ini mungkin perintah paling biasa yang akan anda gunakan, kerana anda TERPAKSA menjalankan projek anda, tetapi berikut ialah cara ia berfungsi:
Perkara yang paling penting untuk diingat tentang arahan ini ialah apabila anda menjalankan arahan go run, ia akan mencari fail go.mod dalam direktori semasa anda dan menggunakannya sebagai asas untuk memetakan keseluruhan projek anda (import, pakej , dll). Berikut ialah beberapa contoh:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Ini kandungan app.go kami:
package main import( "fmt" ) func main () { fmt.Println("whats up! don't forget to like this article <3") }
Kini anda tahu asas-asas untuk melaksanakan projek! Secara harfiah, hello dunia!
Masalah saya dengan Go sentiasa seperti cara ia ditulis, tetapi selepas berjam-jam pengekodan saya menyedari bahawa ia lebih mudah daripada yang saya fikirkan. Seperti yang anda duga, saya mempunyai latar belakang yang kukuh dalam PHP dan beberapa pengalaman dengan Rust.
Apabila saya mula belajar Rust pada tahun 2023, mujurlah seorang lelaki yang saya peminat tegar, Nuno Maduro (Laravel), telah menyampaikan ceramah yang dipanggil "PHP untuk Rust Developers", yang memberi saya beberapa pengenalan asas sintaks dan memberi saya sedikit ruang bernafas semasa saya benar-benar DIHENTIKAN oleh Rust.
Bagaimanapun, ia berguna kepada saya pada masa itu, jadi mengapa tidak melakukan beberapa perbandingan?
Dalam OOP kami mempunyai kelas, yang merupakan cara yang sangat menarik untuk mengabstraksikan kod anda kepada kepingan kecil, dan anda mempunyai sesuatu "seperti itu". Golang boleh dilihat sebagai odyssey, kerana ia boleh menjadi perkembangan epik untuk mengubah persekitaran menjadi apa sahaja yang anda inginkan.
Ingat, Golang ialah "bahasa peringkat tinggi" yang menyediakan sintaks "peringkat sistem" yang membolehkan anda bekerja dengan mudah dengan pelaksanaan "peringkat rendah".
Di bawah sintaks Go, anda boleh
Dan anda boleh menggunakannya untuk: Structs, Struct Fields, Struct Methods. Lihat lebih dekat:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Dalam Rust, anda mempunyai pendekatan yang lebih eksplisit (lebih oop seperti bahasa) di mana:
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Saya ingin membuat perkara yang jelas seperti PHP, Java dan sebagainya tetapi jika anda berhenti berfikir adalah KURANG KOD untuk menulis, tetapi ia juga memberi kesan kepada kebolehbacaan.
Sejujurnya, saya jenis orang yang akan cuba meletakkan, saya tidak tahu... LARAVEL dalam Go Environment, tetapi itu sudah dilakukan di Goravel. Bagaimanapun, saya sangat menyukai idea untuk bekerja dengan "Pembangunan Dipacu Antara Muka/Kontrak", dan buat pertama kalinya saya terjebak dengannya dalam bahasa.
Dalam Go, antara muka tidak "dilaksanakan" dalam struktur/kelas, dan bagi lelaki OOP seperti saya, sungguh gila untuk mempunyai keputusan reka bentuk sedemikian sesuai dengan fikiran saya. Sila lihat apa yang diharapkan:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Sekarang, apabila tiba masanya: anda tidak mempunyai pelaksanaan eksplisit "antara muka" ini di dalam struktur, dan itu, hmm... pelik? Sebaliknya, anda hanya melaksanakan kaedah antara muka yang diperlukan, yang pergi akan menyemak anda pada masa penyusunan. Adalah wajar untuk mengetahui bahawa ini adalah bahasa yang disusun dan ia tidak sepatutnya menjadi masalah, tetapi saya bercakap tentang perspektif saya dengan Pengalaman Pembangun!
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Walau bagaimanapun, dengan sedikit masa pengekodan dalam bahasa anda akan terbiasa dengannya. Sekarang, mari kita bincangkan tentang perkara yang ditawarkan oleh persekitaran asas kepada anda tanpa memuat turun apa-apa!
Sekarang saya bercakap tentang semua yang Go berikan kepada anda dengan Perpustakaan Standard, tanpa memuat turun pakej pihak ketiga. Berikut ialah beberapa garis masa kronologi untuk anda:
Saya tidak bergurau tentang itu, setiap hari saya meneroka pergi, saya menemui beberapa perpustakaan yang menarik di bawah perpustakaan standard. Jadi, mari kita mula bercakap tentang jenis primitif.
Seperti PHP dan tidak seperti banyak bahasa lain (Rust, Java, JS, dll), Golang memerlukan fungsi "helper" untuk melaksanakan kebanyakan operasi jenis yang berkaitan . Kita boleh menganggapnya sebagai jenis "anemia", kerana mereka tidak mempunyai "utiliti" yang melekat padanya.
go mod tidy
Jadi, jika anda menggunakan jenis "String", anda mempunyai pakej lain seperti strconv atau rentetan untuk memanipulasinya! Tetapi inilah peraturan emas untuk tidak melupakan pakej yang hendak dilihat: jika jenis anda ialah rentetan, cari pakej yang sama dengan nama yang dijamak!
Ringkasnya, ini akan memberikan anda fungsi yang berkaitan dengan []Jenis dan Jenis:
Lihat kod, supaya anda boleh mengesahkan sendiri:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Itu sepatutnya mudah, tetapi saya bergelut dengan itu untuk seketika sehingga masuk ke dalam kepala saya. Mungkin menggunakan Laravel dan fungsi pembantu mereka selama terlalu banyak tahun membuatkan saya lupa betapa sukarnya untuk mengekod tanpa Rangka Kerja :D
Semasa saya meneroka alatan dan projek, saya mendapat pengenalan yang sangat baik kepada banyak projek dan saya ingin menyenaraikan setiap satu daripadanya dan lib yang saya gunakan:
Berikut ialah paparan boleh tatal bagi semua pelaksanaan pakej supaya anda boleh menyemaknya. Terdapat BANYAK pakej std yang menarik yang boleh dirujuk di sini.
PERHATIAN: itu BANYAK KOD! :p
Jangan lupa komen ciri kegemaran anda (selain goroutine dan saluran) :p
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Serius, itu sangat menakjubkan! Jadi, mari teruskan ujian sekarang.
Dalam projek kedua saya menggunakan Go, saya melihat peluang untuk mempelajari ujian sambil mencipta objek Permintaan dan Respons. Di dalam persekitaran PHP, anda mungkin menggunakan perpustakaan pihak ke-3 seperti PHPUnit atau Pest. Betul ke? Di dalam persekitaran Go, ini MUDAH! Apa yang anda perlu lakukan ialah:
Katakanlah kami mempunyai requests.go dan requests_test.go dalam folder pakej kami, di mana requests.go ialah:
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Ujian dalam Go dianggap LULUS (hijau) jika (t *Ujian.T).Errorf() tidak dipanggil dalam fungsi ujian anda. Ia juga mengikut konsep enkapsulasi yang sama yang diperkenalkan sebelum ini:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Anda boleh melakukan fungsi pembantu anda sendiri untuk menguji. Cuma pastikan anda tidak menceroboh domain modul pada ujian ini!
Saya telah menggunakan Goland sejak hari pertama, jadi kebanyakan perkara menjadi lebih mudah untuk saya. Jadi setiap kali saya memulakan ujian baharu, saya mendapat boilerplate ini dengan struktur ujian Unity yang berjalan secara selari (goroutine) secara lalai.
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Ok, sekarang kita tahu betapa mudahnya untuk menulis ujian dalam Go, tetapi bagaimana pula dengan menjalankannya? Tugas mudah! Apa yang anda perlu lakukan ialah menavigasi ke folder pakej dan jalankan:
go mod tidy
Sila tulis beberapa ujian untuk barangan anda. Tak susah pun kalau decouple apa yang perlu :p
Selama beberapa tahun pembangunan saya yang lalu, saya sentiasa cuba memodulasi semua projek saya dengan cara yang sesuai dengan keperluan saya, tanpa terperangkap pada barangan "Clean Arch" atau "Reka Bentuk Didorong Domain" . Walau bagaimanapun, dalam percubaan pertama saya untuk membahagikan pakej saya, saya mendapat ralat "Import Kitaran" dan terfikir sendiri: BERAPA LAMA SEJAK SAYA TELAH MELIHAT SESUATU YANG SEPERTI ITU?
Sepanjang 2 tahun saya dalam PHP, saya mengalami masalah yang sama dengan import neraka, di mana anda tidak boleh tidak mengimport fail yang sama DUA KALI dalam aliran tertentu. Ini sebelum saya bertemu PSR-4 (Autoloading) (yang mengubah hari PHP saya selama-lamanya!!) dan sekarang, bertahun-tahun yang lalu, saya bergelut dengan perkara ini dalam Go.
Mari kita pertimbangkan senario import kitaran:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Apabila anda cuba menyusun sesuatu yang menandakan Import Kitaran dalam Go, anda akan menerima ralat seperti:
package main import( "fmt" ) func main () { fmt.Println("whats up! don't forget to like this article <3") }
Dan pada masa ini, anda perlu mula memecahkan kebergantungan/pakej anda untuk mengelakkannya.
TLDR: jangan import pakej yang sama di tempat yang akan dimuatkan berkali-kali.
Saya tidak mencarinya, tetapi ini adalah kali pertama saya melihat perkataan terpelihara menangguhkan dalam bahasa pengaturcaraan. Dan kerana ia bukan sebahagian daripada "perkataan simpanan generik", saya mengabaikannya selama seminggu!
Kemudian salah seorang rakan kerja saya, Dusan, memberi saya pelajaran pengurusan ingatan dalam Go selepas melihat saya bergelut dengan bahasa itu selama beberapa jam. (Ya, ini adalah jeritan :p)
Perkaranya ialah: setiap kali anda membuka penimbal/sambungan kepada sesuatu, anda HARUS MENUTUPNYA! Saya masih ingat semasa saya bekerja dengan pelayan MapleStory (Java) pada tahun 2014, masalah yang paling biasa ialah kebocoran memori, semata-mata kerana pembangun tidak menutup sambungan ke DB.
Ini OK untuk LUPA! Tetapi tidak boleh lulus dalam Semakan Kod LOL
Berikut ialah contoh dalam Java:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Semasa mengekodkan Golang, mereka memberikan atribut tangguh ini untuk anda ingat untuk menutup barangan anda sejurus selepas membukanya.
Defer bermaksud "Deference" iaitu satu cara untuk "Bersih" sumber anda selepas pelaksanaan bahagian tertentu kod itu tamat.
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Anda juga boleh mempunyai banyak penangguhan dalam satu fungsi dan TANGGUH ORDER penting! Jika anda menangguhkan pangkalan data2 dan kemudian menangguhkan pangkalan data1, kedua-dua proses akan dibersihkan dalam susunan yang sama.
go mod tidy
Ini adalah cara yang sangat mudah untuk tidak mengarut menghalang projek anda daripada mengalami kebocoran memori. Sila ingat untuk menggunakannya apabila anda menstrim apa-apa.
Pengendalian ralat pada mulanya adalah seperti: semak sama ada fungsi yang anda gunakan mengembalikan jenis ralat dan sahkannya SETIAP FUCKING MASA! Berikut ialah contoh perkara yang saya bincangkan:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Sejujurnya, saya BENCI sintaks ini. Walau bagaimanapun, ia adalah sebahagian daripada bahasa dan akan menjadi sesuatu yang anda akan temui semasa pengekodan anda.
Fungsi dengan ralat boleh mengembalikan ralat atau (T, ralat), dan mujurlah Go tidak akan membiarkan anda melupakannya.
package main import( "fmt" ) func main () { fmt.Println("whats up! don't forget to like this article <3") }
Spam kod anda dengan err != nil dan anda akan baik-baik saja, saya janji! :D
Selain daripada semua tekanan dan masa yang dihabiskan untuk memahami alam sekitar, adalah satu cabaran yang menarik untuk mempelajari bahasa baharu bersama penonton Twitch saya. Ramai daripada mereka telah lama meminta saya untuk menyemaknya dan inilah kami.
Semua perkara ini menggambarkan pengalaman perkembangan peribadi saya dengan bahasa itu, dan matlamatnya adalah untuk berkongsi perkara yang telah saya lalui selama 2 minggu mempelajarinya.
Baru-baru ini saya telah dicabar oleh rakan sepasukan saya untuk menyelesaikan cabaran ScyllaDB dan ia banyak mengajar saya tentang keselarian, kumpulan dan pengehadan kadar. Ini adalah jenis cabaran yang dihadapi oleh banyak syarikat untuk menjadikan produk mereka berprestasi lebih baik!
Matlamat cabaran adalah untuk mencipta aplikasi baris arahan kecil Go yang memasukkan beberapa data rawak ke dalam ScyllaDB sambil menilai mengehadkan bilangan permintaan.
Anda boleh menemui cabaran repositori di sini: github.com/basementdevs/throttling-requests-scylla-test. Kami juga mengambil pekerja! Anda boleh mencari jawatan terbuka di bahagian kerjaya kami!
Terima kasih kerana membaca! Saya harap artikel ini telah memberikan pandangan yang berharga untuk mempelajari Golang. Jangan ragu untuk berkongsi pendapat atau pengalaman anda.
Atas ialah kandungan terperinci Ini semua yang saya pelajari tentang Go dalam DUA Minggu!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!