2012-12-27 16 views
11

Questo funziona.Perché il tipo di canale ha un '<-' in esso?

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

Tuttavia, questo non.

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

Perché ho bisogno di un <- nella mia dichiarazione di tipo per un canale? Ho pensato che <- fosse per la scrittura o la lettura da un canale. Perché dovrebbe apparire in un tipo?

risposta

19

I canali possono avere un tipo che indica se è di sola lettura, writeonly o entrambi.

L'indicazione di una direzione del canale viene eseguita con < - come parte del tipo o omessa per un canale di lettura/scrittura.

Così il <- in <-chan time.Time fa parte del tipo,

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 

e time.Tick(1e8) restituisce una sola lettura del canale.

Maggiori informazioni nella specifica lingua here

+1

@ david-faux, si noti inoltre che è possibile utilizzare solo "tick: = time.Tick (1e8)' e fare in modo che il compilatore derivi automaticamente il tipo corretto per "tick". Questo approccio riduce anche il disordine. – kostix

4

Un buon modo di pensare a canali è come tubi con due estremità. Un'estremità è dove gli eventi fluiscono e l'altro dove defluiscono. Quindi dichiarare un canale, ad es.

var c = make(chan int) 

crea un canale nel suo insieme - cioè con entrambe le estremità. Viceversa,

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

definisce una funzione con un parametro di ingresso del canale - cioè l'estremità leggibile di un canale, e

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

definisce una funzione con un parametro di uscita del canale - cioè l'estremità scrivibile di un canale . Entrambe queste funzioni possono avere l'intero canale passato come parametro effettivo o solo la fine di cui hanno bisogno.

Lo stesso principio generale si applica quando i canali vengono utilizzati come variabili locali o come campi nelle strutture.

È buona norma utilizzare la sintassi di fine canale laddove possibile, perché il compilatore sarà in grado di controllare in modo più approfondito di aver scritto ciò che si desiderava.

È interessante notare che il linguaggio di programmazione occam ha anche una sintassi equivalente per indicare quale fine di un canale è quale.

0

Mentre è possibile dichiarare una variabile di canale "sola lettura" o "solo scrittura" effettiva, è inutile farlo, perché non è possibile fare nulla con loro.

La sintassi "solo lettura" e "sola scrittura" è per i parametri di funzione. Questa sintassi è più simile a "const" in C oa "in" e "out" in Ada.

Né i canali Go Do hanno due "fini". I pipe UNIX hanno due descrittori di file, uno per ciascuna estremità. La stessa variabile di tipo di canale viene utilizzata sia per la lettura che per la scrittura.

Problemi correlati