2013-12-24 23 views
0

爲什麼在運行時問候會給我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 
} 

回答

6

您還沒有分配Response對象,只是指針。指針指向零。您可以說greets[0] := &Response{Message: "hello"}。或者,也許更好,開始與空片和append許多*Response S作爲你想要的:

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

編輯:注意匿名的選擇:你可以用文字來建立整個結構,如果你知道號碼爲Response,如在resp.Items = {{Message: "hello"}}中。即使響應是一個指針,並且在每個Response上都沒有明確的類型名稱。很酷。

2

在Go中支持切片和結構文字可以幫助您避免樣板文件以及獲取正確的代碼。

下面介紹如何使用切片文字編寫List方法。

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