go - 运行时错误: invalid memory address or nil pointer dereference, grpc golang例子

标签 go grpc

我正在尝试使用服务器端流式传输的唯一方法来实现简单的 grpc 服务器和客户端模型。我正在休假 route guide example in offical repo .尝试运行时,我从服务器端收到此错误

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x4011fc]

goroutine 3 [running]:
panic(0x878c80, 0xc82000a150)
    /usr/local/go/src/runtime/panic.go:481 +0x3e6
main.(*server).Podips(0xc820136188, 0xc82000aa40, 0x7f1179b9f530, 0xc82000aa90, 0x0, 0x0)
    /home/tcs/gowork/src/poc/test/server.go:22 +0x1fc
poc/test/pb._Getips_Podips_Handler(0x856f00, 0xc820136188, 0x7f1179b9f438, 0xc8201da000, 0x0, 0x0)
    /home/tcs/gowork/src/poc/test/pb/getip.pb.go:129 +0x175
google.golang.org/grpc.(*Server).processStreamingRPC(0xc82019a640, 0x7f1179b245a0, 0xc8201ca000, 0xc8201d0000, 0xc820169440, 0xb7afa0, 0xc82016a570, 0x0, 0x0)
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:689 +0x489
google.golang.org/grpc.(*Server).handleStream(0xc82019a640, 0x7f1179b245a0, 0xc8201ca000, 0xc8201d0000, 0xc82016a570)
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:773 +0x1151
google.golang.org/grpc.(*Server).serveStreams.func1.1(0xc820133020, 0xc82019a640, 0x7f1179b245a0, 0xc8201ca000, 0xc8201d0000)
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:422 +0xa0
created by google.golang.org/grpc.(*Server).serveStreams.func1
    /home/tcs/gowork/src/google.golang.org/grpc/server.go:423 +0x9a
exit status 2

这来自客户端

2016/09/29 22:31:37 transport: http2Client.notifyError got notified that the client transport was broken EOF.
2016/09/29 22:31:37 &{0xc820192b40}.Podips(_) = _, rpc error: code = 13 desc = transport is closing
exit status 1

server.go

package main

import (
    "net"
    "flag"
    "fmt"

    "google.golang.org/grpc/grpclog"
    "google.golang.org/grpc"
    pb "poc/test/pb"
)

var port = flag.Int("port", 10000, "The server port")
type server struct{
  ip *pb.Ips
}

func (s *server) Podips(n *pb.Request, stream pb.Getips_PodipsServer)   (error){

    res := [3]string{"firstIP", "secondIp", "thirdIP"}

    for _, v := range res {

        s.ip.Ip = v
        if s.ip == nil{
            if err := stream.Send(s.ip); err != nil {
                    return err
            }
        }
    }

  return  nil
}

func main(){
    flag.Parse()
    lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
    if err != nil {
        grpclog.Fatalf("failed to listen: %v", err)
    }
    grpcServer := grpc.NewServer()
    grpclog.Println("server descrption:%v", grpcServer) 
    pb.RegisterGetipsServer(grpcServer, new(server))
    grpcServer.Serve(lis)

}

一些.proto文件

syntax = "proto3";

package getips;

service Getips {
    rpc Podips (Request) returns (stream Ips){}

}

message Request {
    string req = 1;

}
message Ips {
    string ip = 1;
}

我在 stack over flow 中经历了几个关于 nil 指针错误的问题,我发现这段代码是罪魁祸首

s.ip.Ip = v
if s.ip == nil{
    if err := stream.Send(s.ip); err != nil {
          return err
    }

我不知道如何解决这个问题,我怀疑我的实现方式有误。 任何帮助都会很棒。 谢谢

最佳答案

您正在执行 new(server) 而未初始化字段 server.ip。实现细节我不知道,但是基本上你需要先初始化这个字段,否则s.ipnil,当你调用s. ip.Ip 你得到一个错误。

关于go - 运行时错误: invalid memory address or nil pointer dereference, grpc golang例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771585/

相关文章:

java - 试图了解相互身份验证 key 对和证书如何在 gRPC 上下文中工作

pointers - golang 和指针接收器中的自定义错误

go - 在 Go slice 中,为什么 s[lo :hi] end at element hi-1?

python - 如何使用结构化数据创建 ClassificationRequest 以使用 gRPC 发送到 TensorFlow Serving

kotlin - 在使用 gRPC 的应用程序中使用 kotlin-script-util(用于 JSR-223 支持)时,Guava 发生冲突

java - 池 GRPC ManagedChannels 和 BlockingStubs 还是共享之一?

grpc - gRPC服务器如何注意到客户端已取消服务器端流调用?

java - 如何从 cgo 返回的 C 字符串中释放 java 中的内存(使用 jna)?

go - 为什么 slice 长度大于容量会导致运行时错误?

go - 如何在方法中修改类型 slice ?