为什么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
}
答案 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
}