2016-12-27 76 views
3

我想在Go中編寫一個函數,它需要一個JSON與一個目錄的URL並執行BFS來查找該目錄中的文件。當我找到一個作爲目錄的JSON時,代碼會生成一個URL並且應該排入該URL。當我嘗試在循環中創建append()中的結構時,出現錯誤。Golang不能用作類型結構數組或切片文字

type ContentResp []struct { 
    Name string `json:"name"` 
    ContentType string `json:"type"` 
    DownloadURL string `json:"download_url"` 
} 
... 

var contentResp ContentResp 
search(contentQuery, &contentResp) 

for _, cont := range contentResp { 
     append(contentResp, ContentResp{Name:cont.Name, ContentType:"dir", DownloadURL:cont.contentDir.String()}) 
} 

./bfs.go:129: undefined: Name 
./bfs.go:129: cannot use cont.Name (type string) as type struct { Name string "json:\"name\""; ContentType string "json:\"type\""; DownloadURL string "json:\"download_url\"" } in array or slice literal 
./bfs.go:129: undefined: ContentType 
./bfs.go:129: cannot use "dir" (type string) as type struct { Name string "json:\"name\""; ContentType string "json:\"type\""; DownloadURL string "json:\"download_url\"" } in array or slice literal 
./bfs.go:129: undefined: DownloadURL 
./bfs.go:129: cannot use cont.contentDir.String() (type string) as type struct { Name string "json:\"name\""; ContentType string "json:\"type\""; DownloadURL string "json:\"download_url\"" } in array or slice literal 

回答

3

ContentResp類型是,不是結構,但你把它當作一個結構,當你使用一個composite literal試圖建立它的值:

type ContentResp []struct { 
    // ... 
} 

更多恰恰是它是一個匿名結構類型的一部分。匿名結構的創造價值是不愉快的,所以不是你應該創建(名稱)類型只有struct之中,並使用此片,如:

type ContentResp struct { 
    Name  string `json:"name"` 
    ContentType string `json:"type"` 
    DownloadURL string `json:"download_url"` 
} 

var contentResps []ContentResp 

其他問題:

讓我們來看看此循環:

for _, cont := range contentResp { 
    append(contentResp, ...) 
} 

上面的代碼覆蓋一個切片,並在其內部嘗試將元素附加到切片。與此相關的2個問題:append()返回必須存儲的結果(它甚至可能必須分配一個新的,更大的支持數組並複製現有元素,在這種情況下,結果片將指向完全不同的數組,並且舊的應該被拋棄)。所以它應該像這樣使用:

contentResps = append(contentResps, ...) 

第二:你不應該改變你正在覆蓋的切片。 for ... range評估範圍表達式一次(最多),因此您更改它(向其添加元素)將不會影響迭代器代碼(它不會看到切片標頭更改)。

如果你有這樣的情況,你需要完成「任務」,但是在執行期間可能會出現新的任務(遞歸地完成),通道是一個更好的解決方案。看到這個答案,以獲得渠道的感覺:What are golang channels used for?

相關問題