慕工程0101907
2022-12-26 16:49:32
我想在 Golang 中為 hashmap 的值設(shè)置多種類型。我實現(xiàn)了 golang 泛型any,并編寫了返回的函數(shù)map[string]any。但是,在我運行代碼后,它返回了$ cannot use r.Method (variable of type string) as type T in map literal在 Go 中為 hashmap 值設(shè)置多種類型的正確方法是什么?這是我的代碼package maintype RequestProperty struct { Method string Params []any Id int}func SetRequestProperty[T any](payloadCombine bool) map[string]T { var p map[string]T var r = RequestProperty{ Method: "SET_PROPERTY", Params: []any{"combined", payloadCombine}, Id: 5, } // just for test p = map[string]T{ "method": r.Method, // << Error Here } return p}func main() { p := SetRequestProperty(true)}[編輯] 這似乎有效......我不知道為什么。package maintype RequestProperty struct { Method string Params []any Id int}// delete [T any], map[string]T // change it to map[string]anyfunc SetRequestProperty(payloadCombine bool) map[string]any { var p map[string]any var r = RequestProperty{ Method: "SET_PROPERTY", Params: []any{"combined", payloadCombine}, Id: 5, } // just for test p = map[string]any{ "method": r.Method, } return p}func main() { p := SetRequestProperty(true)}不應(yīng)該T只是像別名一樣輸入任何內(nèi)容嗎?我誤會了什么嗎?
1 回答

紅糖糍粑
TA貢獻(xiàn)1815條經(jīng)驗 獲得超6個贊
T 不應(yīng)該像別名一樣輸入 any 嗎?
不,不應(yīng)該。
T
是一個類型參數(shù),而不是any
. 它僅受.any
更一般地說:類型參數(shù)不是它的約束。
每次實例化泛型函數(shù)時,T
都會為其分配一個具體類型參數(shù)(滿足其約束),并在函數(shù)體內(nèi)map[string]T
成為從string
具體到任何具體T
內(nèi)容的映射。
p := SetRequestProperty[int](true) // makes body look like: `var p map[string]int` // the literal `map[string]int{"method": r.Method}` obviously can't work
因此在編譯時,編譯器將拒絕對與 的類型集中所有類型T
不兼容的賦值。代碼無法編譯,因為:T
map[string]T{"method": r.Method}
T
受 約束any
,因此其類型集包含任何內(nèi)容r.Method
是類型string
,并且string
不可分配給任何東西。
With map[string]any
insteadany
不用作約束,它用作 static type,它是的別名,interface{}
并且所有類型始終可分配給空接口。
如果您想擁有一個具有不同運行時類型的容器,那么使用any
靜態(tài)類型map[string]any
是唯一的方法。要限制允許的類型,請使用基本接口而不是類型參數(shù)。
另請參閱此處投票最高的答案:用類型參數(shù)替換接口參數(shù)有什么好處?
- 1 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報
0/150
提交
取消