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