我的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]
答案 0 :(得分:1)
1-您可以使用
server := &EchoServer{}
而不是
server := EchoServer{}
类型可能具有与之关联的方法集。方法集 接口类型是它的接口。任何其他类型
T
的方法集 由接收器类型T
声明的所有方法组成。方法集 对应的指针类型*T
是所有方法的集合 用接收者*T
或T
声明(也就是说,它也包含方法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)
你的测试应该编译得很好。