Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menetapkan Sekeping Struktur kepada Sekeping Antara Muka dalam Go?

Bagaimanakah Saya Boleh Menetapkan Sekeping Struktur kepada Sekeping Antara Muka dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-30 19:19:15329semak imbas

How Can I Assign a Slice of Structs to a Slice of Interfaces in Go?

Menetapkan Slice of Structs to Interface Slice

Apabila cuba untuk menetapkan sekeping struct ([]MyStruct) kepada secebis antara muka ( []antara muka{}), anda mungkin menghadapi ralat masa kompilasi. Ini kerana struct dan antara muka mempunyai perwakilan memori yang berbeza.

Struktur mempunyai medannya disimpan bersebelahan dalam ingatan, manakala antara muka disimpan sebagai pasangan dua perkataan, satu untuk maklumat jenis dan satu untuk data sebenar. Perbezaan ini menghalang penugasan langsung.

Penyelesaian yang Mungkin:

  • Salin Elemen Secara Individu: Anda boleh mengulang secara manual ke atas kepingan dan salin struktur setiap elemen ke dalam antara muka slice.
y := make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}
  • Gunakan Pembalut Antara Muka: Anda boleh mencipta jenis pembalut yang melaksanakan antara muka{} antara muka dan memegang struct asas.
type IMyStruct struct {
    MyStruct
}

func (i IMyStruct) Interface() interface{} {
    return i.MyStruct
}

x := []MyStruct{{5}, {6}}
y := []interface{}{IMyStruct{x[0]}, IMyStruct{x[1]}}
  • Guna Kosong Antara muka: Anda boleh menetapkan kepingan struct kepada antara muka kosong, yang boleh menyimpan nilai apa-apa jenis.
var y interface{}
y = x // No type conversion required

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menetapkan Sekeping Struktur kepada Sekeping Antara Muka dalam Go?. 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