php小編蘋果今天要跟大家分享的是關於Go語言中的一個錯誤:無法在沒有實例化的情況下使用泛型類型。在Go語言中,泛型是一種非常強大的特性,可以讓我們編寫更通用和更靈活的程式碼。然而,有時候我們可能會遇到一個問題,就是在沒有實例化的情況下無法使用泛型類型。這個錯誤可能會讓我們感到困惑,不知道該如何解決。接下來,就讓我們一起來看看這個問題的原因和解決方法吧!
在學習 Go 泛型時,我遇到了一個似乎無法解決的錯誤。我將其歸結為最簡單的程式碼:
type opStack[T any] []T func main() { t := make(opStack) // t := new(opStack) t = append(t, 0) fmt.Println(t[0]) }
在 Playground 中,在 make()
呼叫(以及在已註解掉的 new
呼叫上類似)出現以下錯誤訊息:
cannot use generic type opStack[T any] without instantiation
但是 make()
是一個實例化函數。所以,我希望我錯過了一些語法上的微妙之處。 Go 抱怨什麼以及需要糾正什麼?
每當您使用參數化類型時,包括需要類型參數的任何地方,例如內建的make
,您必須將其定義中的類型參數替換為實際類型。這稱為實例化。
t := make(opStack[int], 0) t = append(t, 0)
如果將泛型類型用作另一個泛型類型的型別參數,則也必須實例化它:
type Data[T any] struct { data T } d := Data[opStack[int]]{ data: []int{0, 1, 2} }
您可以使用類型參數進行實例化,例如在函數簽名、欄位和類型定義中:
type FooBar[T any] struct { ops opStack[T] } type OpsMap[T any] map[string]opStack[T] func echo[T any](ops opStack[T]) opStack[T] { return ops }
語言規範中的相關引用(目前)位於兩個不同的位置,類型定義一个>:
和實例化
#在其他程式語言中,「實例化」可能指建立物件的實例-在 Go 中,該術語特別使用具體類型取代類型參數。在我看來,該術語的用法仍然是一致的,儘管在 Go 中它並不一定意味著分配。
請注意,您可以在沒有明確類型參數的情況下呼叫泛型函數。實例化也在那裡發生,只是類型參數可能全部從函數參數推斷出來:
func Print[T, U any](v T, w U) { /* ... */ } Print("foo", 4.5) // T is inferred from "foo", U from 4.5
推理過去也適用於泛型類型,但限制是類型參數清單必須非空。但是此功能已停用,因此您必須明確提供所有類型參數。
type Vector[T any] []T // v := Vector[int]{} -> must supply T type Matrix[T any, U ~[]T] []U // m := Matrix[int, []int]{} -> must supply T and U
以上是Go錯誤:無法在沒有實例化的情況下使用泛型類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!