2016-10-02 105 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) 

和測試應編譯就好了。