dsvjw20866 2016-09-29 13:24
浏览 174

运行时错误:无效的内存地址或nil指针取消引用,grpc golang示例

I am trying to implement simple grpc server and client model with only method for server side streaming. I am fallowing the route guide example in offical repo. When trying to run I am getting this error from server side

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

and this from client side

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)

}

some.proto file

syntax = "proto3";

package getips;

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

}

message Request {
    string req = 1;

}
message Ips {
    string ip = 1;
}

I am going through few questions in stack over flow about nil pointer error I found this peice of code is culprit

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

I don't know how to solve this and I doubt I am implementing it wrong way. Any help would be greatful. Thanks

  • 写回答

1条回答 默认 最新

  • duanheyi7147 2016-09-29 13:30
    关注

    You are doing new(server) without initializing the field server.ip. I don't know the details of the implementation, but you basically need to initialize this field first, otherwise s.ip is nil and when you call s.ip.Ip you get an error.

    评论

报告相同问题?

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错