☰ 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

Quản lý phụ thuộc

Bản dịch từ go.dev/doc/modules/managing-dependencies

Khi mã nguồn của bạn dùng các package bên ngoài, những package đó (được phân phối dưới dạng module) trở thành phụ thuộc. Theo thời gian, bạn có thể cần nâng cấp hoặc thay thế chúng. Go cung cấp các công cụ quản lý phụ thuộc giúp bạn giữ an toàn cho ứng dụng Go khi tích hợp phụ thuộc từ bên ngoài.

Chủ đề này mô tả cách thực hiện các tác vụ quản lý phụ thuộc mà bạn đưa vào mã nguồn. Bạn có thể làm hầu hết chúng bằng các công cụ Go. Chủ đề này cũng mô tả cách thực hiện một vài tác vụ liên quan đến phụ thuộc khác mà bạn có thể thấy hữu ích.

Xem thêm

  • Nếu bạn mới làm quen với việc dùng phụ thuộc dưới dạng module, hãy xem Hướng dẫn bắt đầu để có phần giới thiệu ngắn gọn.
  • Dùng câu lệnh go để quản lý phụ thuộc giúp bảo đảm các yêu cầu của bạn luôn nhất quán và nội dung tệp go.mod hợp lệ. Để tra cứu các câu lệnh, xem Command go. Bạn cũng có thể nhận trợ giúp từ dòng lệnh bằng cách gõ go help command-name, chẳng hạn go help mod tidy.
  • Các câu lệnh Go bạn dùng để thay đổi phụ thuộc sẽ chỉnh sửa tệp go.mod. Để biết thêm về nội dung của tệp này, xem tài liệu tham khảo tệp go.mod.
  • Giúp trình soạn thảo hoặc IDE của bạn hiểu về Go module có thể khiến việc quản lý chúng dễ dàng hơn. Để biết thêm về các trình soạn thảo hỗ trợ Go, xem Editor plugins and IDEs.
  • Chủ đề này không mô tả cách phát triển, xuất bản và đánh phiên bản module cho người khác dùng. Để biết thêm, xem Phát triển và xuất bản module.

Quy trình sử dụng và quản lý phụ thuộc

Bạn có thể lấy và dùng các package hữu ích bằng công cụ Go. Trên pkg.go.dev, bạn có thể tìm kiếm các package có thể hữu ích, rồi dùng câu lệnh go để import những package đó vào mã nguồn của mình và gọi các hàm của chúng.

Dưới đây liệt kê các bước quản lý phụ thuộc phổ biến nhất. Để biết thêm về từng bước, xem các mục trong chủ đề này.

  1. Tìm các package hữu ích trên pkg.go.dev.
  2. Import các package bạn muốn vào mã nguồn.
  3. Thêm mã nguồn của bạn vào một module để theo dõi phụ thuộc (nếu nó chưa nằm trong một module). Xem Bật theo dõi phụ thuộc
  4. Thêm các package bên ngoài làm phụ thuộc để bạn có thể quản lý chúng.
  5. Nâng cấp hoặc hạ cấp phiên bản phụ thuộc khi cần theo thời gian.

Quản lý phụ thuộc dưới dạng module

Trong Go, bạn quản lý phụ thuộc dưới dạng các module chứa những package bạn import. Quá trình này được hỗ trợ bởi:

  • Một hệ thống phi tập trung để xuất bản module và lấy mã nguồn của chúng. Các lập trình viên đưa module của họ ra để lập trình viên khác dùng từ repository của chính họ và xuất bản kèm một số phiên bản.
  • Một công cụ tìm kiếm package và trình duyệt tài liệu (pkg.go.dev) nơi bạn có thể tìm thấy module. Xem Tìm và import các package hữu ích.
  • Một quy ước đánh số phiên bản module giúp bạn hiểu mức độ ổn định và các bảo đảm tương thích ngược của module. Xem Đánh số phiên bản module.
  • Các công cụ Go giúp bạn quản lý phụ thuộc dễ dàng hơn, bao gồm lấy mã nguồn của module, nâng cấp, v.v. Xem các mục trong chủ đề này để biết thêm.

Tìm và import các package hữu ích

Bạn có thể tìm trên pkg.go.dev để tìm các package có những hàm mà bạn thấy hữu ích.

Khi đã tìm được package muốn dùng trong mã nguồn, hãy xác định đường dẫn package ở đầu trang và bấm nút Copy path để sao chép đường dẫn vào clipboard. Trong mã nguồn của bạn, dán đường dẫn đó vào một câu lệnh import, như ví dụ sau:

import "rsc.io/quote"

Sau khi mã nguồn của bạn import package, hãy bật theo dõi phụ thuộc và lấy mã nguồn của package để biên dịch cùng. Để biết thêm, xem Bật theo dõi phụ thuộc trong mã nguồn và Thêm một phụ thuộc.

Bật theo dõi phụ thuộc trong mã nguồn

Để theo dõi và quản lý các phụ thuộc bạn thêm vào, bạn bắt đầu bằng cách đặt mã nguồn của mình vào một module riêng. Việc này tạo ra tệp go.mod ở thư mục gốc của cây mã nguồn. Các phụ thuộc bạn thêm vào sẽ được liệt kê trong tệp đó.

Để thêm mã nguồn của bạn vào một module riêng, hãy dùng câu lệnh go mod init. Ví dụ, từ dòng lệnh, chuyển sang thư mục gốc của mã nguồn, rồi chạy câu lệnh như ví dụ sau:

$ go mod init example/mymodule

Đối số của câu lệnh go mod init là module path của module. Nếu có thể, module path nên là vị trí repository của mã nguồn của bạn.

Nếu ban đầu bạn chưa biết vị trí repository cuối cùng của module, hãy dùng một thay thế an toàn. Đó có thể là tên một tên miền bạn sở hữu hoặc một tên khác bạn kiểm soát (chẳng hạn tên công ty của bạn), kèm theo một đường dẫn dựa trên tên module hoặc thư mục mã nguồn. Để biết thêm, xem Đặt tên cho module.

Khi bạn dùng các công cụ Go để quản lý phụ thuộc, các công cụ này cập nhật tệp go.mod để nó duy trì danh sách phụ thuộc hiện tại của bạn.

Khi bạn thêm phụ thuộc, các công cụ Go cũng tạo tệp go.sum chứa checksum của các module bạn phụ thuộc vào. Go dùng tệp này để xác minh tính toàn vẹn của các tệp module đã tải xuống, đặc biệt với các lập trình viên khác đang làm việc trên dự án của bạn.

Hãy đưa tệp go.mod và go.sum vào repository cùng với mã nguồn của bạn.

Xem tài liệu tham khảo go.mod để biết thêm.

Đặt tên cho module

Khi bạn chạy go mod init để tạo một module nhằm theo dõi phụ thuộc, bạn chỉ định một module path đóng vai trò là tên của module. Module path trở thành tiền tố import path cho các package trong module. Hãy chắc chắn chỉ định một module path không xung đột với module path của các module khác.

Ở mức tối thiểu, một module path chỉ cần cho biết điều gì đó về nguồn gốc của nó, chẳng hạn tên công ty, tác giả hay chủ sở hữu. Nhưng đường dẫn này cũng có thể mô tả rõ hơn module là gì hoặc làm gì.

Module path thường có dạng sau:

<prefix>/<descriptive-text>
  • Phần prefix thường là một chuỗi mô tả một phần về module, chẳng hạn một chuỗi mô tả nguồn gốc của nó. Đó có thể là:

    • Vị trí của repository nơi các công cụ Go có thể tìm thấy mã nguồn của module (bắt buộc nếu bạn xuất bản module).

      Ví dụ, nó có thể là github.com/<project-name>/.

      Hãy dùng thực hành tốt này nếu bạn nghĩ mình có thể sẽ xuất bản module cho người khác dùng. Để biết thêm về việc xuất bản, xem Phát triển và xuất bản module.

    • Một tên bạn kiểm soát.

      Nếu bạn không dùng tên repository, hãy chắc chắn chọn một tiền tố mà bạn tin rằng người khác sẽ không dùng. Một lựa chọn tốt là tên công ty của bạn. Tránh những từ phổ thông như widgets, utilities, hay app.

  • Với phần descriptive text, một lựa chọn tốt là tên dự án. Hãy nhớ rằng tên package mới gánh phần lớn nhiệm vụ mô tả chức năng. Module path tạo ra một namespace cho những tên package đó.

Các tiền tố module path được dành riêng

Go bảo đảm rằng các chuỗi sau sẽ không được dùng trong tên package.

  • test – Bạn có thể dùng test làm tiền tố module path cho một module có mã nguồn được thiết kế để kiểm thử cục bộ các hàm trong một module khác.

    Hãy dùng tiền tố đường dẫn test cho các module được tạo ra như một phần của một bài kiểm thử. Ví dụ, chính bài kiểm thử của bạn có thể chạy go mod init test rồi thiết lập module đó theo một cách nhất định để kiểm thử với một công cụ phân tích mã nguồn Go.

  • example – Được dùng làm tiền tố module path trong một số tài liệu Go, chẳng hạn trong các hướng dẫn nơi bạn tạo một module chỉ để theo dõi phụ thuộc.

    Lưu ý rằng tài liệu Go cũng dùng example.com để minh hoạ khi ví dụ có thể là một module đã xuất bản.

Thêm một phụ thuộc

Khi bạn đã import các package từ một module đã xuất bản, bạn có thể thêm module đó để quản lý như một phụ thuộc bằng câu lệnh go get.

Câu lệnh này làm những việc sau:

  • Nếu cần, nó thêm chỉ thị require vào tệp go.mod cho các module cần thiết để build các package được nêu trên dòng lệnh. Chỉ thị require theo dõi phiên bản tối thiểu của một module mà module của bạn phụ thuộc vào. Xem tài liệu tham khảo go.mod để biết thêm.

  • Nếu cần, nó tải xuống mã nguồn của module để bạn có thể biên dịch các package phụ thuộc vào chúng. Nó có thể tải module từ một module proxy như proxy.golang.org hoặc trực tiếp từ các repository quản lý phiên bản. Mã nguồn được lưu vào bộ nhớ đệm cục bộ.

    Bạn có thể thiết lập vị trí mà các công cụ Go tải module về. Để biết thêm, xem Chỉ định máy chủ module proxy.

Dưới đây mô tả một vài ví dụ.

  • Để thêm tất cả phụ thuộc cho một package trong module của bạn, hãy chạy câu lệnh như bên dưới (“.” trỏ tới package trong thư mục hiện tại):

    $ go get .
  • Để thêm một phụ thuộc cụ thể, hãy chỉ định module path của nó làm đối số cho câu lệnh.

    $ go get example.com/theirmodule

Câu lệnh này cũng xác thực từng module mà nó tải xuống. Điều này bảo đảm module không bị thay đổi kể từ khi được xuất bản. Nếu module đã thay đổi kể từ khi xuất bản – ví dụ, lập trình viên đã thay đổi nội dung của commit – các công cụ Go sẽ báo một lỗi bảo mật. Việc kiểm tra xác thực này bảo vệ bạn khỏi những module có thể đã bị can thiệp.

Lấy một phiên bản phụ thuộc cụ thể

Bạn có thể lấy một phiên bản cụ thể của một module phụ thuộc bằng cách chỉ định phiên bản của nó trong câu lệnh go get. Câu lệnh này cập nhật chỉ thị require trong tệp go.mod của bạn (dù bạn cũng có thể cập nhật thủ công).

Bạn có thể muốn làm vậy nếu:

  • Bạn muốn lấy một phiên bản tiền phát hành cụ thể của một module để thử.
  • Bạn phát hiện phiên bản hiện đang yêu cầu không hoạt động được với bạn, nên bạn muốn lấy một phiên bản mà bạn biết mình có thể tin cậy.
  • Bạn muốn nâng cấp hoặc hạ cấp một module mà bạn đang yêu cầu.

Dưới đây là các ví dụ dùng câu lệnh go get:

  • Để lấy một phiên bản đánh số cụ thể, hãy thêm vào sau module path một dấu @ rồi đến phiên bản bạn muốn:

    $ go get example.com/[email protected]
  • Để lấy phiên bản mới nhất, hãy thêm @latest vào sau module path:

    $ go get example.com/theirmodule@latest

Ví dụ chỉ thị require trong tệp go.mod sau (xem tài liệu tham khảo go.mod để biết thêm) minh hoạ cách yêu cầu một số phiên bản cụ thể:

require example.com/theirmodule v1.3.4

Khám phá các bản cập nhật có sẵn

Bạn có thể kiểm tra xem có phiên bản mới hơn của những phụ thuộc bạn đang dùng trong module hiện tại hay không. Hãy dùng câu lệnh go list để hiển thị danh sách các phụ thuộc của module, kèm theo phiên bản mới nhất có sẵn cho module đó. Khi đã khám phá được các bản nâng cấp có sẵn, bạn có thể thử chúng với mã nguồn của mình để quyết định có nên nâng cấp lên phiên bản mới hay không.

Để biết thêm về câu lệnh go list, xem go list -m.

Dưới đây là một vài ví dụ.

  • Liệt kê tất cả module là phụ thuộc của module hiện tại, kèm theo phiên bản mới nhất có sẵn cho từng module:

    $ go list -m -u all
  • Hiển thị phiên bản mới nhất có sẵn cho một module cụ thể:

    $ go list -m -u example.com/theirmodule

Nâng cấp hoặc hạ cấp một phụ thuộc

Bạn có thể nâng cấp hoặc hạ cấp một module phụ thuộc bằng cách dùng công cụ Go để khám phá các phiên bản có sẵn, rồi thêm một phiên bản khác làm phụ thuộc.

  1. Để khám phá các phiên bản mới, hãy dùng câu lệnh go list như mô tả trong Khám phá các bản cập nhật có sẵn.

  2. Để thêm một phiên bản cụ thể làm phụ thuộc, hãy dùng câu lệnh go get như mô tả trong Lấy một phiên bản phụ thuộc cụ thể.

Đồng bộ các phụ thuộc của mã nguồn

Bạn có thể bảo đảm rằng mình đang quản lý phụ thuộc cho tất cả các package được import trong mã nguồn, đồng thời loại bỏ phụ thuộc cho những package bạn không còn import nữa.

Điều này có thể hữu ích khi bạn đã thay đổi mã nguồn và phụ thuộc, có thể tạo ra một tập hợp các phụ thuộc được quản lý và các module đã tải về không còn khớp với tập hợp mà các package được import trong mã nguồn thực sự cần.

Để giữ tập phụ thuộc được quản lý gọn gàng, hãy dùng câu lệnh go mod tidy. Dựa trên tập các package được import trong mã nguồn, câu lệnh này chỉnh sửa tệp go.mod để thêm các module cần thiết nhưng còn thiếu. Nó cũng loại bỏ các module không dùng đến, những module không cung cấp package liên quan nào.

Câu lệnh này không có đối số nào ngoài một cờ duy nhất, -v, in ra thông tin về các module bị loại bỏ.

$ go mod tidy

Phát triển và kiểm thử với mã module chưa xuất bản

Bạn có thể chỉ định rằng mã nguồn của mình nên dùng các module phụ thuộc có thể chưa được xuất bản. Mã nguồn của những module này có thể nằm trong repository tương ứng của chúng, trong một fork của những repository đó, hoặc trên ổ đĩa cùng với module hiện tại đang dùng chúng.

Bạn có thể muốn làm vậy khi:

  • Bạn muốn tự thay đổi mã nguồn của một module bên ngoài, chẳng hạn sau khi fork và/hoặc clone nó. Ví dụ, bạn có thể muốn chuẩn bị một bản sửa lỗi cho module, rồi gửi nó dưới dạng pull request tới lập trình viên của module đó.
  • Bạn đang xây dựng một module mới và chưa xuất bản nó, nên nó không có sẵn trên repository mà câu lệnh go get có thể truy cập.

Yêu cầu mã module trong một thư mục cục bộ

Bạn có thể chỉ định rằng mã nguồn của một module được yêu cầu nằm trên cùng ổ đĩa cục bộ với mã nguồn yêu cầu nó. Bạn có thể thấy điều này hữu ích khi bạn đang:

  • Phát triển module riêng tách biệt của bạn và muốn kiểm thử từ module hiện tại.
  • Sửa lỗi hoặc thêm tính năng cho một module bên ngoài và muốn kiểm thử từ module hiện tại. (Lưu ý rằng bạn cũng có thể yêu cầu module bên ngoài từ fork repository của chính bạn. Để biết thêm, xem Yêu cầu mã module bên ngoài từ fork repository của bạn.)

Để bảo các câu lệnh Go dùng bản sao cục bộ của mã nguồn module, hãy dùng chỉ thị replace trong tệp go.mod để thay thế module path được nêu trong một chỉ thị require. Xem tài liệu tham khảo go.mod để biết thêm về các chỉ thị.

Trong ví dụ tệp go.mod sau, module hiện tại yêu cầu module bên ngoài example.com/theirmodule, với một số phiên bản không tồn tại (v0.0.0-unpublished) được dùng để bảo đảm việc thay thế hoạt động đúng. Chỉ thị replace sau đó thay module path gốc bằng ../theirmodule, một thư mục nằm cùng cấp với thư mục của module hiện tại.

module example.com/mymodule

go 1.23.0

require example.com/theirmodule v0.0.0-unpublished

replace example.com/theirmodule v0.0.0-unpublished => ../theirmodule

Khi thiết lập một cặp require/replace, hãy dùng các câu lệnh go mod edit và go get để bảo đảm các yêu cầu được mô tả trong tệp luôn nhất quán:

$ go mod edit -replace=example.com/[email protected]=../theirmodule
$ go get example.com/[email protected]

Lưu ý: Khi bạn dùng chỉ thị replace, các công cụ Go không xác thực các module bên ngoài như mô tả trong Thêm một phụ thuộc.

Để biết thêm về số phiên bản, xem Đánh số phiên bản module.

Go 1.18 bổ sung chế độ workspace cho Go, cho phép bạn làm việc trên nhiều module cùng lúc. Xem Hướng dẫn: Bắt đầu với workspace nhiều module.

Yêu cầu mã module bên ngoài từ fork repository của bạn

Khi bạn đã fork repository của một module bên ngoài (chẳng hạn để sửa một lỗi trong mã nguồn của module hoặc để thêm một tính năng), bạn có thể để các công cụ Go dùng fork của bạn làm nguồn mã nguồn cho module đó. Điều này có thể hữu ích để kiểm thử các thay đổi từ mã nguồn của chính bạn. (Lưu ý rằng bạn cũng có thể yêu cầu mã module trong một thư mục nằm trên ổ đĩa cục bộ cùng với module yêu cầu nó. Để biết thêm, xem Yêu cầu mã module trong một thư mục cục bộ.)

Bạn làm việc này bằng cách dùng chỉ thị replace trong tệp go.mod để thay module path gốc của module bên ngoài bằng đường dẫn tới fork trong repository của bạn. Điều này hướng các công cụ Go dùng đường dẫn thay thế (vị trí của fork) khi biên dịch chẳng hạn, đồng thời cho phép bạn giữ nguyên các câu lệnh import theo module path gốc.

Để biết thêm về chỉ thị replace, xem tài liệu tham khảo tệp go.mod.

Trong ví dụ tệp go.mod sau, module hiện tại yêu cầu module bên ngoài example.com/theirmodule. Chỉ thị replace sau đó thay module path gốc bằng example.com/myfork/theirmodule, một fork của chính repository của module đó.

module example.com/mymodule

go 1.23.0

require example.com/theirmodule v1.2.3

replace example.com/theirmodule v1.2.3 => example.com/myfork/theirmodule v1.2.3-fixed

Khi thiết lập một cặp require/replace, hãy dùng các câu lệnh công cụ Go để bảo đảm các yêu cầu được mô tả trong tệp luôn nhất quán. Dùng câu lệnh go list để lấy phiên bản đang được module hiện tại dùng. Sau đó dùng câu lệnh go mod edit để thay module được yêu cầu bằng fork:

$ go list -m example.com/theirmodule
example.com/theirmodule v1.2.3
$ go mod edit -replace=example.com/[email protected]=example.com/myfork/[email protected]

Lưu ý: Khi bạn dùng chỉ thị replace, các công cụ Go không xác thực các module bên ngoài như mô tả trong Thêm một phụ thuộc.

Để biết thêm về số phiên bản, xem Đánh số phiên bản module.

Lấy một commit cụ thể bằng định danh repository

Bạn có thể dùng câu lệnh go get để thêm mã chưa xuất bản của một module từ một commit cụ thể trong repository của nó.

Để làm điều này, bạn dùng câu lệnh go get, chỉ định đoạn mã bạn muốn bằng dấu @. Khi bạn dùng go get, câu lệnh sẽ thêm vào tệp go.mod một chỉ thị require yêu cầu module bên ngoài, dùng một số pseudo-version dựa trên thông tin chi tiết về commit đó.

Các ví dụ sau đưa ra một vài minh hoạ. Chúng dựa trên một module có mã nguồn nằm trong một repository git.

  • Để lấy module tại một commit cụ thể, hãy thêm vào dạng @commithash:

    $ go get example.com/theirmodule@4cf76c2
  • Để lấy module tại một branch cụ thể, hãy thêm vào dạng @branchname:

    $ go get example.com/theirmodule@bugfixes

Loại bỏ một phụ thuộc

Khi mã nguồn của bạn không còn dùng package nào trong một module, bạn có thể ngừng theo dõi module đó như một phụ thuộc.

Để ngừng theo dõi tất cả module không dùng đến, hãy chạy câu lệnh go mod tidy. Câu lệnh này cũng có thể thêm những phụ thuộc còn thiếu cần cho việc build các package trong module của bạn.

$ go mod tidy

Để loại bỏ một phụ thuộc cụ thể, hãy dùng câu lệnh go get, chỉ định module path của module và thêm vào sau @none, như ví dụ sau:

$ go get example.com/theirmodule@none

Câu lệnh go get cũng sẽ hạ cấp hoặc loại bỏ các phụ thuộc khác vốn phụ thuộc vào module bị loại bỏ.

Phụ thuộc công cụ

Phụ thuộc công cụ cho phép bạn quản lý các công cụ lập trình được viết bằng Go và được dùng khi làm việc trên module của bạn. Ví dụ, bạn có thể dùng stringer cùng với go generate, hoặc một linter hay formatter cụ thể như một phần của quá trình chuẩn bị thay đổi để gửi đi.

Trong Go 1.24 trở lên, bạn có thể thêm một phụ thuộc công cụ bằng:

$ go get -tool golang.org/x/tools/cmd/stringer

Việc này sẽ thêm một chỉ thị tool vào tệp go.mod của bạn, và bảo đảm các chỉ thị require cần thiết có mặt. Khi chỉ thị này đã được thêm, bạn có thể chạy công cụ bằng cách truyền thành phần cuối cùng không phải hậu tố phiên bản chính của import path của công cụ cho go tool:

$ go tool stringer

Trong trường hợp nhiều công cụ dùng chung đoạn đường dẫn cuối, hoặc đoạn đường dẫn đó trùng với một trong các công cụ đi kèm bản phân phối Go, bạn phải truyền đầy đủ đường dẫn package thay thế:

$ go tool golang.org/x/tools/cmd/stringer

Để xem danh sách tất cả công cụ hiện có sẵn, hãy chạy go tool mà không có đối số:

$ go tool

Bạn có thể thêm thủ công một chỉ thị tool vào go.mod của mình, nhưng bạn phải bảo đảm có một chỉ thị require cho module định nghĩa công cụ đó. Cách dễ nhất để thêm bất kỳ chỉ thị require nào còn thiếu là chạy:

$ go mod tidy

Các yêu cầu cần thiết để thoả mãn phụ thuộc công cụ hành xử như mọi yêu cầu khác trong đồ thị module của bạn. Chúng tham gia vào chọn phiên bản tối thiểu và tuân theo các chỉ thị require, replace và exclude. Do việc tỉa bớt module, khi bạn phụ thuộc vào một module mà bản thân nó có phụ thuộc công cụ, những yêu cầu chỉ tồn tại để thoả mãn phụ thuộc công cụ đó thường không trở thành yêu cầu của module của bạn.

Meta-pattern tool cung cấp một cách để thực hiện thao tác trên tất cả công cụ cùng lúc. Ví dụ, bạn có thể nâng cấp mọi công cụ bằng go get tool, tương đương với go get tool@upgrade, hoặc cài đặt tất cả chúng vào $GOBIN bằng go install tool.

Trong các phiên bản Go trước 1.24, bạn có thể đạt được điều gì đó tương tự chỉ thị tool bằng cách thêm một import trống vào một tệp go trong module vốn bị loại khỏi quá trình build bằng build constraint. Nếu bạn làm vậy, bạn có thể dùng go run với đường dẫn package đầy đủ để chạy công cụ.

Chỉ định máy chủ module proxy

Khi bạn dùng các công cụ Go để làm việc với module, theo mặc định các công cụ này tải module từ proxy.golang.org (một module mirror công khai do Google vận hành) hoặc trực tiếp từ repository của module. Bạn có thể chỉ định rằng các công cụ Go nên dùng một máy chủ proxy khác để tải xuống và xác thực module.

Bạn có thể muốn làm vậy nếu bạn (hoặc nhóm của bạn) đã thiết lập hoặc chọn một máy chủ module proxy khác mà bạn muốn dùng. Ví dụ, một số người thiết lập máy chủ module proxy để kiểm soát tốt hơn cách các phụ thuộc được sử dụng.

Để chỉ định một máy chủ module proxy khác cho các công cụ Go dùng, hãy đặt biến môi trường GOPROXY thành URL của một hoặc nhiều máy chủ. Các công cụ Go sẽ thử từng URL theo thứ tự bạn chỉ định. Theo mặc định, GOPROXY chỉ định một module proxy công khai do Google vận hành trước, rồi mới tải trực tiếp từ repository của module (như được nêu trong module path của nó):

GOPROXY="https://proxy.golang.org,direct"

Để biết thêm về biến môi trường GOPROXY, bao gồm các giá trị hỗ trợ hành vi khác, xem tài liệu tham khảo câu lệnh go.

Bạn có thể đặt biến này thành URL của các máy chủ module proxy khác, ngăn cách các URL bằng dấu phẩy hoặc dấu gạch đứng.

  • Khi bạn dùng dấu phẩy, các công cụ Go chỉ thử URL tiếp theo trong danh sách nếu URL hiện tại trả về HTTP 404 hoặc 410.

    GOPROXY="https://proxy.example.com,https://proxy2.example.com"
  • Khi bạn dùng dấu gạch đứng, các công cụ Go sẽ thử URL tiếp theo trong danh sách bất kể mã lỗi HTTP là gì.

    GOPROXY="https://proxy.example.com|https://proxy2.example.com"

Go module thường được phát triển và phân phối trên các máy chủ quản lý phiên bản và module proxy không có sẵn trên internet công cộng. Bạn có thể đặt biến môi trường GOPRIVATE để cấu hình câu lệnh go tải xuống và build module từ các nguồn riêng tư. Khi đó câu lệnh go có thể tải xuống và build module từ các nguồn riêng tư.

Các biến môi trường GOPRIVATE hoặc GONOPROXY có thể được đặt thành danh sách các mẫu glob khớp với các tiền tố module là riêng tư và không nên được yêu cầu từ bất kỳ proxy nào. Ví dụ:

GOPRIVATE=*.corp.example.com,*.research.example.com

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.