Go generik: kompaun literal tidak sah

王林
Lepaskan: 2024-02-08 22:00:11
ke hadapan
1221 orang telah melayarinya

Go 泛型:无效的复合文字

editor php Xigua membawakan anda maklumat terkini - "Go Generics: Invalid Compound Literal". Dalam komuniti bahasa Go, generik sentiasa menjadi topik yang sangat membimbangkan. Dengan keluaran Go 1.18, generik akan dimasukkan secara rasmi dalam pustaka standard bahasa Go. Namun, keputusan ini tidak diterima oleh semua orang. Artikel ini akan membincangkan pelaksanaan generik dalam bahasa Go dan kontroversi serta perbincangan yang berkaitan untuk membantu pembaca memahami teknologi ini dengan lebih baik dan menyediakan rujukan untuk aplikasinya dalam pembangunan sebenar.

Kandungan soalan

Kod berikut menyebabkan ralat "Jenis literal kompaun tidak sah t".

package main

import "fmt"

func main() {
    fmt.Println(createThing[foo]())
}

type thing interface {
    foo | bar
}

type foo struct {
    id int
    a  string
}

type bar struct {
    id int
    b  int
}

func createThing[T thing, P *T]() P {
    return &T{}
}
Salin selepas log masuk

Jika saya hanya membuat antara muka thing中包含thing,或者删除a stringb int,那么foobartepat sama, kod akan berjalan tanpa ralat. Walau bagaimanapun, adakah ini mengalahkan tujuan generik? Mengapa saya tidak boleh membuat instantiat jenis generik seperti ini, terutamanya apabila saya tidak mempunyai akses kepada mana-mana medan?

Mungkin berkaitan dengan https://github.com/golang/go/issues/48522

Penyelesaian

Kebanyakan jenis generik bukan jenis yang sah untuk literal majmuk. Tetapi itu tidak menjadi masalah kerana terdapat cara lain untuk mencipta nilai jenis generik.

Buat penunjuk kepada nilai sifar baharu:

func creatething[t thing]() *t {
    return new(t)
}
Salin selepas log masuk

Atau buat nilai sifar bukan penuding:

func createThing[T thing]() T {
    var value T
    return value
}
Salin selepas log masuk

Adapun kenapa ralat berlaku dengan cara ini, berikut adalah penjelasan dari spec, diubah suai untuk menyelesaikan masalah khusus anda.

Untuk teks majmuk:

Jenis teras t literaltype mestilah jenis struktur, tatasusunan, kepingan atau peta

Apakah jenis teras?

Antara muka t mempunyai jenis teras jika [...] satu jenis u wujud, iaitu jenis asas untuk semua jenis dalam set jenis t

Tiada antara muka lain yang mempunyai jenis teras.

Apakah jenis asas?

Setiap jenis t mempunyai jenis pendasar: jika t ialah salah satu daripada jenis boolean, angka atau rentetan yang dipraisytiharkan, atau jenis literal, jenis pendasar yang sepadan ialah t itu sendiri. Jika tidak, jenis asas t ialah jenis asas bagi jenis yang dirujuk oleh t dalam pengisytiharannya.

"Jenis literal" boleh merujuk kepada jenis struktur literal, mis. struct{int id}。因此,当 foobar 都具有 struct{int id}底层类型时,则 thing 具有 struct{int id}核心类型,因此复合文字是可能的。当 foobar 没有相同的底层类型时,则 thing

Takrif formal mungkin kelihatan rumit, tetapi keputusan dan perkara praktikal adalah mudah: kod generik hanya boleh menyatakan tingkah laku biasa jenis yang mungkin. Nilai literal bukanlah tingkah laku biasa kecuali dalam kes khas di mana semua jenis asas adalah sama.

Atas ialah kandungan terperinci Go generik: kompaun literal tidak sah. 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!