2ord
@2ord
продвинутый чайник

Как привести тип < -chan amqp.Delivery к < -chan interface{}?

Для примера набросал такой код. Цель функции - вернуть канал с интерфейсом, чтобы реализовать абстрактный тип канала.
package main

import (
	"fmt"
	"github.com/streadway/amqp"
)

type (
	IConsumer interface {
		Consume() (<-chan interface{}, error)
	}
	AmqpConsumer struct {
		conn    *amqp.Connection
		topic   string
		channel *amqp.Channel
	}
)

func (pr *AmqpConsumer) Consume() (<-chan interface{}, error) {
	var msgs <-chan interface{}

	ch, err := pr.conn.Channel()
	if err != nil {
		return msgs, err
	}
	defer ch.Close()

	amqp_msgs, err := ch.Consume(
		pr.topic, // queue
		"",       // consumer
		true,     // auto-ack
		false,    // exclusive
		false,    // no-local
		false,    // no-wait
		nil,      // args
	)
	if err != nil {
		return msgs, err
	}

	return amqp_msgs, nil
}

func main() {
	fmt.Println("Hello, playground")
}

https://play.golang.org/p/VTRDQjYOclf

Получаю ошибку
./prog.go:41:2: cannot use amqp_msgs (type <-chan amqp.Delivery) as type <-chan interface {} in return argument
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 1
Delgus
@Delgus
Кастовать каналы вроде как нельзя в go. Придется создавать промежуточный канал. Примерно так я это вижу. Но скорее всего оно не работает так как надо
https://play.golang.org/p/i8-69C6RDrG
package main

import (
	"fmt"
	"github.com/streadway/amqp"
)

type (
	IConsumer interface {
		Consume() (<-chan interface{}, error)
	}
	AmqpConsumer struct {
		conn    *amqp.Connection
		topic   string
		channel *amqp.Channel
	}
)

func (pr *AmqpConsumer) Consume() (<-chan interface{}, error) {
	var msgs <-chan interface{}

	ch, err := pr.conn.Channel()
	if err != nil {
		return msgs, err
	}
	defer ch.Close()

	amqp_msgs, err := ch.Consume(
		pr.topic, // queue
		"",       // consumer
		true,     // auto-ack
		false,    // exclusive
		false,    // no-local
		false,    // no-wait
		nil,      // args
	)
	if err != nil {
		return msgs, err
	}

	var castCh chan interface{}
	go func() {
		for msg := range amqp_msgs {
			castCh <- msg
		}
	}()
	
	return castCh, nil
}

func main() {
	fmt.Println("Hello, playground")
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Level Travel Москва
от 130 000 до 200 000 ₽
от 3 000 до 4 200 $
Digital Horizon Москва
До 220 000 ₽
12 авг. 2020, в 15:10
5000 руб./за проект
12 авг. 2020, в 14:52
3000 руб./за проект