Невозможно зарегистрировать сервис с указателем на образец структуры - PullRequest
0 голосов
/ 27 сентября 2019

При попытке ссылаться на структуру как указатель.Это приведет к невозможности передачи литералов для регистрации службы.

Я полагаю, что это может быть связано с тем, как grpc изменился в разных версиях, так как раньше я мог заставить его работать таким образом ...Но установка свежей версии grpc привела к тому, что она не работает.

Я попытался создать новую структуру.Но вы получите нарушение адреса памяти.Я также попытался передать саму фактическую структуру без удачи.

Источник


package rpc

import (
    "context"
    "fmt"
    "log"
    "net"
    "time"

    "atomic-swaps/src/api"

    "google.golang.org/grpc"
)

// ApiServer : Empty API server struct
type ApiServer struct{}

// Server : The Server endpoint response
func (s *ApiServer) Server(ctx context.Context, message api.ServerMessage) (*api.ServerMessage, error) {
    ping := "pong"
    time := int64(time.Now().Unix())
    return &api.ServerMessage{ping, time, struct{}{}, nil, 128}, nil
}

// StartGRPCServer : Starts a fresh GRPC Server on TCP
func StartGRPCServer(port string) {
    tcp, err := net.Listen("tcp", ":"+port)
    if err != nil {
        log.Fatalf("Error starting GRPC Server: %v", err)
    }

    server := grpc.NewServer()
    api.RegisterApiServer(server, &ApiServer{})

    fmt.Println("Starting gRPC server on " + port)
    server.Serve(tcp)
}

Ошибка

src/rpc/grpc.go:33:32: cannot use &ApiServer literal (type *ApiServer) as type api.ApiServer in argument to api.RegisterApiServer:
    *ApiServer does not implement api.ApiServer (wrong type for Server method)
        have Server(context.Context, api.ServerMessage) (*api.ServerMessage, error)
        want Server(context.Context, *api.ServerMessage) (*api.ServerMessage, error)

1 Ответ

0 голосов
/ 27 сентября 2019

Хорошо ... Мои плохие парни ... На самом деле это была ошибка указателя.

Я забыл указатель

func (s *ApiServer) Server(ctx context.Context, message api.ServerMessage) (*api.ServerMessage, error)

Необходимо быть

func (s *ApiServer) Server(ctx context.Context, message *api.ServerMessage) (*api.ServerMessage, error)
...