当前位置: 首页 > 知识库问答 >
问题:

运行时错误:无效内存地址或零指针解引用,grpc golang示例

孙海
2023-03-14

我正在尝试实现简单的grpc服务器和客户端模型,只使用服务器端流的方法。我正在参考Official 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

服务器去

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)

}

一些原型文件

syntax = "proto3";

package getips;

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

}

message Request {
    string req = 1;

}
message Ips {
    string ip = 1;
}

我正在研究堆栈溢出中关于零指针错误的几个问题,我发现这段代码是罪魁祸首

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

我不知道如何解决这个问题,我怀疑我实施它的方式是错误的。任何帮助都将是巨大的。谢谢

共有1个答案

云骏奇
2023-03-14

您正在执行“新建(服务器)”,但没有初始化字段“服务器”。ip 。我不知道实现的细节,但您基本上需要首先初始化此字段,否则s.ip是nil,当您调用s.ip时。Ip出现错误。

 类似资料:
  • 我是新手,试图制作一个简单的网络爬虫。我一直收到“恐慌:运行时错误:无效的内存地址或零指针取消引用”,不知道如何解决这个问题。我有一个“AdvancedFetcher”函数和一个“basicFetcher”函数,我在其中任何一个下都收到相同的错误。这个答案建议检查每个错误(我想我有),但我仍然收到错误。谢谢! 编辑#1:

  • 我是golang的新手,目前正在学习本教程和源代码-http://golang.org/doc/articles/wiki/part2.go 创建此文件后,我将 知道我做错了什么导致了这种明显的记忆损坏吗?

  • 运行Go程序时,它会惊慌失措并返回以下信息: 我查看了其他人对相同异常的响应,但没有看到任何简单的响应(即未处理的错误)。 我在一台无法访问代码中列出的API服务器的机器上运行它,但我希望它会返回一个适当的错误(因为我试图捕捉这种错误)。

  • 问题内容: 我是新手,尝试制作一个简单的网络爬虫。我不断收到“紧急情况:运行时错误:无效的内存地址或nil指针取消引用”,并且不知道如何解决该问题。我有一个“ advancedFetcher”功能和一个“basicFetcher”功能,在任何一个下都出现相同的错误。这个答案建议检查每个错误(我认为是错误),但仍然出现错误。谢谢! 编辑#1: 问题答案: 您的程序在惊慌之前打印错误吗?如果没有记错,

  • 我是gccgo新手,我需要编译/运行以下代码的帮助(这在“标准”go编译器中可以正常工作(抱歉,我不知道正确的名称)): 我的gcc: 我的第一个文件: 我的第二个文件: 我的编译错误: 我做错了什么?

  • 软呢帽: 库贝-代理版本: /go/src/k8s.io/kubernetes/godeps/_workspace/src/github.com/golang/glog/glog.go:879+0x78由github.com/golang/glog.init创建·1/go/src/k8s.io/kubernetes/godeps/_workspace/src/github.com/golang/g