1 回答

TA貢獻1856條經驗 獲得超5個贊
(稍微簡化一下。
您有一個具有以下簽名的函數:
func addOrUpdateRepositories(v interface{})
然后你這樣稱呼它:
repository := new(types.Repository)
addOrUpdateRepositories(repository)
就像這樣:
repositories := make([]*types.Repository, 0)
addOrUpdateRepositories(repositories)
在第一次調用中,存儲的值的具體類型將是(作為返回指向分配值的指針),在第二次調用中,存儲的值的具體類型將是 - 因為這是被告知要創建的內容。v*types.Repositorynewv[]*types.Repositorymake
現在,您在 上執行類型開關,其內容為:v
switch x := v.(type) {
case map[string]*types.Repository:
case map[string][]*types.Repository:
case nil:
default:
}
撇開以下情況不談:如果您不將其稱為傳遞 a,則不會在問題的代碼段中發生,則 將始終選擇默認分支,因為存儲在 中的具體值的類型是 never 或 。addOrUpdateRepositoriesnilvswitchvmap[string]*types.Repositorymap[string][]*types.Repository
我不確定為什么你沒有看到這一點,所以也許你應該完善你的問題,或者可能試圖在評論我的答案時澄清你的困惑?
另一個黑暗中的鏡頭:類型轉換(請注意,Go沒有類型轉換,正如@Flimzy指出的那樣)和Go中的類型切換實際上并沒有改變它們所操作的值的基礎表示形式 - 除了有限的一組(“每個人都期望如此”)情況,例如類型轉換為a到,這些情況被精確地記錄下來。float64int64
因此,您不能獲取一個(指向類型值的一部分指針)并以某種方式強制它“成為”:由于多種原因,這將是一件荒謬的事情,最明顯的是:如果您正在編寫Go編譯器,您將如何執行這樣的“類型轉換”?假設您真的要分配一個地圖,但是應該為該地圖中的哪個鍵分配原始(源)切片?將 a 類型轉換為 ?[]*types.Repositorytypes.Repositorymap[string][]*types.Repository[]*types.Repositorystruct {foo []*types.Repository; bar []*types.Repository}
- 1 回答
- 0 關注
- 94 瀏覽
添加回答
舉報