2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Gorutiinit toimivat samassa osoitetilassa, joten pääsy jaettuun muistiin on synkronoitava.Gorutiinit jakavat muistia kommunikoinnin kautta muistin jakamisen sijaan.
Viitetyyppinen kanava on CSP-tilan erityinen toteutus, ja sitä käytetään useaan goritiiniviestintään. Se toteuttaa synkronoinnin sisäisesti varmistaakseen samanaikaisuuden turvallisuuden.
Kuten kartta, kanava on myös viittaus taustalla olevaan datarakenteeseen, jonka make luo.
Kun kopioimme kanavan tai käytämme sitä funktioparametrien välittämiseen, kopioimme vain kanavaviittauksen, joten kutsuja ja kutsuttava viittaavat samaan kanavaobjektiin. Kuten muutkin viitetyypit, kanavan nolla-arvo on nolla.
Kun määrität kanavaa, sinun on myös määritettävä kanavalle lähetettävien arvojen tyyppi. Kanavia voidaan luoda käyttämällä sisäänrakennettua make()-funktiota:
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
Oletusarvoisesti kanava estää tietojen vastaanottamisen ja lähettämisen, ellei toinen pää ole valmis, mikä tekee gorutiinin synkronoinnista yksinkertaisempaa ilman erityisiä lukituksia.
Puskuroimaton kanava on kanava, jolla ei ole kykyä tallentaa arvoa ennen vastaanottamista.
Tämäntyyppinen kanava edellyttää, että lähetysgorutiini ja vastaanottogorutiini ovat valmiita samanaikaisesti suorittamaan lähetys- ja vastaanottotoiminnot. Jos kaksi gorutiinia ei ole valmiina samanaikaisesti, kanava saa kanavan, joka suorittaa ensin lähetys- tai vastaanottotoiminnon, estämään ja odottamaan.
Tämä kanavalle lähettämisen ja vastaanottamisen vuorovaikutus on luonnostaan synkronista. Mikään operaatio ei voi olla olemassa toisesta riippumatta.
Seuraava kuva näyttää, kuinka kaksi goritiinia voivat jakaa arvon puskuroimattomia kanavia käyttämällä:
make (chan Type)//等价于make (chan Type,0)
Jos puskurin kokoa ei ole määritetty, kanava on synkroninen ja siksi estetään, kunnes lähettäjä on valmis lähettämään ja vastaanottaja on valmis vastaanottamaan.
Puskuroitu kanava on kanava, joka voi tallentaa yhden tai useamman arvon ennen sen vastaanottamista.
Tämäntyyppinen kanava ei edellytä, että gorutiinin on suoritettava lähetys ja vastaanotto samanaikaisesti. Kanavilla on myös erilaisia ehtoja, jotka estävät lähetys- ja vastaanottotoiminnot. Vastaanottotoiminto estyy vain, jos kanavalla ei ole vastaanottavaa arvoa. Lähetystoiminto estetään vain, jos kanavalla ei ole käytettävissä puskuria lähetettävän arvon vastaanottamiseksi.
Tämä johtaa suureen eroon puskuroitujen ja puskuroimattomien kanavien välillä: puskuroimattomat kanavat takaavat, että lähetys- ja vastaanottamisgorutiinit vaihtavat tietoja samanaikaisesti: puskuroiduilla kanavilla ei ole tällaista takuuta.
make (chan Type,capacity)
Jos puskurikapasiteetti annetaan, kanava on asynkroninen. Niin kauan kuin puskurissa on käyttämätöntä tilaa tiedon lähettämiseen tai se sisältää dataa, joka voidaan vastaanottaa, viestintä etenee ilman estoa.
Kanava voi havaita ok-painikkeella, onko kanava edelleen auki. Jos kanava on suljettu, tietoja ei lueta.
num ,ok:=<-ch
Voi havaita, onko kanava suljettu.Kanava on oletusarvoisesti kaksoiskysymys, eli voit lähettää siihen dataa ja vastaanottaa sieltä dataa.
Näemme kuitenkin usein parametrina välitetyn kanavan ja arvoa oletetaan käytettävän yhteen suuntaan, joko vain tiedon lähettämiseen tai vain tiedon vastaanottamiseen. Tällä hetkellä voimme määrittää kanavan suunnan. Yksisuuntaisen kamelimuuttujan ilmoitus on hyvin yksinkertainen, seuraavasti:
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- tarkoittaa, että data tulee putkeen ja tiedot kirjoitetaan putkeen, joka lähetetään soittajalle.
<-chan ilmaisee, että data tulee putkesta Soittajalle saadaan data putkesta, joka on tietysti syöte.
Kanava voidaan implisiittisesti muuntaa yksisuuntaiseksi jonoksi, vain vastaanottavaksi tai vain lähettäväksi, mutta yksisuuntaista kanavaa ei voida muuntaa normaaliksi kanavaksi;