Как определить канал в 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()
    }
}
→ Ссылка