le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Le goroutine vengono eseguite nello stesso spazio di indirizzi, quindi l'accesso alla memoria condivisa deve essere sincronizzato.Le goroutine condividono la memoria attraverso la comunicazione, piuttosto che condividendo la memoria.
Il canale del tipo di riferimento è un'implementazione specifica della modalità CSP e viene utilizzato per la comunicazione con più goroutine. Implementa la sincronizzazione internamente per garantire la sicurezza della concorrenza.
Come map, anche channel è un riferimento alla struttura dati sottostante creata da make.
Quando copiamo un canale o lo utilizziamo per il passaggio di parametri di funzione, copiamo semplicemente un riferimento al canale, in modo che il chiamante e il chiamato facciano riferimento allo stesso oggetto canale. Come altri tipi di riferimento, il valore zero del canale è nil.
Quando definisci un canale, devi anche definire il tipo di valori inviati al canale. I canali possono essere creati utilizzando la funzione make() incorporata:
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
Per impostazione predefinita, il canale si blocca durante la ricezione e l'invio di dati, a meno che l'altra estremità non sia pronta, rendendo la sincronizzazione della goroutine più semplice senza la necessità di blocchi espliciti.
Un canale senza buffer è un canale che non ha la capacità di salvare alcun valore prima di ricevere.
Questo tipo di canale richiede che la goroutine di invio e quella di ricezione siano pronte contemporaneamente a completare le operazioni di invio e ricezione. Se due goroutine non sono pronte contemporaneamente, il canale farà sì che la goroutine che esegue per prima l'operazione di invio o ricezione si blocchi e attenda.
Questa interazione di invio e ricezione sul canale è intrinsecamente sincrona. Nessuna operazione può esistere indipendentemente dall’altra.
La figura seguente mostra come due goroutine possono condividere un valore utilizzando canali senza buffer:
make (chan Type)//等价于make (chan Type,0)
Se non viene specificata la dimensione del buffer, il canale è sincrono e pertanto si blocca finché il mittente non è pronto a inviare e il destinatario è pronto a ricevere.
Un canale bufferizzato è un canale che può memorizzare uno o più valori prima di essere ricevuto.
Questo tipo di canale non richiede che la goroutine debba completare l'invio e la ricezione allo stesso tempo. I canali avranno anche condizioni diverse che bloccano le azioni di invio e ricezione. L'azione di ricezione verrà bloccata solo se nel canale non è presente alcun valore da ricevere. L'azione di invio si bloccherà solo se il canale non ha buffer disponibile per accogliere il valore inviato.
Ciò porta a una grande differenza tra canali con buffer e senza buffer: i canali senza buffer garantiscono che le goroutine di invio e ricezione scambieranno dati allo stesso tempo: i canali con buffer non hanno tale garanzia.
make (chan Type,capacity)
Se viene fornita una capacità buffer, il canale è asincrono. Finché il buffer ha spazio inutilizzato per l'invio di dati o contiene dati che possono essere ricevuti, la comunicazione procede senza blocchi.
Il canale può utilizzare ok per rilevare se il canale è ancora aperto. Se il canale è chiuso, i dati non verranno letti.
num ,ok:=<-ch
Può rilevare se un canale è chiuso.Per impostazione predefinita, il canale è a doppia domanda, ovvero è possibile inviargli dati e riceverli.
Tuttavia, spesso vediamo un canale passato come parametro e si prevede che il valore venga utilizzato in una direzione, solo per inviare dati o solo per ricevere dati. A questo punto, possiamo specificare la direzione del canale. La dichiarazione di una variabile chamel unidirezionale è molto semplice, come segue:
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- significa che i dati entrano nella pipe e vengono scritti nella pipe, che viene inviata al chiamante.
<-chan indica che i dati escono dalla pipe. Per il chiamante, vengono ottenuti i dati dalla pipe, che ovviamente è l'input.
Un canale può essere implicitamente convertito in una coda unidirezionale, solo in ricezione o solo in invio, ma un canale unidirezionale non può essere convertito in un canale normale;