☰ 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)

Gọi mã của bạn từ một module khác

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

Ở phần trước, bạn đã tạo module greetings. Trong phần này, bạn sẽ viết mã để gọi hàm Hello trong module vừa viết. Bạn sẽ viết mã có thể chạy được như một ứng dụng, và mã đó gọi vào module greetings.

Lưu ý: Chủ đề này là một phần của loạt hướng dẫn nhiều phần, bắt đầu từ Tạo một Go module.

  1. Tạo thư mục hello cho mã nguồn Go module của bạn. Đây là nơi bạn sẽ viết phía gọi.

    Sau khi tạo thư mục này, bạn sẽ có cả thư mục hello và thư mục greetings nằm cùng cấp trong cây thư mục, như sau:

    <home>/
     |-- greetings/
     |-- hello/

    Ví dụ, nếu dòng lệnh của bạn đang ở trong thư mục greetings, bạn có thể dùng các lệnh sau:

    cd ..
    mkdir hello
    cd hello
  2. Bật theo dõi phụ thuộc cho đoạn mã bạn sắp viết.

    Để bật theo dõi phụ thuộc, hãy chạy lệnh go mod init, kèm theo tên module mà mã của bạn sẽ nằm trong đó.

    Trong phạm vi bài hướng dẫn này, hãy dùng example.com/hello làm module path.

    $ go mod init example.com/hello
    go: creating new go.mod: module example.com/hello
  3. Trong trình soạn thảo, ở thư mục hello, hãy tạo một tệp để viết mã và đặt tên là hello.go.

  4. Viết mã để gọi hàm Hello, rồi in ra giá trị trả về của hàm.

    Để làm điều đó, hãy dán đoạn mã sau vào hello.go.

    package main
    
    import (
        "fmt"
    
        "example.com/greetings"
    )
    
    func main() {
        // Get a greeting message and print it.
        message := greetings.Hello("Gladys")
        fmt.Println(message)
    }

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

    • Khai báo package main. Trong Go, mã được chạy như một ứng dụng bắt buộc phải nằm trong package main.
    • Import hai package: example.com/greetings và package fmt. Việc này cho phép mã của bạn truy cập các hàm trong những package đó. Import example.com/greetings (package nằm trong module bạn đã tạo trước đó) cho bạn quyền truy cập hàm Hello. Bạn cũng import fmt, chứa các hàm xử lý văn bản đầu vào và đầu ra (chẳng hạn in văn bản ra console).
    • Lấy một lời chào bằng cách gọi hàm Hello của package greetings.
  5. Sửa module example.com/hello để nó dùng module example.com/greetings cục bộ của bạn.

    Khi chạy thật, bạn sẽ publish module example.com/greetings từ repository của nó (với module path phản ánh vị trí đã publish), nơi các công cụ Go có thể tìm thấy và tải về. Còn hiện tại, vì bạn chưa publish module, bạn cần điều chỉnh module example.com/hello để nó tìm được mã example.com/greetings trên hệ thống tệp cục bộ.

    Để làm vậy, hãy dùng lệnh go mod edit để sửa module example.com/hello, chuyển hướng các công cụ Go từ module path (nơi không có module) sang thư mục cục bộ (nơi thật sự có module).

    1. Từ dòng lệnh trong thư mục hello, chạy lệnh sau:

      $ go mod edit -replace example.com/greetings=../greetings

      Lệnh này chỉ định rằng example.com/greetings sẽ được thay bằng ../greetings khi cần định vị phụ thuộc. Sau khi chạy lệnh, tệp go.mod trong thư mục hello sẽ chứa một chỉ thị replace:

      module example.com/hello
      
      go 1.16
      
      replace example.com/greetings => ../greetings
    2. Từ dòng lệnh trong thư mục hello, chạy lệnh go mod tidy để đồng bộ các phụ thuộc của module example.com/hello, bổ sung những phụ thuộc mà mã cần nhưng module chưa theo dõi.

      $ go mod tidy
      go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000

      Sau khi lệnh chạy xong, tệp go.mod của module example.com/hello sẽ trông như thế này:

      module example.com/hello
      
      go 1.16
      
      replace example.com/greetings => ../greetings
      
      require example.com/greetings v0.0.0-00010101000000-000000000000

      Lệnh đã tìm thấy mã cục bộ trong thư mục greetings, rồi thêm chỉ thị require để chỉ định rằng example.com/hello yêu cầu example.com/greetings. Bạn đã tạo ra phụ thuộc này khi import package greetings trong hello.go.

      Con số đứng sau module path là một pseudo-version number – số phiên bản được sinh tự động, dùng thay cho số phiên bản ngữ nghĩa (mà module này chưa có).

      Để tham chiếu tới một module đã publish, tệp go.mod thường sẽ bỏ chỉ thị replace và dùng chỉ thị require với số phiên bản đã gắn tag ở cuối.

      require example.com/greetings v1.1.0

      Tìm hiểu thêm về số phiên bản tại Đánh số phiên bản module.

  6. Tại dòng lệnh trong thư mục hello, chạy mã của bạn để xác nhận nó hoạt động.

    $ go run .
    Hi, Gladys. Welcome!

Chúc mừng! Bạn đã viết được hai module hoạt động được.

Ở chủ đề tiếp theo, bạn sẽ thêm phần xử lý lỗi.

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.