2016-10-02 55 views
-1

我的go test无法传递。怎么了?什么是当我运行go test ipc_test.go由于指针接收器无法实现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] 

回答

1

1-你可以使用的

server := &EchoServer{} 

代替

server := EchoServer{} 

Method sets

A型可具有与之相关联的方法集。其接口类型为 的方法集是其接口。任何其他类型的方法集合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{} 
0

NewIpcServer接收可由价值型或指针式满足接口的(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) 
} 

意义。

由于EchoServer实现了作为指针型接收器(例如func (server *EchoServer) ...)的接口功能,所以您必须将指针传递给NewIpcServer函数。

在你TestIpc职能转变server是一个指针作为这样

server := new(EchoServer) 

和测试应编译就好了。