首頁  >  文章  >  後端開發  >  Go錯誤:無法在沒有實例化的情況下使用泛型類型

Go錯誤:無法在沒有實例化的情況下使用泛型類型

王林
王林轉載
2024-02-08 23:12:09691瀏覽

Go錯誤:無法在沒有實例化的情況下使用泛型類型

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除