由于指针接收器,无法实现Go接口

时间:2016-10-02 04:01:09

标签: go

我的go test无法通过。怎么了? (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)
}

当我运行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]

2 个答案:

答案 0 :(得分:1)

1-您可以使用

server := &EchoServer{}

而不是

server := EchoServer{}

Method sets

  

类型可能具有与之关联的方法集。方法集   接口类型是它的接口。任何其他类型T的方法集   由接收器类型T声明的所有方法组成。方法集   对应的指针类型*T是所有方法的集合   用接收者*TT声明(也就是说,它也包含方法   T)的集合。进一步的规则适用于包含匿名字段的结构,   如结构类型一节中所述。任何其他类型都有   空方法集。在方法集中,每个方法必须具有唯一性   非空方法名称。

请参阅:Pointer receiver and Value receiver difference in implementation with Iris framework

2-或者你可以使用

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

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

server := EchoServer{}

答案 1 :(得分:0)

NewIpcServer接收一个可以通过值类型或指针类型来满足的接口。

由于EchoServer将接口函数实现为指针类型接收器(例如func (server *EchoServer) ...),因此必须将指针传递给NewIpcServer函数。

TestIpc函数更改server中将其作为指针

server := new(EchoServer)

你的测试应该编译得很好。