☰ Mục lục series
Tài liệu Go tiếng Việt
  1. Bắt đầu (Getting started)
    1. Tổng quan
    2. Tải về và cài đặt
    3. Bắt đầu với Go
    4. Quản lý các bản cài đặt Go
    5. Plugin trình soạn thảo và IDE
  2. Dạo quanh Go (A Tour of Go)
    1. Chào mừng
    2. Package, biến và hàm
    3. Điều khiển luồng
    4. Struct, slice và map
    5. Method và interface
    6. Generics
    7. Xử lý đồng thời
  3. Hướng dẫn (Tutorials)
    1. Danh sách hướng dẫn
    2. Tạo một Go module
    3. Gọi mã của bạn từ một module khác
    4. Trả về và xử lý lỗi
    5. Trả về lời chào ngẫu nhiên
    6. Trả về lời chào cho nhiều người
    7. Thêm một test
    8. Biên dịch và cài đặt ứng dụng
    9. Kết luận
    10. Bắt đầu với workspace nhiều module
    11. Phát triển RESTful API với Go và Gin
    12. Truy cập cơ sở dữ liệu quan hệ
    13. Bắt đầu với generics
    14. Bắt đầu với fuzzing
    15. Làm việc với JSON
    16. Tìm và sửa các dependency có lỗ hổng với govulncheck
    17. Tìm và khắc phục phụ thuộc có lỗ hổng với VS Code Go
    18. Viết ứng dụng web
  4. Viết code Go
    1. Cách viết mã Go
    2. Effective Go
    3. Doc Comment trong Go
  5. Module
    1. Phát triển và publish module
    2. Quản lý phụ thuộc
    3. Tổ chức một module Go
    4. Quản lý mã nguồn của module
    5. Cách đánh số phiên bản module
    6. Quy trình phát hành và đánh phiên bản module
    7. Publish một module
    8. Phát triển một bản cập nhật major version
    9. Tham chiếu tệp go.mod
    10. Ngừng hỗ trợ 'go get' cho việc cài đặt tệp thực thi
  6. Cơ sở dữ liệu (Database)
    1. Truy cập cơ sở dữ liệu quan hệ
    2. Mở một handle cơ sở dữ liệu
    3. Thực thi câu lệnh SQL không trả về dữ liệu
    4. Truy vấn dữ liệu
    5. Dùng prepared statement
    6. Thực thi transaction
    7. Huỷ các thao tác đang chạy
    8. Quản lý kết nối
    9. Tránh rủi ro SQL injection
  7. Chẩn đoán và hiệu năng
    1. Chẩn đoán
    2. Hướng dẫn về Go Garbage Collector
    3. Tối ưu hoá dựa trên profile
    4. Data Race Detector
    5. Gỡ lỗi mã Go bằng GDB
    6. Hỗ trợ coverage profiling cho integration test
  8. Bảo mật (Security)
    1. Tổng quan bảo mật
    2. Thực hành tốt về bảo mật cho lập trình viên Go
    3. Quản lý lỗ hổng trong Go
    4. Cơ sở dữ liệu lỗ hổng của Go
    5. Quét lỗ hổng trong IDE
    6. Chính sách CNA của Go
    7. Go Fuzzing
    8. Chi tiết kỹ thuật của Go Fuzzing
    9. Chính sách bảo mật của Go
    10. Threat Model của Go
    11. Các quyết định về bảo mật của Go
    12. Tuân thủ FIPS 140-3
  9. Công cụ và toolchain
    1. Tài liệu về các lệnh
    2. Về lệnh go
    3. Go Toolchains
    4. Telemetry của Go
    5. Cài đặt Go từ mã nguồn
    6. Cài đặt và sử dụng gccgo
  10. Tham khảo
    1. Câu hỏi thường gặp (FAQ)
    2. Go 1 và tương lai của các chương trình Go
    3. Hướng dẫn chuyển đổi sang encoding/json/v2
    4. Hướng dẫn đóng góp
    5. Đóng góp cho frontend gccgo
  11. Phụ lục
    1. Bảng thuật ngữ
Module

Cách đánh số phiên bản module

Bản dịch từ go.dev/doc/modules/version-numbers

Người phát triển một module dùng từng phần trong số phiên bản của module để báo hiệu tính ổn định và tương thích ngược của phiên bản đó. Với mỗi bản phát hành mới, số phiên bản của module phản ánh cụ thể bản chất của những thay đổi trong module kể từ bản phát hành trước đó.

Khi bạn phát triển mã sử dụng các module bên ngoài, bạn có thể dùng số phiên bản để hiểu mức độ ổn định của một module bên ngoài lúc cân nhắc nâng cấp. Khi bạn phát triển module của riêng mình, số phiên bản của bạn sẽ báo hiệu tính ổn định và tương thích ngược của module tới các lập trình viên khác.

Chủ đề này mô tả ý nghĩa của các số phiên bản module.

Xem thêm

  • Khi bạn dùng các package bên ngoài trong mã của mình, bạn có thể quản lý những phụ thuộc đó bằng các công cụ Go. Để biết thêm, xem Quản lý phụ thuộc.
  • Nếu bạn phát triển module cho người khác dùng, bạn gán một số phiên bản khi phát hành module, bằng cách gắn tag cho module trong repository của nó. Để biết thêm, xem Phát hành một module.

Một module đã phát hành được công bố kèm số phiên bản theo mô hình semantic versioning, như minh hoạ sau:

Sơ đồ minh hoạ một số semantic version gồm major version 1, minor version 4, patch version 0 và pre-release version beta 2

Bảng sau mô tả cách các phần của số phiên bản thể hiện tính ổn định và tương thích ngược của một module.

Giai đoạn phiên bản Ví dụ Thông điệp gửi tới lập trình viên
Đang phát triển Số pseudo-version tự động v0.x.x Báo hiệu rằng module vẫn đang được phát triển và chưa ổn định. Bản phát hành này không kèm bảo đảm nào về tương thích ngược hay tính ổn định.
Major version v1.x.x Báo hiệu các thay đổi API công khai không tương thích ngược. Bản phát hành này không bảo đảm rằng nó sẽ tương thích ngược với các major version trước đó.
Minor version vx.4.x Báo hiệu các thay đổi API công khai tương thích ngược. Bản phát hành này bảo đảm tương thích ngược và tính ổn định.
Patch version vx.x.1 Báo hiệu các thay đổi không ảnh hưởng tới API công khai của module hay các phụ thuộc của nó. Bản phát hành này bảo đảm tương thích ngược và tính ổn định.
Pre-release version vx.x.x-beta.2 Báo hiệu rằng đây là một mốc pre-release, chẳng hạn alpha hoặc beta. Bản phát hành này không kèm bảo đảm nào về tính ổn định.

Đang phát triển

Báo hiệu rằng module vẫn đang được phát triển và chưa ổn định. Bản phát hành này không kèm bảo đảm nào về tương thích ngược hay tính ổn định.

Số phiên bản có thể ở một trong các dạng sau:

Số pseudo-version

v0.0.0-20170915032832-14c0d48ead0c

Số v0

v0.x.x

Số pseudo-version

Khi một module chưa được gắn tag trong repository của nó, các công cụ Go sẽ sinh ra một số pseudo-version để dùng trong tệp go.mod của mã gọi các hàm trong module đó.

Lưu ý: Như một thực hành tốt, hãy luôn để các công cụ Go sinh ra số pseudo-version thay vì tự tạo số của riêng bạn.

Pseudo-version hữu ích khi người phát triển mã sử dụng các hàm của module cần làm việc dựa trên một commit chưa được gắn tag semantic version.

Một số pseudo-version có ba phần ngăn cách bằng dấu gạch nối, theo dạng sau:

Cú pháp

baseVersionPrefix-timestamp-revisionIdentifier

Các phần

  • baseVersionPrefix (vX.0.0 hoặc vX.Y.Z-0) là giá trị được suy ra từ tag semantic version đứng trước revision, hoặc từ vX.0.0 nếu không có tag như vậy.

  • timestamp (yymmddhhmmss) là thời điểm UTC mà revision được tạo. Trong Git, đây là thời gian commit, không phải thời gian tác giả.

  • revisionIdentifier (abcdefabcdef) là tiền tố 12 ký tự của hash commit, hoặc trong Subversion là số revision được đệm bằng số 0.

Số v0

Một module được phát hành với số v0 sẽ có một số semantic version chính thức gồm phần major, minor và patch, cùng với một định danh pre-release tuỳ chọn.

Dù phiên bản v0 có thể được dùng trong môi trường production, nó không bảo đảm gì về tính ổn định hay tương thích ngược. Ngoài ra, các phiên bản v1 trở đi được phép phá vỡ tương thích ngược đối với mã dùng các phiên bản v0. Vì lý do này, người phát triển mã sử dụng các hàm trong một module v0 có trách nhiệm tự thích ứng với các thay đổi không tương thích cho tới khi v1 được phát hành.

Pre-release version

Báo hiệu rằng đây là một mốc pre-release, chẳng hạn alpha hoặc beta. Bản phát hành này không kèm bảo đảm nào về tính ổn định.

Ví dụ

vx.x.x-beta.2

Người phát triển module có thể dùng một định danh pre-release với bất kỳ tổ hợp major.minor.patch nào bằng cách nối thêm dấu gạch nối và định danh pre-release.

Minor version

Báo hiệu các thay đổi tương thích ngược đối với API công khai của module. Bản phát hành này bảo đảm tương thích ngược và tính ổn định.

Ví dụ

vx.4.x

Phiên bản này thay đổi API công khai của module, nhưng không theo cách làm hỏng mã đang gọi. Điều này có thể bao gồm các thay đổi đối với phụ thuộc của chính module, hoặc việc bổ sung các hàm, method, trường struct hay kiểu dữ liệu mới.

Nói cách khác, phiên bản này có thể bao gồm các cải tiến thông qua những hàm mới mà lập trình viên khác có thể muốn dùng. Tuy nhiên, người đang dùng các minor version trước đó không cần thay đổi mã của họ.

Patch version

Báo hiệu các thay đổi không ảnh hưởng tới API công khai của module hay các phụ thuộc của nó. Bản phát hành này bảo đảm tương thích ngược và tính ổn định.

Ví dụ

vx.x.1

Một bản cập nhật làm tăng số này chỉ dành cho các thay đổi nhỏ như sửa lỗi. Người phát triển mã sử dụng module có thể nâng cấp lên phiên bản này một cách an toàn mà không cần thay đổi mã của họ.

Major version

Báo hiệu các thay đổi không tương thích ngược trong API công khai của module. Bản phát hành này không bảo đảm rằng nó sẽ tương thích ngược với các major version trước đó.

Ví dụ

v1.x.x

Số phiên bản v1 trở lên báo hiệu rằng module đã ổn định để sử dụng (trừ các phiên bản pre-release của nó).

Lưu ý rằng vì phiên bản 0 không bảo đảm gì về tính ổn định hay tương thích ngược, người nâng cấp một module từ v0 lên v1 có trách nhiệm tự thích ứng với các thay đổi phá vỡ tương thích ngược.

Người phát triển module chỉ nên tăng số này vượt quá v1 khi thật sự cần thiết, bởi việc nâng cấp phiên bản đó gây xáo trộn đáng kể cho các lập trình viên có mã dùng hàm trong module được nâng cấp. Sự xáo trộn này bao gồm các thay đổi không tương thích ngược đối với API công khai, cũng như việc lập trình viên dùng module phải cập nhật package path ở mọi nơi họ import package từ module đó.

Một bản cập nhật major version lên số cao hơn v1 cũng sẽ có module path mới. Đó là vì module path sẽ được nối thêm số major version, như trong ví dụ sau:

module example.com/mymodule/v2 v2.0.0

Một bản cập nhật major version biến nó thành một module mới với lịch sử tách biệt khỏi phiên bản trước của module. Nếu bạn phát triển module để phát hành cho người khác, xem “Phát hành các thay đổi API phá vỡ tương thích” trong Quy trình phát hành và đánh phiên bản module.

Để biết thêm về directive module, xem Tài liệu tham chiếu go.mod.

Nội dung gốc: Go Documentation © The Go Authors, giấy phép CC BY 3.0. Bản dịch và ghi chú: Lê Văn Dũng.