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) }
Pelaksanaan kami begini.
type supercoolimpl struct {} func (sc *supercoolimpl) dooldcoolthing(value string) {}
Versi kebergantungan baharu menambah jenis baharu dalam modul jenis.
type newtype struct { value string }
Kebergantungan menambah kaedah pada antara muka.
type supercoolinterface interface { dooldcoolthing(value string) donewcoolthing(value types.newtype) }
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) {}
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.
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!