2012-12-27 18 views
11

Tính năng này hoạt động.Tại sao loại kênh có '<-' trong đó?

var tick <-chan time.Time = time.Tick(1e8) 

Tuy nhiên, điều này không.

var tick chan time.Time = time.Tick(1e8) 

Tại sao tôi cần <- trong khai báo loại cho kênh? Tôi nghĩ rằng <- là để viết hoặc đọc từ một kênh. Tại sao nó xuất hiện trong một loại?

Trả lời

19

Kênh có thể có loại cho biết đó là chỉ đọc, viết hoặc cả hai.

Cho biết hướng kênh được thực hiện với < - như một phần của loại hoặc bị bỏ qua cho kênh đọc/ghi.

Vì vậy, các <- trong <-chan time.Time là một phần của các loại,

chan time.Time //Would be a read/writable channel 
chan<- time.Time // Would be a write only channel 
<-chan time.Time // Would be a read only channel 

time.Tick(1e8) lợi nhuận một kênh chỉ đọc.

Read more trong spec ngôn ngữ here

+1

@ david-faux, cũng lưu ý rằng bạn chỉ có thể sử dụng 'tick: = time.Tick (1e8)' và có trình biên dịch lấy được loại chính xác cho 'tick' tự động. Cách tiếp cận này cũng làm giảm đáng kể sự lộn xộn. – kostix

4

Một cách tốt để suy nghĩ của các kênh truyền hình là như ống với hai đầu. Một đầu là nơi các sự kiện chảy vào và nơi khác mà chúng chảy ra. Vì vậy, tuyên bố một kênh, ví dụ:

var c = make(chan int) 

tạo toàn bộ kênh - tức là với cả hai đầu. Ngược lại,

func consume(c <-chan int) { 
    ... 
} 

định nghĩa một hàm với một tham số kênh đầu vào - tức là khi kết thúc có thể đọc được của một kênh, và

func generate(c chan<- int) { 
    ... 
} 

định nghĩa một hàm với tham số đầu ra kênh - tức là khi kết thúc ghi của một kênh . Cả hai chức năng này có thể có toàn bộ kênh truyền qua như thông số thực tế của chúng, hoặc chỉ là kết thúc mà chúng cần.

Nguyên tắc chung tương tự áp dụng khi kênh được sử dụng làm biến cục bộ hoặc dưới dạng trường trong cấu trúc.

Thực hành tốt là sử dụng cú pháp cuối kênh bất cứ khi nào có thể, bởi vì trình biên dịch sẽ có thể kiểm tra kỹ hơn rằng bạn đã viết những gì bạn dự định.

Điều thú vị là ngôn ngữ lập trình occam cũng có cú pháp tương đương để đánh dấu phần cuối của kênh.

0

Trong khi bạn có thể khai báo biến kênh "chỉ đọc" hoặc "chỉ ghi" thực sự, thật vô ích khi làm như vậy, bởi vì bạn không thể làm bất cứ điều gì với chúng.

Cú pháp "chỉ đọc" và "viết chỉ" là dành cho tham số chức năng. Cú pháp này giống như "const" trong C hoặc "in" và "out" trong Ada.

Các kênh Go cũng không có hai "kết thúc". Các đường ống UNIX có hai bộ mô tả tập tin, một cho mỗi đầu. Biến cùng loại của kênh được sử dụng cho cả đọc và viết.

Các vấn đề liên quan