我希望能夠在結構的兩個字段之間強制執行相似性,但在映射或切片中也有幾個這樣的結構。這是我的問題的一個簡化示例:package maintype foo[T any] struct { f func() T v T}type bar struct { x []*foo[any]}func baz[T any](b *bar, f func() T) { b.x = append(b.x, &foo[any]{f: f})}func main() { var b bar baz(&b, func() int { return 0 })}編譯器抱怨./prog.go:13:33: 不能在結構文字中使用 f(func() T 類型的變量)作為 func() any 類型有趣的是,如果我不需要在結構中有一個函數指針,這就可以工作。請參閱https://go.dev/play/p/qXTmaa9PuVe那么,有沒有辦法讓我把 T 變成 any?我知道我可以使用 interface{} 來做到這一點并使用 reflect 來執行我想要的,但我確信只有泛型才有可能。如果有辦法解決我的問題,上下文是我正在制作一個標志包。重要的結構如下所示:type flag[T any] struct { value T parse func(in string) (T, error) // Other fields removed for simplicity...}type FlagSet struct { // could flag[any] be replaced with a better answer? flags map[string]*flag[any] // Other fields removed for simplicity...}這個問題已經結束,所以我必須在這里回答我問題的第二部分可以用更好的答案替換 flag[any] 嗎?上面的答案是肯定的。解決方案:最初我雖然是這樣的:“一個func()適合一個func(),一個any適合一個T,所以為什么我不能有一個func() T適合的func() any?” 當然原因是 afunc() any不是 anany所以它不能容納 a func() T。相反,您可以執行以下操作:package maintype foo[T any] struct { f func() T v T}func (f *foo[_]) set() { f.v = f.f()}type anyfoo interface { set()}type bar struct { x []anyfoo}func baz[T any](b *bar, f func() T) { b.x = append(b.x, &foo[T]{f: f})}func main() { var b bar baz(&b, func() int { return 0 })}
1 回答

慕后森
TA貢獻1802條經驗 獲得超5個贊
但在 map 或 slice 中也有幾個這樣的結構
您不能這樣做(以類型安全的方式)。例如切片的所有值必須具有相同的元素類型。如果你想存儲不同的,你必須求助于interface{}
稍后鍵入 switch。
如果您使用正確的技術術語參數多態性而不是不能解釋發生了什么的“泛型”,您就會明白為什么 func(T) 和 func(any) 是不同的、不可轉換的類型。
那么,有沒有辦法讓我把 T 變成 any?
不,沒有“泛型”之前的方式,也沒有“泛型”之后的方式。將“轉換為”視為 Go 允許的內容會有所幫助:“類型轉換”和“賦值”。您可以將 T 類型的任何變量分配給 any 類型的變量。
您可以通過使用適配器函數(閉包)來解決您的問題:
w := func(a any){ f(a.(T)) } b.x = append(b.x, &foo[any]{w})
- 1 回答
- 0 關注
- 135 瀏覽
添加回答
舉報
0/150
提交
取消