Luồng thực thi của một chương trình Go

Luu Duc Hoang
2 min readSep 5, 2019

--

Việc khởi tạo và thực thi chương trình Go luôn bắt đầu từ hàm main.main. Nếu package main có import các package khác, chúng sẽ được thêm vào package main theo thứ tự khai báo.

init không phải là hàm thông thường, nó có thể có nhiều định nghĩa, và các hàm khác không thể sử dụng nó.

  • Nếu một package được import nhiều lần, sẽ chỉ được tính là một khi thực thi.
  • Khi một package được import mà nó lại import các package khác, trước tiên Go sẽ import các package khác đó trước, sau đó khởi tạo các hằng và biến của package, rồi gọi hàm init trong từng package.
  • Nếu một package có nhiều hàm init và thứ tự gọi không được xác định cụ thể thì chúng sẽ được gọi theo thứ tự xuất hiện. Cuối cùng, khi main đã có đủ tất cả hằng và biến ở package-level thì nó sẽ được khởi tạo bằng cách thực thi hàm init, tiếp theo chương trình đi vào hàm main.main và bắt đầu thực thi. Hình dưới đây là sơ đồ nguyên lý một chuỗi bắt đầu của chương trình hàm trong Go:

Tiến trình khởi tạo package

Cần lưu ý rằng trước khi hàm nào khác được thực thi thì tất cả code đều chạy trong cùng một Goroutine main.main, đây là thread chính của chương trình. Do đó, nếu một Goroutine khởi chạy trong hàm main.main thì nó chỉ có thể được thực thi sau khi vào chương trình đã thực thi xong init.

--

--