为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
三国纷争 2021-07-08 17:01:41
为什么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 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

您还没有分配 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. 很酷。


查看完整回答
反对 回复 2021-07-12
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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

}


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信