dougui1977 2016-10-02 04:01
浏览 54
已采纳

由于指针接收器,无法实现Go接口[重复]

My go test can not be passed. What's wrong? What's the meaning of (Handle method has pointer receiver)

package ipc

import (
    "testing"
)

// import (
//  "encoding/json"
//  "fmt"
// )

type Request struct {
    Method string `json/"method"`
    Params string `json/"params"`
}

type Response struct {
    Code string `json/"code"`
    Body string `json/"body"`
}

type Server interface {
    Name() string
    Handle(method, params string) *Response
}

type IpcServer struct {
    Server
}

func NewIpcServer(server Server) *IpcServer {
    return &IpcServer{server}
}

type EchoServer struct {
}

func (server *EchoServer) Name() string {
    return "EchoServer"
}

func (server *EchoServer) Handle(method, params string) *Response {
    return &Response{"OK", "Echo " + method + " " + params}
}

func TestIpc(t *testing.T) {
    server := EchoServer{}

    ipcServer := NewIpcServer(server)
}

When I run go test ipc_test.go

/ipc_test.go:49: cannot use server (type EchoServer) as type Server in argument to NewIpcServer:
    EchoServer does not implement Server (Handle method has pointer receiver)
FAIL    command-line-arguments [build failed]
</div>
  • 写回答

2条回答 默认 最新

  • dsjq62428 2016-10-02 04:13
    关注

    1- You may use

    server := &EchoServer{}
    

    instead of

    server := EchoServer{}
    

    Method sets:

    A type may have a method set associated with it. The method set of an interface type is its interface. The method set of any other type T consists of all methods declared with receiver type T. The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T). Further rules apply to structs containing anonymous fields, as described in the section on struct types. Any other type has an empty method set. In a method set, each method must have a unique non-blank method name.

    And see: Pointer receiver and Value receiver difference in implementation with Iris framework


    2- Or you may use

    func (server EchoServer) Name() string {
        return "EchoServer"
    }
    
    func (server EchoServer) Handle(method, params string) *Response {
        return &Response{"OK", "Echo " + method + " " + params}
    }
    

    with

    server := EchoServer{}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)