Golang: Mới tập tành mà thấy cũng ghiền ghiền
Golang: Mới tập tành mà thấy cũng ghiền ghiền
Hồi đó tới giờ mình chỉ loanh quanh với JavaScript, TypeScript, rồi qua .NET, gần đây thêm Rust nữa. Toàn mấy cha nặng ký hết. Rồi tự nhiên mấy tuần trước mình quyết định: "Thôi, học thử Golang coi sao".
Ảnh: Markus Winkler — Pexels
Thiệt tình là ấn tượng đầu tiên: "Sao nó… đơn giản quá vậy?"
Trong TypeScript hay C#, quen rồi — generic, interface, abstract class, inheritance đủ kiểu. Mở Golang ra, thấy có mỗi struct với interface — mà interface của Go cũng khác, để mình nói sau. Không class, không inheritance, không generics (hồi trước, giờ Go 1.18 có rồi nhưng cũng hạn chế hơn C# với TypeScript).
Mình nghĩ: "Chắc gì làm được gì nghiêm túc với mớ này?"
Rồi mình bắt đầu viết thử cái CLI tool nhỏ, xong cái web server với Gin, rồi thử goroutine, channel... Ối dồi ôi, ghiền thiệt.
Cái làm mình mê
Goroutine với channel
Quen với async/await của .NET hay event loop của JavaScript rồi, qua Go mình thấy goroutine gần gũi mà cũng lạ.
Trong C#, muốn chạy concurrent thì Task.Run, phải nhớ await, phải cẩn thận ConfigureAwait. JavaScript thì Promise.all đủ kiểu.
Go làm đơn giản hơn nhiều:
go func() { // cái này chạy riêng, không blocking }()
Chỉ thêm chữ "go" là xong. Dễ hết biết.
Còn channel nữa — cái này mới thiệt. Kiểu như ống nước, đẩy dữ liệu qua ống, thằng kia hứng. .NET có Channel
Ảnh: Pixabay — Pexels
Compile nhanh — cái này mình mê nhất
Code .NET mình viết xong, dotnet build — chờ 5-10 giây. Code Go, go build — chưa kịp chớp mắt đã xong. Cái cảm giác "viết xong, chạy liền" làm mình nhớ hồi còn code JavaScript, nhưng lần này compile ra binary, không cần runtime, không cần Node.
Thiệt sự là ghiền.
Deployment thì khỏi chê
Một cái binary, kéo qua server, chạy. Hết. Không cần cài .NET runtime, không cần node_modules, không cần config docker lằng nhằng. Đây là cái mà .NET với Node.js không làm được (trừ khi publish AOT, mà .NET AOT còn nhiều hạn chế lắm).
Tuần trước mình viết cái web server nhỏ xử lý webhook. go build ra file 15MB, scp lên server Oracle Free Tier, chạy phớt. RAM xài xíu xiu. Đã thiệt.
Cái chưa quen
Cũng phải nói, Go có mấy cái mình vẫn chưa ưa lắm:
Error handling: if err != nil viết hoài mỏi tay. So với .NET (exception) hay Rust (Result match) thì Go hơi thủ công. Mỗi lần gọi hàm là phải check err, rồi return err, viết đi viết lại mệt nghỉ.
Package management: hồi xưa GOPATH loạn như cái chợ, giờ Go modules cũng ổn hơn nhưng so với NuGet hay npm thì còn thua xa.
Generics: mới có từ 1.18, dùng được nhưng còn gò bó. Dân C# với TypeScript quen generic xịn xò qua đây thấy hơi chật vật. Mấy cái contraint phức tạp là đau đầu.
Mà thôi, cái nào cũng có giá của nó. Ngôn ngữ đơn giản thì sẽ có những chỗ bất tiện, chấp nhận được.
Tổng kết
Mỗi ngôn ngữ có cái hay riêng. JavaScript linh hoạt, .NET architecture chắc chắn, Rust an toàn tới từng bit. Còn Golang? Nó đơn giản, thực dụng, và làm được việc. Đúng kiểu "keep it simple, stupid" — mà đôi khi cái đơn giản lại khó nhất.
Mình mới học nên chắc còn nhiều thứ chưa biết. Bạn nào code Go lâu rồi, inbox cho mình xin ít tips với nha! Mấy cái "giá mà biết sớm hơn" khi học Go là gì?
Hẹn gặp lại mấy bạn bài sau. Mình đi viết tiếp cái CLI tool bằng Go đây 🦫