Bagaimana untuk menyokong berbilang versi antara muka yang sama?

WBOY
Lepaskan: 2024-02-06 09:09:15
ke hadapan
1144 orang telah melayarinya

Bagaimana untuk menyokong berbilang versi antara muka yang sama?

Kandungan soalan

Saya sedang menulis modul go yang melaksanakan struktur yang memenuhi antara muka. Kami hanya mahu mengekalkan satu versi pustaka, tetapi pelanggan kami menggunakan berbilang versi salah satu kebergantungan kami.

Kebergantungan menyediakan antara muka yang ingin kami laksanakan seperti yang ditunjukkan di bawah.

type supercoolinterface interface {
    dooldcoolthing(value string)
}
Salin selepas log masuk

Pelaksanaan kami begini.

type supercoolimpl struct {}

func (sc *supercoolimpl) dooldcoolthing(value string) {}
Salin selepas log masuk

Versi kebergantungan baharu menambah jenis baharu dalam modul jenis.

type newtype struct {
  value string
}
Salin selepas log masuk

Kebergantungan menambah kaedah pada antara muka.

type supercoolinterface interface {
    dooldcoolthing(value string)
    donewcoolthing(value types.newtype)
}
Salin selepas log masuk

Sekarang jika saya melaksanakan kaedah baru ia tidak akan dikompilasi dengan versi lama perpustakaan kerana types.newtype tidak wujud. Walau bagaimanapun, saya tidak dapat memenuhi versi baharu antara muka jika saya tidak melaksanakan versi baharu.

type SuperCoolImpl struct {}

func (sc *SuperCoolImpl) DoOldCoolThing(value string) {}
func (sc *SuperCoolImpl) DoNewCoolThing(value types.NewType) {}
Salin selepas log masuk

Adakah kita perlu memotong kod untuk menyokong versi ini? Dalam bahasa dengan prapemproses, terdapat penyelesaian mudah, jadi saya mengandaikan go mesti mempunyai penyelesaian yang saya hilang.

Kami merancang untuk terus membangun dan menyokong kedua-dua versi, jadi perlu memastikan konsistensi merentas dua versi berbeza boleh menjengkelkan. Saya berharap saya boleh melakukan sesuatu dengan refleksi atau sesuatu yang serupa dengan prapemproses c di mana saya boleh menentukan nilai prapemproses dan hanya melaksanakan kaedah jika kami mengarahkan versi perpustakaan untuk mempunyai jenis yang betul.


Jawapan betul


Saya menemui penyelesaian yang sesuai untuk situasi saya.

Terima kasih kepada @Burak Serdar kerana menunjukkan saya ke arah yang betul.

Penyelesaian saya ialah meletakkan pelaksanaan lama ke dalam pakej impl/v0 dan pelaksanaan baharu ke dalam pakej impl/v1.

Pelanggan yang menggunakan versi kebergantungan yang lebih lama akan menggunakan impl/v0 dan pelanggan yang menggunakan versi ketergantungan yang lebih baharu akan menggunakan impl/v1.

Memandangkan golang hanya menyusun kod yang diimport terus, hanya pakej dengan versi antara muka yang betul akan disusun, jadi kedua-dua arah akan berjaya disusun.

Ini mengurangkan kebimbangan saya tentang terpaksa bercabang di seluruh perpustakaan.

EDIT: Sekiranya sesiapa menggunakan penyelesaian ini, terdapat masalah jika anda sedang menggunakan go test ./... untuk menjalankan ujian anda. Perintah itu nampaknya cuba membina setiap modul sama ada ia mengandungi ujian atau tidak.

Tetapi anda boleh menggunakan go test $(go list ./... | grep -v <path_to_ignore>)</path_to_ignore> untuk mengecualikan ujian, yang kemudiannya anda boleh jalankan terhadap versi yang betul dalam arahan lain.

Atas ialah kandungan terperinci Bagaimana untuk menyokong berbilang versi antara muka yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!