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

时间:2013-12-24 02:03:33

标签: google-app-engine go google-cloud-endpoints

为什么greets在运行时会给我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
}

2 个答案:

答案 0 :(得分:6)

您尚未分配Response对象,只是指针。指针是零。

你可以说greets[0] := &Response{Message: "hello"}。或者,或许更好,从一个空切片开始,append尽可能多*Response个:

greets := []*Response{} // or ResponseList{}
greets = append(greets, &Response{Message: "hello"})
greets = append(greets, &Response{Message: "goodbye"})

编辑:注意匿名的替代方法:如果您知道Response的数量,则可以使用文字来设置整个结构,如resp.Items = {{Message: "hello"}}中所示。即使Response是指针也可以工作,并且在每个Response上没有明确的类型名称。很酷。

答案 1 :(得分:2)

Go中对切片和结构文字的支持可以帮助您避免使用样板并使代码正确。

以下是使用切片文字编写List方法的方法。

func (gs *GreetingService) List(r *http.Request, req *Request, resp *ResponseList) error {
    resp.Items = []*Response{
        {Message: "hello"},
        {Message: "goodbye"},
    }
    return nil
}