Rumah >pembangunan bahagian belakang >Golang >Mengapa Jenis Generik Go dengan Jenis Berbeza Argumen Tidak Boleh Ditugaskan kepada Satu Sama Lain?

Mengapa Jenis Generik Go dengan Jenis Berbeza Argumen Tidak Boleh Ditugaskan kepada Satu Sama Lain?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 11:22:09645semak imbas

Why Can't Go's Generic Types with Different Type Arguments Be Assigned to Each Other?

Mengapa Kejadian Generik Jenis Yang Sama Tidak Boleh Ditugaskan kepada Satu Sama Lain?

Go melarang memberikan contoh jenis generik dengan jenis yang berbeza argumen antara satu sama lain, walaupun jenis argumen memenuhi hubungan antara muka. Untuk menggambarkan ini, pertimbangkan kod berikut:

type Generic interface {
    ID() string
}

type Props[G Generic] struct{}

type Example struct {
    id string
}

func (example Example) ID() string {
    return example.id
}

var ExampleProps = Props[Example]{}

func Problem() Props[Generic] {
    return ExampleProps
}

Melaksanakan kod ini mengakibatkan ralat penyusunan:

cannot use ExampleProps (variable of type Props[Example]) as Props[Generic] value in return statement

Ralat ini timbul kerana membuat instantiation jenis generik dengan argumen jenis baharu menghasilkan jenis yang berbeza. Khususnya:

  • Props[Contoh] ialah satu jenis bernama dan
  • Props[Generik] ialah jenis lain bernama.

Dua jenis ini bukan boleh ditukar ganti, walaupun pada hakikatnya Contoh melaksanakan Generik. Oleh itu, memberikan ContohProps (contoh Props[Contoh]) kepada Props[Generik] adalah tidak sah.

Tingkah laku ini meliputi generik yang digunakan dengan mana-mana. mana-mana hanyalah jenis statik alias antara muka kosong: antara muka{}. Ia tidak bersamaan dengan "mana-mana jenis" atau T. Oleh itu, jenis yang diwujudkan dengan mana-mana tidak boleh diserahkan kepada jenis yang digunakan dengan jenis tertentu yang lain.

Untuk menyelesaikan isu ini, anda boleh membuat seketika Props dengan parameter jenis , memastikan bahawa kedua-dua jenis input dan output fungsi adalah konsisten. Contohnya:

type Props[G Generic] struct{ Value G }

func Problem[T Generic](v T) Props[T] {
    return Props[T]{ Value: v }
}

func main() {
    a := Problem(Example{})
    fmt.Println(a)
}

Atas ialah kandungan terperinci Mengapa Jenis Generik Go dengan Jenis Berbeza Argumen Tidak Boleh Ditugaskan kepada Satu Sama Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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