gpt4 book ai didi

go - MessageImpl 没有实现 Message

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:53 25 4
gpt4 key购买 nike

在 golang 中,我有以下编译错误:

cannot use m (type MessageImpl) as type Message in assignment:
MessageImpl does not implement Message (missing FirstLine method)

使用以下代码:

type Message interface {
FirstLine() string
/* some other method declarations*/
}

type MessageImpl struct {
headers []Header
/* some other fields */
}

type Request struct {
MessageImpl
/* some other fields */
}

type Response struct {
MessageImpl
/* some other fields */
}

func (r Request) FirstLine() string {
var requestLine bytes.Buffer
requestLine.WriteString("...")
// Some more instructions
return requestLine.String()
}


func (m MessageImpl) RenderMessage() string {
var message bytes.Buffer
var msg Message = m // <=== This is the line the compiler moans about
message.WriteString(msg.FirstLine())
// Some more instructions
return message.String()
}

来自java语言,我会尽量表达我的意图:有一些接口(interface) Message 定义了一些由抽象类 MessageImpl 实现的方法。两个真正的类RequestResponse应该继承自MessageImpl(并实现接口(interface)Message)。这两者都定义并实现了一些更内部的方法。

如何做到最好?

最佳答案

Go 中的接口(interface) 是一组方法,但接口(interface)也是类型。所以 go 约定是为任何接口(interface)添加后缀 -er 以指示其他类型是否从它组合方法。

您需要为类型Messege 定义一个实现来接收FirstLine() 方法。结果它满足 Messeger 接口(interface)。

编辑:我误解了你用 bytes.Buffer 做什么,所以答案实际上要简单得多。

Edit2: 我不得不稍微考虑一下这个问题,但您似乎希望 RenderMessage() 成为函数而不是方法。 RenderMessage 有一个类型为 Messeger 的参数,它(到目前为止)可以是类型 RequestResponse消息

如果您传递的 Messager 可以是可变类型,则不能为 RenderMessage 定义方法接收器,除非您希望在 RenderMessage,这在某种程度上违背了使用接口(interface)的初衷。

package main

import (
"bytes"
"fmt"
)

type Messager interface {
FirstLine() string
/* some other method declarations*/
}

type Header struct {
Data string
}

type Message struct {
headers []Header
/* some other fields */
}

type Request struct {
/* some fields */
Message
}

type Response struct {
/* some fields */
Message
}

func (r Request) FirstLine() string {
var requestLine bytes.Buffer
requestLine.WriteString("...")
// Some more instructions
return requestLine.String()
}

func (r Response) FirstLine() string {
var requestLine bytes.Buffer
requestLine.WriteString("!!!")
// Some more instructions
return requestLine.String()
}

func (m Message) FirstLine() string {
// whatever this would be
return "???"
}

func RenderMessage(m Messager) string {
var b bytes.Buffer
var msg Messager = m // <=== This is the line the compiler moans about
b.Write([]byte("some text"))
b.WriteString(msg.FirstLine())
// Some more instructions
return b.String()
}

func main() {
header := Request{}
fmt.Println(RenderMessage(header))

resp := Response{}
fmt.Println(RenderMessage(resp))

foo := Message{}
fmt.Println(RenderMessage(foo))
}

输出:

some text...
some text!!!
some text???

我添加了这个,因为它没有在你的问题中定义:

type Header struct {
Data string
}

我还添加了这一行来说明示例:

    b.Write([]byte("some text"))

http://play.golang.org/p/n-DOQbXXl9

关于go - MessageImpl 没有实现 Message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31615005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com