2017-11-28 5 views
-2

を望んでいる、FUNCへの引数としてのインターフェイスの実装を使用することはできません、私は次のエラーを取得していますこれらのサービスのいずれかからの着信メッセージ:はインタフェース

// IncomingMessage is a message that comes in on a messaging service 
type IncomingMessage interface { 
    Send() error 
} 

// MessagingService is a service on which messages can be send (like Telegram or FB Messenger) 
type MessagingService interface { 
    Start() 
    HandleIncomingMessage(IncomingMessage) error 
    GetHTTPHandler() http.HandlerFunc 
    GetCommands() []MessagingCommand 
} 

MessagingServiceの最初の実装は、電報のためのものです。問題は、現在、本当に何もしないHandleIncomingMessage関数である、ちょうど次のようになります。

// HandleIncomingMessage will take an incoming message and repond to it 
func (s TelegramService) HandleIncomingMessage(msg *telegram.Message) error { 

    return nil 
} 

問題は、この関数はコンパイラがインターフェースに準拠していないと言うtelegram.Messageを、受け入れることです。事はtelegram.MessageIncomingMessage実装であることを、次のとおりです。最初

// Message is a Telegram message 
type Message struct { 
    // Added the line below at some point, but it didn't work without it either 
    mypackage.IncomingMessage 
    MessageID uint64 `json:"message_id"` 
    FirstName string `json:"first_name"` 
    Username string `json:"username"` 
    Date  uint64 `json:"date"` 
    Text  string `json:"text"` 
    Chat  Chat `json:"chat"` 
    From  User `json:"from"` 
} 

// Send will take m and send it 
func (m Message) Send() error { 
    // Do stuff 

    return nil 
} 

IncomingMessageは、私が最初に問題に気づいたところで、空のインターフェースでした。私はちょうどそれを任意の構造体wouldnt't与えるかもしれないと思ったので、私はとにかく追加する予定だったSend()関数を追加しようとしました。しかし、私はまだこのエラーが発生しています。

telegram.Messageがインターフェイスを実装していない理由はありません。それはかなり簡単です。

誰もこれが機能しない理由を説明できますか?

PS:私のパッケージは実際にmypackageと呼ばれていないが、それはインタフェースが定義されている方法ですので、IncomingMessage引数を取る必要があり、明確にするため

+1

メソッドのシグネチャは、 'HandleIncomingMessage(IncomingMessage)error'です。あなたは別の署名を使うことはできませんが、どうしてそんなに必要なのですか? – JimB

+1

コンパイラの苦情が有効です。 TelegramServiceは* IncomingMessageを処理することはできません。一部のみで、MessagingServiceインターフェイスを満たさない場合があります。 – Peter

+0

@JimBありがとうございました。 IncomingMessageを使用している場合は、それをtelegram.Messageのように使用できますか? –

答えて

0

HandleIncomingMessageを変更しました。たとえその型がIncomingMessageを実装していても、他の型を引数とするHandleIncomingMessageの実装を定義することはできません。あなたはIncomingMessageを取り、型アサーションを使用して*telegram.Messageにそれを変換するために、あなたの関数を定義することができます。

func (s TelegramService) HandleIncomingMessage(im IncomingMessage) error { 
    msg := im.(*telegram.Message) 
    return nil 
} 

私はあなたが実際にtelegram.Messageへのポインタを使用してしたいと仮定しています。その場合は、Sendメソッドの定義を変更して、ポインタ受信機を取得する必要があります。

関連する問題