猿问

切片上的无效内存地址或 nil 指针取消引用

为什么invalid memory address or nil pointer dereference跑步时会打招呼?


type Response struct {

  Message string `json:"message"`

}


type ResponseList struct {

  Items []*Response `json:"items"`

}


func (gs *GreetingService) List(r *http.Request, req *Request, resp *ResponseList) error {

  greets := make([]*Response,2,2)

  greets[0].Message="hello"

  greets[1].Message="goodbye"

  resp.Items = greets

  return nil

}


三国纷争
浏览 228回答 2
2回答

宝慕林4294392

您还没有分配 Response 对象,只是分配了指针。指针初始化为零。你可以说greets[0] := &Response{Message: "hello"}。或者,也许更好,从一个空切片和append任意数量的*Responses开始:greets := []*Response{} // or ResponseList{}greets = append(greets, &Response{Message: "hello"})greets = append(greets, &Response{Message: "goodbye"})编辑:注意匿名者的替代方案:如果您知道Responses的数量,则可以使用文字来设置整个结构,如resp.Items = {{Message: "hello"}}. 即使 Response 是一个指针也可以工作,并且在每个Response. 很酷。

沧海一幻觉

Go 中对 slice 和 struct 文字的支持可以帮助您避免样板并让您的代码正确。以下是List使用切片文字编写方法的方法。func (gs *GreetingService) List(r *http.Request, req *Request, resp *ResponseList) error {    resp.Items = []*Response{        {Message: "hello"},        {Message: "goodbye"},    }    return nil}
随时随地看视频慕课网APP

相关分类

Go
我要回答