Как определить канал в switch
Нужно определить тип переменной типа interface{}. По условию может прийти канал, но что-то никак не соображу, как задать такое условие.
func getTypeSwitch(val interface{}) {
switch val.(type) {
case chan /* требует тип канала, но это может быть любой и interface{} не прокатывает*/:
// do something
default:
}
}
Есть ли способ определить что val это канал, без использования пакета reflect и без перебирания всех типов каналов?
Ответы (1 шт):
Автор решения: Maksim Fedorov
→ Ссылка
Так и пишите, как декларируете тип канала в make()
val.(type) определяет конкретный тип, там не будет interface{}, в примере ниже для неопределенного в case типа сработает default
package main
import (
"log"
"reflect"
)
type JSON struct {
Val string
}
func main() {
chString := make(chan string)
chInt := make(chan int)
chJSON := make(chan JSON)
log.Print(getTypeSwitch(chString))
log.Print(getTypeSwitch(chInt))
log.Print(getTypeSwitch(chJSON))
}
func getTypeSwitch(val interface{}) string {
switch val.(type) {
case chan string:
return "1"
case chan int:
return "2"
case chan interface{}:
return "3"
default:
return reflect.TypeOf(val).String()
}
}