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

Bagaimanakah Saya Boleh Menetapkan Slice Struktur Go kepada Slice Antara Muka?

Patricia Arquette
Lepaskan: 2024-12-01 06:59:10
asal
323 orang telah melayarinya

How Can I Assign a Go Slice of Structs to an Interface Slice?

Slices Antara Muka dan Tatasusunan Struktur dalam Go

In Go, memberikan kepingan struct ([]MyStruct) kepada kepingan antara muka ([ ]antara muka{}) tidak boleh dilakukan secara langsung. Ini kerana struct dan antara muka menggunakan perwakilan memori yang berbeza.

Medan struktur bersebelahan dalam ingatan, manakala antara muka disimpan sebagai maklumat jenis dan pasangan data. Perbezaan ini menghalang penukaran langsung antara kedua-duanya.

Mengapa Tugasan Terus Gagal

Ralat pengkompil semasa cuba menetapkan x (sepotong struct) kepada y (antara muka slice) mencerminkan perbezaan asas ini. Go memerlukan keserasian jenis untuk tugasan dan kedua-dua jenis tidak sepadan.

Alternatif untuk Mengendalikan Tatasusunan Objek Generik

Walaupun ketidakupayaan untuk menetapkan tatasusunan struct secara langsung kepada kepingan antara muka , Go menawarkan beberapa pendekatan alternatif untuk mengendalikan objek generik tatasusunan:

  1. Salin Elemen Secara Individu: Elemen tatasusunan struct boleh disalin secara manual ke dalam kepingan antara muka menggunakan gelung.
  2. Kepingan Antara Muka: Anda boleh mencipta sekeping antara muka, di mana setiap antara muka memegang struktur individu objek.
  3. Pembungkus Antara Muka: Pembungkus antara muka boleh ditakrifkan untuk mewakili jenis tatasusunan struct dan disimpan sebagai nilai antara muka.

Kod Contoh

// Copy Elements Individually
var x []MyStruct = [...]MyStruct{{5}, {6}}
var y []interface{}
for _, v := range x {
    y = append(y, v)
}

// Interface Slices
var x []MyStruct = [...]MyStruct{{5}, {6}}
var y []interface{} = make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}

// Interface Wrapper
type MyStructArrayWrapper interface {
    Get() []MyStruct
}
type MyStructArrayWrapperImpl struct {
    array []MyStruct
}

func (w *MyStructArrayWrapperImpl) Get() []MyStruct {
    return w.array
}
x := []MyStruct{MyStruct{5}, MyStruct{6}}
var y interface{} = &MyStructArrayWrapperImpl{x}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menetapkan Slice Struktur Go kepada Slice Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan