[MẸO] Tránh Sử dụng init() trong Go Trừ Khi Cần Thiết

By JoeVu, at: 11:08 Ngày 11 tháng 9 năm 2024

Thời gian đọc ước tính: __READING_TIME__ minutes

[TIPS] Avoid Using init() in Go Unless Necessary
[TIPS] Avoid Using init() in Go Unless Necessary

Hàm init() trong Go là một hàm đặc biệt được tự động thực thi trước hàm main(), và thậm chí trước bất kỳ mã nào khác trong gói. Mặc dù nó có thể hữu ích, nhưng việc sử dụng quá mức có thể khiến mã của bạn khó theo dõi và bảo trì hơn. Dưới đây là lý do tại sao bạn nên tránh sử dụng init() trừ khi thực sự cần thiết.

 

Vì sao init() có thể gây vấn đề

 

  1. Logic ẩn: Vì init() được thực thi tự động, nó có thể giới thiệu hành vi ẩn không rõ ràng từ luồng chính của mã. Điều này có thể khiến việc gỡ lỗi và hiểu mã trở nên khó khăn hơn, đặc biệt là đối với các dự án lớn.
     

  2. Thứ tự thực thi: Go không đảm bảo thứ tự thực thi các hàm init() trên các gói khác nhau. Nếu nhiều gói có các hàm init(), điều này có thể dẫn đến hành vi không thể dự đoán, khiến chương trình khó lập luận hơn.
     

  3. Kiểm thử phức tạp: Nếu logic thiết lập quan trọng bị ẩn bên trong init(), việc mô phỏng hoặc bỏ qua trong quá trình kiểm thử có thể khó khăn. Điều này có thể dẫn đến các bài kiểm thử liên kết chặt chẽ, khó viết và bảo trì hơn.

 

Khi nào nên sử dụng init()

 

Mặc dù có những nhược điểm tiềm ẩn, nhưng có những trường hợp sử dụng hợp lệ cho init():

  • Cấu hình cấp gói: Nếu một gói cần khởi tạo một số trạng thái hoặc cấu hình trước khi được sử dụng (ví dụ: thiết lập một trình ghi nhật ký toàn cục), init() có thể hữu ích. Tuy nhiên, hãy đảm bảo rằng việc thiết lập này là cần thiết và không thể được xử lý trong main() hoặc ở nơi khác.
     

  • Đăng ký thành phần: Một số gói, đặc biệt là những gói cung cấp chức năng mở rộng như plugin hoặc middleware, sử dụng init() để đăng ký các thành phần. Điều này là chấp nhận được, nhưng hãy cố gắng ghi lại hành vi này một cách rõ ràng để tránh nhầm lẫn.

 

Ví dụ về việc sử dụng init()

 

package main

import (
    "log"
    "os"
)

func init() {
    // Thiết lập trình ghi nhật ký toàn cục
    log.SetOutput(os.Stdout)
    log.Println("Logger initialized")
}

func main() {
    log.Println("This is the main function")
}


Trong ví dụ này, init() được sử dụng để thiết lập một trình ghi nhật ký toàn cục trước khi hàm main() chạy. Mặc dù đây là một trường hợp sử dụng hợp lệ, nhưng hãy xem xét xem việc thiết lập này có thể được thực hiện một cách rõ ràng trong main() để có độ rõ ràng tốt hơn hay không.

Đọc thêm: https://www.digitalocean.com/community/tutorials/understanding-init-in-go

Tag list:
- tips
- golang init function
- tricks
- init golang
- golang problems
- golang tips

Liên quan

Python Django

Đọc thêm
Outsourcing

Đọc thêm
Experience CRM

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.