- vừa được xem lúc

Sự khó chịu khi mới học Golang và cách giải quyết siêu đơn giản

0 0 49

Người đăng: Tống Hoàng Vũ

Theo Viblo Asia

Gần đây mình đang tìm một giải pháp backend thay thế cho Java Spring (do nó nặng vãi chưởng), sẵn tiện học luôn ngôn ngữ mới. Bỏ ra một ngày để tìm hiểu, khảo sát vài ngôn ngữ backend, cuối cùng mình đã chọn Golang. Nghe thiên hạ đồn Golang đơn giản, mạnh mẽ, chạy nhẹ nhàng, quá phù hợp với tiêu chuẩn của mình rồi (mình biết Nodejs cơ mà không thích lắm).

Tuy vậy, mới học Go được vài ngày, có một thứ làm mình vô cùng khó chịu. Google liền hai ba ngày mới ra được cách fix, và công nhận sau đó thì code Go sướng hẳn ra, việc học cũng trở nên tiện hơn rất nhiều. Vậy đó là gì, và cách giải quyết ra sao, hãy cùng tìm hiểu qua bài viết này nhé.

Đôi nét về Golang

Trước hết mình sẽ giới thiệu đôi nét về Golang trước khi vào chủ đề chính. Bạn nào đã biết rồi có thể bỏ qua phần này nhé.

Go - ngôn ngữ chỉ nghe qua tên thôi là biết của bác Google rồi ?

Khi mới tiếp xúc với Golang, cảm giác đầu tiên là cái logo đúng kiểu trúa hề ? Tìm hiểu sâu hơn chút, mình biết thêm được Go là một ngôn ngữ khá mạnh:

  • Đơn giản, dễ học hơn C/C++ nhiều
  • Có static typing, kiểu dữ liệu tương tự như Java
  • Là ngôn ngữ biên dịch thành native code (không cần thông dịch, byte code hoặc máy ảo gì cả).
  • Hiệu suất rất tốt, do native code và goroutine siêu nhẹ
  • Rất phù hợp cho kiến trúc Microservices

Do những ưu điểm trên, Golang rất phổ biến để xây dựng phần backend cho web. Ngay cả ông lớn như Google đã áp dụng nó cho rất nhiều ứng dụng web của mình. Không nói đâu xa, phổ biến dạo gần đây là Docker cũng được viết bằng Go. Và theo khảo sát của JetBrains, Go là ngôn ngữ hứa hẹn có nhiều tiềm năng nhất trong tương lai.

https://www.jetbrains.com/lp/devecosystem-2019/

Giới thiệu nhiêu đó có vẻ đủ rồi, và giờ hãy vào chủ đề chính của bài viết: sự khó chịu khi mới bắt đầu học Golang.

Vấn đề phiền phức với Go module

Khi mới bắt đầu học ngôn ngữ hay framework nào đó, mình thường check xem có extension nào cho VSCode không. Nếu có thì quá tốt, do nếu so với các IDE khác thì VSCode vẫn nhẹ chán, code thích hơn. May mắn là Golang có VSCode extension chính thức của nó luôn, thế là mình hí hửng cài vào và bắt đầu code.

package main import "fmt" func main() { fmt.Println("Hello world")
}

Như một thói quen, mình nhấn F5 cho VSCode chạy default build & run. Okay vẫn chạy tốt, nhưng hình như có con bug nhỏ nhoi nào đấy.

Google thêm một lúc, ồ, hóa ra do Go yêu cầu phải tạo module trong thư mục code. Mình tiếp tục gõ lệnh sau.

# Tạo module có tên main
go mod init main

Xong bước trên, một file go.mod được tạo ra. Chạy lại chương trình thì mọi thứ đã ổn. Ơ thế thì vấn đề thực sự là gì?

Cơ mà có mỗi một hàm main()

Kinh nghiệm học code của mình như sau, và chính cái cách làm của mình lần này lại không hoạt động với Go.

Mỗi bài học thì sẽ code thành một file ví dụ riêng.

Ví dụ hello-world.go, variable.go, function.go,...

Như vậy sẽ tiện cho sau này coi lại cũng nhanh hơn.

Sẵn show luôn cấu trúc tổ chức của project mình đang học Go luôn.

Sự khó chịu khi code Go như trên là do 3 nguyên nhân chính:

  • Go bắt buộc phải có module để chạy (hoặc chạy được từng file mà phải gõ command)
  • Module phải khai báo ở root directory, không tạo nhiều module trong thư mục con được
  • Mỗi module có duy nhất một hàm main()

Do đó, khi nhấn F5 để run thì chỉ có mỗi hàm main() được chạy. Thế thì những đoạn code ở các file khác thì sao?

Lúc đó mình khá là bực mình rồi, giải pháp tạm thời là viết code lại như sau.

package main import "fmt" // Không cần import các file .go khác
// Do cùng thư mục là auto có được rồi func main() { // Phải toggle comment từng function để chạy hello_world() variable() function() ...
}

Giải pháp đơn giản cho vấn đề trên

Mình lại tiếp tục hành trình google, và cuối cùng mình đã tìm ra cách giải quyết cực kỳ đơn giản.

Khi nhấn F5 thì VSCode mặc định sẽ chạy cả một module.

Do đó, cần tìm cách chỉnh lại sao đó cho VSCode chạy lệnh go run file.go là được.

Okay mình đã biết VSCode sử dụng file .vscode/launch.json để config các Run command. Cơ mà biết đến thế rồi, google cả buổi, bằng tiếng Anh hẳn hoi vẫn không ra. Và rồi may mắn thay mình đã gặp được cách giải quyết.

{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Launch Package", "type": "go", "request": "launch", "mode": "auto", "program": "${file}" } ]
}

Chỉ cần đổi chỗ program từ ${fileDirname} thành ${file} là được. Mình cũng chưa từng để ý chỗ đấy, ai dè VSCode nó chạy cả thư mục hiện tại $fileDirname thay vì file mình đang mở $file.

Okay xong, vấn đề khó chịu đã được giải quyết theo một cách đơn giản đến bất ngờ. Từ nay code Go cũng dễ hơn, chỉ cần nhấn F5 phát là nó chạy file mình đang mở luôn.


Okay bài viết hết rồi, cảm ơn các bạn đã đọc đến đây nhé ? Mặc dù ngôn từ bài viết có hơi "tưng tửng" so với bình thường do tác giả tới tháng ? cơ mà mình vẫn hi vọng các bạn sẽ học được gì đó qua bài viết của mềnh.

À và đừng ngại nhấn upvote cho tớ thêm động lực nếu bài viết hữu ích với các bạn nhé. Chào thân ái và quyết thắng ❤️

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 374

- vừa được xem lúc

Tìm hiểu về cách thiết kế Class Diagram

Trong 1 dự án, việc tổ chức code cũng như clean code là 1 điều rất quan trọng, nếu cách thiết kế các class hợp lý và rõ ràng sẽ giúp ích rất nhiều cho việc mở rộng và bảo trì sau này. Để làm được điều này chúng ta cần phải có 1 bản thiết kế Class Diagram thật sự hợp lý.

0 0 76

- vừa được xem lúc

Vòng đời và trạng thái của Thread

A. Giới thiệu.

0 0 119

- vừa được xem lúc

Sự khác nhau giữa những điều tưởng giống nhau - Phần 3

Hôm nay, để tiếp tục cho series so sánh, hãy cùng mình khám phá thêm 2 địa danh mới khá nổi tiếng của Việt Nam mình đó là Cù Lao Chàm và đảo Lý Sơn. .

0 0 100

- vừa được xem lúc

5 sai lầm phổ biến khi code JavaScript mà bạn ít khi để ý

Bài viết hôm nay mình giới thiệu đến các bạn 5 lỗi lập trình thường gặp trong JavaScript. Tất nhiên mình sẽ không nói về các syntax error, hoặc những lỗi quá bình thường.

0 0 43

- vừa được xem lúc

Cách sử dụng dagger 2 cơ bản trong Android

I. Giới thiệu.

0 0 233