无法在多重分配中将 *pubsub.Topic 分配给 mytopic自定义类型

问题描述

我正在尝试使用 gocloud.dev/pubsub 包在 Go 中创建两个简单的 createtopic() 和 sendMessage() 函数

但是,我收到一条错误消息 ./topic.go:18:15: 不能在多重赋值中将 *pubsub.Topic 分配给 mytopic(类型 mytopic)

代码如下:

main.go

package main

import (
    "context"
    "log"

    _ "gocloud.dev/pubsub/mempubsub"
)

func main() {

    mytopic := mytopic{}
    ctx := context.Background()
    mytopic,err := createtopic(ctx,"mem://topicA")

    if err != nil {
        log.Fatal("Error occured",err)
    }

    mytopic.sendMessage(ctx,"hello")
}
topic.go

package main

import (
    "context"
    "log"

    "gocloud.dev/pubsub"
    _ "gocloud.dev/pubsub/mempubsub"
)

type mytopic struct {
    pubsub.Topic
}

func createtopic(ctx context.Context,url string) (mytopic,error) {

    mytopic := mytopic{}
    mytopic,err := pubsub.OpenTopic(ctx,"mempubsub")
    if err != nil {
        log.Fatal("Could not open topic: %v",err)
    }
    defer mytopic.Shutdown(ctx)
    return mytopic,err
}

func (t mytopic) sendMessage(ctx context.Context,m string) error {

    err := t.Send(ctx,&pubsub.Message{
        Body: []byte("Hello,World!\n"),Metadata: map[string]string{
            "language":   "en","importance": "high",},})

    return err

}

有人知道我做错了什么吗?

解决方法

错误消息很好地描述了问题。修复方法如下:

使用指针字段:

type mytopic struct {
    *pubsub.Topic
}

将 pubsub.OpenTopic 的返回值赋给字段:

var err error
var mytopic mytopic
mytopic.Topic,err := pubsub.OpenTopic(ctx,"mempubsub")