Golint obey or not?

Hi Vtitans,
Hôm nay mình trả lời câu hỏi "có nên sử dụng Golint" trong dự án của mình không. Mình nghĩ quyết định là dựa trên dự án, nhưng những thông tin đưa ra ở đây có giá trị tham khảo cho, ví dụ, một team đang cân nhắc việc adopt Sonarqube trên mức độ rộng hơn.

Golint là gì

Một trong không nhiều tool linter của Golang.
Type: static check, focus vào code style.
Ví dụ: warning "không sử dụng underscore trong tên biến", warning "exported element cần có comment".

Quan điểm của team Golint

Thể hiện trên README, bạn có thể đọc đầy đủ ở đây: https://github.com/golang/lint
"
Golint được apply tại chính các dự án của Golang.
But.
Not Gold standard.
"
Chắc hẳn nhiều chàng hào kiệt trẻ tuổi cứ thấy dòng 1 là thích, phải không? Ở đây, vì profit, chúng tôi chiến đấu chống lại sự ngây thơ, và qui tắc thực hành phải được đưa ra và chấp nhận bởi người thực hành.

Không thể không Obey vs Không thể Obey được

Hãy lấy warning "exported element cần có comment" để thảo luận, vì nó là rule impact nhiều nhất.

  1. Bạn rất cần viết comment cho exported nếu bạn viết một thư viện và sẽ public nó lên pkg.go.dev.
  2. Bạn sẽ tiêu tốn nhiều, cực nhiều effort cho việc này khi bạn viết application. Nhiều đến mức là dự án sẽ definitely fail, trừ phi bạn phát minh hoặc tìm thấy một cách viết comment tự động.

Mình đang ở (2). Dự án của mình đang maintain, và code cũ dường như không consider exported vs private, nên họ export tất.

Các fact khác

Đáng tiếc là, Golint ít nhất đến đầu năm 2021 không hỗ trợ excluding rules.
Golint được chọn mặc định trong VS Code, nhưng có thể thay đổi.
(Mình tin rằng) các coder đều mất một chút thời gian để hiểu khi nào VS Code trigger lint trên một file hay package, hay nói cách khác tại sao VS Code không đơn giản là quét và report tất cả mọi thứ (như Eclipse với Java) mà lại đột nhiên sổ ra một tràng vào một lúc "bất kỳ" nào đó. Khá phiền toái, là một nguyên nhân khiến mình mute Golint.

Chốt: Qui tắc thực hành trong dự án X

  1. Trong VS Code, thay đổi settings Linter từ Golint sang Golangci-lint. Cách thực hiện: xem ảnh feature của bài này.
  2. Khuyến khích xem, hiểu và fix warnings của Golint nhưng hãy chạy nó từ dòng lệnh.

Lưu ý cần biết khi chạy Golint từ dòng lệnh: Hiện tại Golint không chạy recursive. Tương lai cũng không, xem ở đây: https://github.com/golang/lint/issues/58

# Golint không recursive
# Mẫu check một file:
golint main.go
# Mẫu check một package:
golint path/path/

Bổ sung: Góp ý tới team Sonarqube

Follow golangci.
So sánh với Golint focus vào coding style và enforce style của chính Golang team, Vet focus vào correctness. Mình xin giới thiệu Vet trong một bài khác.

Chúc dự án của bạn thành công,
Thân, from Châu D9

Leave a Reply