Để viết code dễ bảo trì và nâng cấp, chúng ta sử dụng Module và Package. Trong ngôn ngữ lập trình Go (Golang), nắm rõ sự khác biệt giữa module và package giúp bạn làm chủ được code của mình, sắp xếp và phân tách theo tinh thần separation of concern.
- Package:
- Package là một cách để tổ chức mã trong Go. Mỗi tệp mã Go thuộc về một package cụ thể.
- Package chứa các hàm, biến, và các loại dữ liệu liên quan đến một chức năng hoặc một phần của ứng dụng.
- Ví dụ:
fmt
,net/http
, vàmath
là các package chuẩn trong Go.
- Module:
- Module là một khái niệm liên quan đến quản lý phụ thuộc trong Go.
- Một module là một bộ sưu tập các package và tệp mã Go liên quan đến một dự án hoặc một ứng dụng cụ thể.
- Module bao gồm một tệp go.mod, trong đó bạn liệt kê các dependencies của dự án cùng với phiên bản cụ thể của chúng.
- Module cung cấp một cách để đảm bảo rằng các phiên bản của các package được sử dụng trong dự án của bạn là nhất quán và dễ quản lý.
Mối quan hệ giữa module và package trong Go là:
- Một module thường bao gồm nhiều package. Những package này là các phần của dự án hoặc ứng dụng bạn đang phát triển.
- Một module sẽ có một tệp go.mod để quản lý các phụ thuộc của nó. Trong tệp go.mod, bạn sẽ chỉ định các package nào và phiên bản cụ thể của chúng mà dự án của bạn sử dụng.
- Các package trong một module có thể được sử dụng bởi các package khác trong cùng một module hoặc bởi các dự án khác nếu bạn công khai (export) các thành phần từ package đó (điều này liên quan đến việc đặt chữ hoa cho tên thành phần).
Tóm lại, package và module trong Go là hai khái niệm quan trọng để tổ chức và quản lý mã nguồn của bạn. Package là cách bạn tổ chức mã trong dự án của mình, trong khi module là cách bạn quản lý các phụ thuộc và phiên bản của chúng để đảm bảo tính nhất quán trong dự án của bạn.
Theo kinh nghiệm của mình thì mình thường tạo một module với một ứng dụng qua go mod init, có thể đặt tên cho module này theo link trên github nếu mở mã nguồn.
Ví dụ:
//Bạn có thể đặt tên cho module của mình đơn giản hơn thay vì dùng link trên github. $ go mod init github.com/yeungon/golang
Khi chạy command line trên, mình đã khởi tạo một module có tên “github.com/yeungon/golang”. Nếu muốn import các package của module này trong cả app thì mình phải dùng cả tên moduel “dài ngoằng” này. Điểm thuận lợi là mình có thể public module này để người khác sử dụng.