Ralat Pergi: Tidak boleh menggunakan jenis generik tanpa instantiasi

王林
Lepaskan: 2024-02-08 23:12:09
ke hadapan
689 orang telah melayarinya

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])
}
Salin selepas log masuk

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

cannot use generic type opStack[T any] without instantiation
Salin selepas log masuk

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)
Salin selepas log masuk
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} }
Salin selepas log masuk
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 }
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!