Функция reflect.ChanOf

Функция reflect.ChanOf создает тип канала с указанным направлением и типом элементов. Первый параметр определяет направление канала: reflect.BothDir для двунаправленного, reflect.SendDir для отправляющего и reflect.RecvDir для принимающего. Второй параметр принимает тип элементов канала, полученный через reflect.TypeOf. Функция возвращает значение типа reflect.Type, представляющее результирующий тип канала.

Синтаксис

goreflect.ChanOf(dir reflect.ChanDir, t reflect.Type) reflect.Type

Пример

Создадим тип канала для передачи целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  chanType := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(0))
  fmt.Println(chanType)
}

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

go"chan int"

Пример

Создадим тип отправляющего канала для строк:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  chanType := reflect.ChanOf(reflect.SendDir, reflect.TypeOf(""))
  fmt.Println(chanType)
}

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

go"chan<- string"

Пример

Создадим тип принимающего канала для булевых значений:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  chanType := reflect.ChanOf(reflect.RecvDir, reflect.TypeOf(true))
  fmt.Println(chanType)
}

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

go"<-chan bool"

Пример

Создадим канал с типом элементов, полученным динамически через reflect.SliceOf:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  sliceType := reflect.SliceOf(reflect.TypeOf(0))
  chanType := reflect.ChanOf(reflect.BothDir, sliceType)
  fmt.Println(chanType)
}

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

go"chan []int"

Пример

Создадим канал и проверим его свойства с помощью методов reflect.Type:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  chanType := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(""))
  fmt.Println("Kind:", chanType.Kind())
  fmt.Println("Elem:", chanType.Elem())
  fmt.Println("ChanDir:", chanType.ChanDir())
}

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

go"Kind: chan"
"Elem: string"
"ChanDir: 3"

Обратите внимание, что reflect.BothDir имеет числовое значение 3.

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

  • функцию reflect.MakeChan,
    которая создает новый канал на основе типа
  • функцию reflect.TypeOf,
    которая возвращает тип значения во время выполнения
  • функцию reflect.ValueOf,
    которая возвращает отраженное значение для работы с данными
  • функцию reflect.SliceOf,
    которая создает тип слайса из указанного типа элементов