Cấu trúc dữ liệu cơ bản cần xem mã nguồn, phiên bản là go 1.9.2:
Ý nghĩa của các trường đã được ghi trong chú thích, và sau đây là một số trường quan trọng:
buf trỏ đến mảng vòng lặp dưới cùng, chỉ có chan có bộ nhớ đệm mới có.
sendx, recvx đều trỏ đến mảng vòng lặp dưới cùng, đại diện cho chỉ số vị trí hiện tại có thể gửi và nhận (tương đối với mảng dưới cùng).
sendq, recvq lần lượt đại diện cho các goroutine bị chặn, các goroutine này bị chặn vì đã cố gắng đọc từ channel hoặc gửi dữ liệu vào channel.
waitq là một danh sách liên kết hai chiều của sudog, và sudog thực tế là một gói của goroutine:
lock được sử dụng để đảm bảo mỗi hoạt động đọc channel hoặc ghi channel đều là nguyên tử.
Ví dụ, cấu trúc dữ liệu của một channel có dung lượng 6 và kiểu phần tử là int như sau:
Tạo
Chúng ta biết rằng kênh có hai hướng, gửi và nhận. Lý thuyết thì chúng ta có thể tạo một kênh chỉ để gửi hoặc chỉ để nhận, nhưng sau khi tạo ra kênh như vậy, chúng ta sẽ sử dụng nó như thế nào? Làm sao để nhận dữ liệu từ một kênh chỉ gửi hoặc gửi dữ liệu vào một kênh chỉ nhận?
Nhìn chung, chúng ta sử dụng make để tạo một kênh có thể gửi và nhận:
Dựa trên phân tích hợp ngữ, chúng ta biết rằng hàm cuối cùng để tạo kênh là makechan:
Dựa trên nguyên mẫu hàm, kênh được tạo ra là một con trỏ. Vì vậy, chúng ta có thể truyền kênh trực tiếp giữa các hàm mà không cần truyền con trỏ của kênh.
Xem xét mã sau:
Sau khi tạo một kênh mới, bộ nhớ được phân bổ trên heap, nó sẽ trông như thế này: