Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat Pergi: Tidak boleh menggunakan jenis generik tanpa instantiasi

Ralat Pergi: Tidak boleh menggunakan jenis generik tanpa instantiasi

王林
王林ke hadapan
2024-02-08 23:12:09690semak imbas

Ralat Pergi: Tidak boleh menggunakan jenis generik tanpa instantiasi

Apa yang ingin dikongsi oleh editor PHP Apple dengan anda hari ini ialah tentang pepijat dalam bahasa Go: jenis generik tidak boleh digunakan tanpa instantiasi. Dalam bahasa Go, generik ialah ciri yang sangat berkuasa yang membolehkan kami menulis kod yang lebih serba boleh dan fleksibel. Walau bagaimanapun, kadangkala kita mungkin menghadapi masalah di mana kita tidak boleh menggunakan jenis generik tanpa instantiasi. Ralat ini mungkin membuatkan kita keliru tentang cara membetulkannya. Seterusnya, mari kita lihat punca dan penyelesaian kepada masalah ini!

Kandungan soalan

Semasa mempelajari Go generik, saya mengalami ralat yang nampaknya tidak dapat saya selesaikan. Saya merebusnya kepada kod yang paling mudah:

type opStack[T any] []T

func main() {

    t := make(opStack)
    //  t := new(opStack)
    t = append(t, 0)
    fmt.Println(t[0])
}

Di Taman Permainan, serupa pada make() 调用(以及在已注释掉的 new panggilan) mesej ralat berikut muncul:

cannot use generic type opStack[T any] without instantiation

Tetapi make() ialah fungsi instantiasi. Jadi, saya berharap saya kehilangan beberapa kehalusan sintaks. Apa yang Go mengadu dan apakah yang perlu diperbetulkan? . Ini dipanggil instantiation. make() 是一个实例化函数。所以,我希望我错过了一些语法上的微妙之处。 Go 抱怨什么以及需要纠正什么?

解决方法

每当您使用参数化类型时,包括需要类型参数的任何地方,例如内置的 make

t := make(opStack[int], 0)
t = append(t, 0)
Jika anda menggunakan jenis generik sebagai

parameter jenis bagi

jenis generik yang lain, anda mesti membuat instantiatnya juga:

type Data[T any] struct {
    data T
}

d := Data[opStack[int]]{ data: []int{0, 1, 2} }
Anda boleh menggunakan parameter jenis untuk instantiasi, contohnya dalam tandatangan fungsi, medan dan definisi jenis:

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 }

Rujukan yang berkaitan dalam spesifikasi bahasa adalah (pada masa ini) di dua lokasi berbeza,

takrifan jenis

: 一个> dan

instantiasi

Dalam bahasa pengaturcaraan lain, "instantiation" mungkin merujuk kepada mencipta tika objek - dalam Go, istilah ini secara khusus merujuk kepada menggantikan parameter jenis dengan jenis konkrit. Pada pendapat saya, penggunaan istilah masih konsisten, walaupun dalam Go ia tidak semestinya bermaksud peruntukan.

Perhatikan bahawa anda boleh memanggil fungsi generik tanpa parameter jenis eksplisit. Instantiation berlaku di sana juga, cuma parameter jenis semuanya boleh disimpulkan daripada parameter fungsi:
func Print[T, U any](v T, w U) { /* ... */ }

Print("foo", 4.5) // T is inferred from "foo", U from 4.5

Alasan yang digunakan untuk

jenis

generik juga, dengan sekatan bahawa senarai parameter jenis mestilah tidak kosong. Tetapi ciri ini dilumpuhkan, jadi anda mesti menyediakan semua parameter jenis secara eksplisit.

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

Atas ialah kandungan terperinci Ralat Pergi: Tidak boleh menggunakan jenis generik tanpa instantiasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam