Luồng thực thi của một chương trình Go
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, khimain
đã 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àminit
, tiếp theo chương trình đi vào hàmmain.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
.