Rumah >pembangunan bahagian belakang >Golang >Go generik: kompaun literal tidak sah
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.
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{} }
Jika saya hanya membuat antara muka thing
中包含thing
,或者删除a string
和b int
,那么foo
和bar
tepat 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
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) }
Atau buat nilai sifar bukan penuding:
func createThing[T thing]() T { var value T return value }
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
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.
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}
。因此,当 foo
和 bar
都具有 struct{int id}
的底层类型时,则 thing
具有 struct{int id}
的核心类型,因此复合文字是可能的。当 foo
和 bar
没有相同的底层类型时,则 thing
Atas ialah kandungan terperinci Go generik: kompaun literal tidak sah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!