Функция reflect.MakeChan

Функция reflect.MakeChan создает новый канал с заданным типом и размером буфера. Она принимает два параметра: typ - тип канала, который возвращает функция reflect.ChanOf, и buffer - размер буфера канала. Функция возвращает значение типа reflect.Value, представляющее созданный канал.

Синтаксис

goreflect.MakeChan(typ reflect.Type, buffer int) reflect.Value

Пример

Давайте создадим небуферизированный канал для строк:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  chanType := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(""))
  ch := reflect.MakeChan(chanType, 0)
  
  fmt.Println(ch.Type())
  fmt.Println(ch.IsValid())
}

Результат выполнения кода:

gochan string
true

Пример

Создадим буферизированный канал для целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  intType := reflect.TypeOf(0)
  chanType := reflect.ChanOf(reflect.BothDir, intType)
  ch := reflect.MakeChan(chanType, 5)
  
  fmt.Println(ch.Len())
  fmt.Println(ch.Cap())
}

Результат выполнения кода:

go0
5

Пример

Продемонстрируем отправку и получение данных через созданный канал:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  chanType := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(""))
  ch := reflect.MakeChan(chanType, 2)
  
  msg := reflect.ValueOf("hello")
  ch.Send(msg)
  
  received := ch.Recv()
  fmt.Println(received.String())
}

Результат выполнения кода:

go"hello"

Смотрите также

  • функцию reflect.ChanOf,
    которая создает тип канала с заданным направлением и типом элементов
  • функцию reflect.MakeSlice,
    которая создает срез с указанным типом и длиной
  • функцию reflect.MakeMap,
    которая создает карту с указанным типом
  • функцию reflect.Value,
    которая представляет значение в системе отражения