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
Lepaskan: 2024-11-30 19:52:16
asal
424 orang telah melayarinya

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

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
}
Salin selepas log masuk
  • Antaramuka Slice Struktur: Gunakan antara muka{} pembolehubah untuk menahan []Kepingan MyStruct:
var y interface{}
y = x
Salin selepas log masuk

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!

sumber:php.cn
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