go: как передать направленные каналы функции, принимающей двунаправленный канал?

Привет есть функция принятия chan []byte (что, поскольку направление не указано, я понимаю, что это двунаправленный). Функция ничего не отправляет и не получает, а только просматривает количество элементов в канале для целей статистики.

Я хочу вызвать эту функцию внутри функции со следующей подписью:

func foo(fooChannel chan<- []byte)

Но когда я пытаюсь использовать аргумент для вызова другой функции, я получаю ошибку cannot use fooChannel (type <-chan []byte) as type chan []byte in function argument,

Есть ли способ привести fooChannel к chan []byte?

Так как меня интересует только получение некоторой статистики, как мне прототипировать функцию для приема любого типа канала (чтобы я мог избавиться даже от части "байт")? Я только использую len а также cap с каналами, полученными в качестве аргументов.

2 ответа

Решение

Перефразируя немного:

"Есть ли способ привести направленный канал к ненаправленному?" Нет, нет

"Есть ли в Go понятие" произвольный канал "(без типа элемента)? Нет, нет У Go нет дженериков.

Вам придется написать несколько функций.

Есть ли способ привести fooChannel к байту chan []?

Нет извините. Это, вероятно, на тот случай, если кто-то решит, что он все равно хотел бы отправить на принимающий канал. Но просто маленькая вещь, но... Нет.

Функция ничего не отправляет и не получает, а только просматривает количество элементов в канале для целей статистики. [...] Я только использую len а также cap с каналами, полученными в качестве аргументов.

Если он не использует канал каким-либо образом, вы можете просто передать len(ch) а также cap(ch) прямо как аргументы. Если вам это не нравится по какой-либо причине, вы можете поиграть с reflect пакет, который позволит вам позвонить len а также cap на любом поддерживаемом типе (массив, канал, срез).

Это может быть хорошим началом:

package main

import (
    "fmt"
    "reflect"
)

func stats(i interface{}) {
    v := reflect.ValueOf(i)
    fmt.Printf("%s size: %d/%d\n", v.Kind(), v.Len(), v.Cap())
}

func main() {
    ch := make(chan int, 10)
    ch <- 1
    stats(ch)
}

// Output: chan size: 1/10

http://play.golang.org/p/2ehYvEmDkS

Другие вопросы по тегам