☰ 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ữ
Hướng dẫn (Tutorials)

Hướng dẫn: Tạo một Go module

Bản dịch từ go.dev/doc/tutorial/create-module

Đây là phần đầu tiên của loạt hướng dẫn giới thiệu một vài tính năng nền tảng của ngôn ngữ Go. Nếu bạn mới bắt đầu với Go, hãy chắc chắn đã xem qua Hướng dẫn: Bắt đầu với Go, bài đó giới thiệu lệnh go, Go module, và những đoạn mã Go rất đơn giản.

Trong bài hướng dẫn này, bạn sẽ tạo hai module. Module thứ nhất là một thư viện, được dùng để các thư viện hoặc ứng dụng khác import vào. Module thứ hai là một ứng dụng gọi, sẽ sử dụng module thứ nhất.

Chuỗi bài này gồm bảy chủ đề ngắn, mỗi chủ đề minh hoạ một phần khác nhau của ngôn ngữ.

  1. Tạo một module – Viết một module nhỏ với các hàm mà bạn có thể gọi từ module khác.
  2. Gọi mã của bạn từ một module khác – Import và sử dụng module mới của bạn.
  3. Trả về và xử lý lỗi – Thêm phần xử lý lỗi đơn giản.
  4. Trả về lời chào ngẫu nhiên – Xử lý dữ liệu trong slice (mảng có kích thước động của Go).
  5. Trả về lời chào cho nhiều người – Lưu các cặp khoá/giá trị trong map.
  6. Thêm một test – Dùng các tính năng unit testing có sẵn của Go để kiểm thử mã của bạn.
  7. Biên dịch và cài đặt ứng dụng – Biên dịch và cài đặt mã của bạn trên máy cục bộ.

Lưu ý: Xem các bài hướng dẫn khác tại Hướng dẫn.

Yêu cầu trước khi bắt đầu

  • Một chút kinh nghiệm lập trình. Mã ở đây khá đơn giản, nhưng sẽ dễ hơn nếu bạn đã biết đôi chút về hàm, vòng lặp và mảng.
  • Go. Chúng tôi khuyến nghị dùng phiên bản Go mới nhất để theo bài hướng dẫn này. Xem hướng dẫn cài đặt tại Cài đặt Go.
  • Một công cụ để soạn mã. Bất kỳ trình soạn thảo văn bản nào bạn có đều dùng được. Hầu hết trình soạn thảo đều hỗ trợ Go tốt. Phổ biến nhất là VSCode (miễn phí), GoLand (trả phí) và Vim (miễn phí).
  • Một cửa sổ dòng lệnh. Go chạy tốt với mọi terminal trên Linux và Mac, và với PowerShell hoặc cmd trên Windows.

Khởi tạo một module để người khác dùng được

Hãy bắt đầu bằng việc tạo một Go module. Trong một module, bạn tập hợp một hoặc nhiều package liên quan thành một bộ hàm riêng biệt và hữu ích. Ví dụ, bạn có thể tạo một module chứa các package có hàm phục vụ phân tích tài chính, để những người viết ứng dụng tài chính khác dùng được thành quả của bạn. Tìm hiểu thêm về phát triển module tại Phát triển và publish module.

Mã Go được nhóm thành package, và package được nhóm thành module. Module của bạn chỉ định những phụ thuộc cần thiết để chạy mã, bao gồm cả phiên bản Go và tập hợp các module khác mà nó yêu cầu.

Khi bạn bổ sung hoặc cải tiến chức năng trong module, bạn publish các phiên bản mới của module. Những lập trình viên viết mã gọi hàm trong module của bạn có thể import các package đã cập nhật và kiểm thử với phiên bản mới trước khi đưa vào chạy thật.

  1. Mở cửa sổ dòng lệnh và cd về thư mục home của bạn.

    Trên Linux hoặc Mac:

    cd

    Trên Windows:

    cd %HOMEPATH%
  2. Tạo thư mục greetings cho mã nguồn Go module của bạn.

    Ví dụ, từ thư mục home, dùng các lệnh sau:

    mkdir greetings
    cd greetings
  3. Khởi tạo module bằng lệnh go mod init.

    Chạy lệnh go mod init kèm theo module path của bạn – ở đây, hãy dùng example.com/greetings. Nếu bạn publish một module, đây bắt buộc phải là một đường dẫn mà từ đó các công cụ Go tải được module của bạn về. Đó chính là repository chứa mã của bạn.

    Tìm hiểu thêm về cách đặt tên module bằng module path tại Quản lý phụ thuộc.

    $ go mod init example.com/greetings
    go: creating new go.mod: module example.com/greetings

    Lệnh go mod init tạo ra tệp go.mod để theo dõi các phụ thuộc của mã. Đến lúc này, tệp mới chỉ chứa tên module và phiên bản Go mà mã của bạn hỗ trợ. Nhưng khi bạn thêm phụ thuộc, tệp go.mod sẽ liệt kê các phiên bản mà mã của bạn phụ thuộc vào. Điều này giúp việc build có thể tái lập được và cho bạn quyền kiểm soát trực tiếp phiên bản module nào được sử dụng.

  4. Trong trình soạn thảo, hãy tạo một tệp để viết mã và đặt tên là greetings.go.

  5. Dán đoạn mã sau vào tệp greetings.go rồi lưu lại.

    package greetings
    
    import "fmt"
    
    // Hello returns a greeting for the named person.
    func Hello(name string) string {
        // Return a greeting that embeds the name in a message.
        message := fmt.Sprintf("Hi, %v. Welcome!", name)
        return message
    }

    Đây là đoạn mã đầu tiên cho module của bạn. Nó trả về một lời chào cho bất kỳ phía gọi nào yêu cầu. Bạn sẽ viết mã gọi hàm này ở bước tiếp theo.

    Trong đoạn mã này, bạn:

    • Khai báo package greetings để gom các hàm liên quan lại với nhau.

    • Hiện thực hàm Hello để trả về lời chào.

      Hàm này nhận tham số name có kiểu string. Hàm cũng trả về một string. Trong Go, một hàm có tên bắt đầu bằng chữ in hoa có thể được gọi bởi hàm không nằm cùng package. Trong Go, đây gọi là tên được export (exported name). Tìm hiểu thêm về tên được export tại Exported names trong Go tour.

      Cú pháp hàm func Hello(name string) string: Hello là tên hàm, string trong ngoặc là kiểu tham số, string cuối cùng là kiểu trả về

    • Khai báo biến message để giữ lời chào của bạn.

      Trong Go, toán tử := là cách viết tắt để khai báo và khởi tạo một biến chỉ trong một dòng (Go dùng giá trị ở vế phải để xác định kiểu của biến). Nếu viết theo cách dài dòng, bạn sẽ viết thành:

      var message string
      message = fmt.Sprintf("Hi, %v. Welcome!", name)
    • Dùng hàm Sprintf của package fmt để tạo thông điệp chào. Đối số đầu tiên là một chuỗi định dạng, và Sprintf sẽ thay giá trị của tham số name vào động từ định dạng %v. Việc chèn giá trị của tham số name hoàn thiện nội dung lời chào.

    • Trả về nội dung lời chào đã định dạng cho phía gọi.

Ở bước tiếp theo, bạn sẽ gọi hàm này từ một module khác.

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.