Closed. This question is not reproducible or was caused by typos。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

5个月前关闭。



Improve this question




在Go中编写gRPC服务器时,我因这种恐慌而迷失了方向
    panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x18 pc=0x8c7892]

这是我要尝试创建的测试数据 slice :
inputVal := make([]*pb.TableHeader, 1)

        for i := range inputVal {
            inputVal[i].UserDefinedAlias = "myCustomName"
            inputVal[i].Type = "SomeType"
            inputVal[i].Class = "TestClass"
            inputVal[i].ColumnID = "Col12"
            inputVal[i].IsSortable = false
            inputVal = append(inputVal, inputVal[i])
        }

TableHeader具有此结构
type TableHeader struct {
    ColumnID             string   `protobuf:"bytes,1,opt,name=columnID,proto3" json:"columnID,omitempty"`
    UserDefinedAlias     string   `protobuf:"bytes,2,opt,name=userDefinedAlias,proto3" json:"userDefinedAlias,omitempty"`
    IsSortable           bool     `protobuf:"varint,3,opt,name=isSortable,proto3" json:"isSortable,omitempty"`
    Type                 string   `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"`
    Class                string   `protobuf:"bytes,5,opt,name=class,proto3" json:"class,omitempty"`
    XXX_NoUnkeyedLiteral struct{} `json:"-"`
    XXX_unrecognized     []byte   `json:"-"`
    XXX_sizecache        int32    `json:"-"`
}

并尝试使用rpc服务中的以下命令处理上面创建的测试数据
inputForProcessing := make([]*dt.TableHeader, len(inputVal))
log.Println("reached here for actual processing ",len(inputForProcessing))
    for i, v := range inputVal {
        inputForProcessing[i].ColumnID = v.ColumnID
        inputForProcessing[i].Class = v.Class
        inputForProcessing[i].Type = v.Type
        inputForProcessing[i].IsSortable = v.IsSortable
        inputForProcessing[i].UserDefinedAlias = v.UserDefinedAlias
        inputForProcessing = append(inputForProcessing, inputForProcessing[i])
    }

最佳答案

当您调用inputVal := make([]*pb.TableHeader, 1)时,这将创建一片大小为*pb.TableHeader[<nil>],但不会初始化该元素。如果将其打印出来,将得到:for i := range inputVal

这意味着i == 0中的第一个(也是唯一)迭代将使用inputVal[i],而nil将是inputForProcessing。尝试在nil指针上设置字段会导致您看到恐慌。
inputVal[i]也是如此,创建的 slice 中的所有元素均为nil。

此外,您似乎正在尝试将inputVal附加到ojit_code。给定的元素已经在那里。

相反,您可能想要一些类似的东西:

    inputVal := make([]*pb.TableHeader, 1)

    for i := range inputVal {
        inputVal[i] = &pb.TableHeader{
           UserDefinedAlias: "myCustomName",
           Type: "SomeType",
           etc...
        }
    }

10-01 02:46