моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Горутины выполняются в одном адресном пространстве, поэтому доступ к общей памяти должен быть синхронизирован.Горутины совместно используют память посредством связи, а не совместно используют память.
Канал опорного типа является конкретной реализацией режима CSP и используется для связи с несколькими горутинами. Он реализует внутреннюю синхронизацию для обеспечения безопасности параллелизма.
Как и карта, канал также является ссылкой на базовую структуру данных, созданную make.
Когда мы копируем канал или используем его для передачи параметров функции, мы просто копируем ссылку на канал, поэтому вызывающий и вызываемый объект будут ссылаться на один и тот же объект канала. Как и другие типы ссылок, нулевое значение канала равно нулю.
Когда вы определяете канал, вам также необходимо определить тип значений, отправляемых в канал. Каналы можно создавать с помощью встроенной функции make():
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
По умолчанию канал блокируется при получении и отправке данных, если другой конец не готов, что упрощает синхронизацию горутины без необходимости явных блокировок.
Небуферизованный канал — это канал, который не имеет возможности сохранять какое-либо значение перед приемом.
Этот тип канала требует, чтобы горутина отправки и горутина получения были готовы одновременно завершить операции отправки и получения. Если две горутины не готовы одновременно, канал приведет к тому, что горутина, которая первой выполняет операцию отправки или получения, заблокируется и будет ждать.
Это взаимодействие отправки и получения в канале по своей сути синхронно. Ни одна операция не может существовать независимо от другой.
На следующем рисунке показано, как две горутины могут совместно использовать значение, используя небуферизованные каналы:
make (chan Type)//等价于make (chan Type,0)
Если размер буфера не указан, канал является синхронным и, следовательно, блокируется до тех пор, пока отправитель не будет готов к отправке, а получатель не будет готов к приему.
Буферизованный канал — это канал, который может хранить одно или несколько значений перед их получением.
Этот тип канала не требует, чтобы горутина выполняла отправку и получение одновременно. Каналы также будут иметь разные условия, которые блокируют действия отправки и получения. Действие приема будет заблокировано только в том случае, если в канале для приема нет значения. Действие отправки будет заблокировано только в том случае, если в канале нет доступного буфера для размещения отправляемого значения.
Это приводит к большой разнице между буферизованными и небуферизованными каналами: небуферизованные каналы гарантируют, что отправляющие и получающие горутины будут обмениваться данными одновременно: буферизованные каналы не имеют такой гарантии.
make (chan Type,capacity)
Если указана емкость буфера, канал является асинхронным. Пока в буфере есть неиспользуемое пространство для отправки данных или содержатся данные, которые можно получить, связь осуществляется без блокировки.
Канал может использовать ok, чтобы определить, открыт ли канал. Если канал закрыт, данные не будут считаны.
num ,ok:=<-ch
Может определить, закрыт ли канал.По умолчанию канал является двухвопросным, то есть на него можно отправлять данные и получать с него данные.
Однако мы часто видим канал, передаваемый в качестве параметра, и ожидается, что значение будет использоваться в одном направлении: либо только для отправки данных, либо только для получения данных. На этом этапе мы можем указать направление канала. Объявление односторонней переменной Chamel очень просто:
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- означает, что данные поступают в канал, и данные записываются в канал, который выводится вызывающей стороне.
<-chan указывает, что данные выходят из канала. Для вызывающей стороны данные получаются из канала, что, конечно же, является входными данными.
Канал можно неявно преобразовать в одностороннюю очередь, только получая или только отправляя, но односторонний канал нельзя преобразовать в обычный канал;