Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh menetapkan Tatasusunan Go Struct kepada Tatasusunan Antara Muka?

Bagaimanakah saya boleh menetapkan Tatasusunan Go Struct kepada Tatasusunan Antara Muka?

DDD
DDDasal
2024-11-30 19:52:16431semak imbas

How Can I Assign a Go Struct Array to an Interface Array?

Teka-teki Tugasan Tatasusunan Antara Muka dalam Go

Dalam Go, percubaan untuk menetapkan tatasusunan struct terus kepada tatasusunan antara muka, seperti yang ditunjukkan di bawah, menghasilkan ralat masa kompilasi:

x := []MyStruct{...}
var y []interface{}
y = x // Error: cannot use x as type []interface {}

Ralat ini berpunca daripada perbezaan asas dalam cara jenis struct dan antara muka disimpan dalam ingatan. Antara muka disimpan sebagai pasangan dua perkataan, yang terdiri daripada maklumat jenis dan data, manakala jenis struct disimpan sebagai medan bersebelahan dalam ingatan.

Memandangkan perwakilan ini tidak sejajar, penukaran langsung antara kedua-duanya tidak boleh dilaksanakan. Adalah perlu untuk menyalin elemen secara individu ke kepingan destinasi.

Untuk menyelesaikan isu ini, pertimbangkan salah satu daripada pilihan berikut:

  • Slice of Interface: Gunakan hirisan []antara muka{}, di mana setiap elemen ialah antara muka yang mewakili struct taip:
var y []interface{}
y = make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}
  • Antaramuka Slice Struktur: Gunakan antara muka{} pembolehubah untuk menahan []Kepingan MyStruct:
var y interface{}
y = x

Dalam senario terakhir, antara muka memegang rujukan abstrak kepada []MyStruct yang mendasari potong, membenarkan tingkah laku polimorfik.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menetapkan Tatasusunan Go Struct kepada Tatasusunan Antara Muka?. 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