Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mencapai Kesan Tampalan Monyet dalam Go untuk Ujian dan Penandaarasan?

Bagaimanakah Saya Boleh Mencapai Kesan Tampalan Monyet dalam Go untuk Ujian dan Penandaarasan?

Linda Hamilton
Lepaskan: 2024-12-11 12:26:11
asal
722 orang telah melayarinya

How Can I Achieve the Effect of Monkey Patching in Go for Testing and Benchmarking?

Monkey Patching in Go

Dalam bahasa pengaturcaraan Go, mengejek boleh mencabar apabila berurusan dengan kod yang tidak berstruktur di sekitar antara muka. Apabila struct saling berhubung secara langsung dan suntikan kebergantungan tidak hadir, ia menghalang keupayaan untuk menguji dan menanda aras secara berkesan tanpa mengubah suai kod asas.

Satu teknik yang mungkin terlintas di fikiran daripada bahasa skrip seperti Python ialah tampalan monyet, di mana objek boleh diubah suai semasa runtime. Walaupun Go tidak mempunyai mekanisme yang setara untuk pengubahsuaian objek langsung, terdapat pendekatan alternatif untuk mencapai hasil yang serupa.

Satu strategi biasa ialah mencipta antara muka anda sendiri sebagai pembalut di sekeliling struktur yang anda ingin ejek. Ini membolehkan anda melaksanakan tingkah laku yang diingini dalam kaedah antara muka, sambil mengekalkan fungsi asal dalam struct asas. Contohnya:

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}

type Concrete struct {
    client *somepackage.Client
}

func (c *Concrete) DoSomething(i int) error {
    return c.client.DoSomething(i)
}

func (c *Concrete) DoSomethingElse() ([]int, error) {
    return c.client.DoSomethingElse()
}
Salin selepas log masuk

Dengan melaksanakan MyInterface, anda kini boleh membuat pelaksanaan olok-olok untuk ujian anda:

// MockMyInterface implements MyInterface for testing purposes
type MockMyInterface struct {
    mockedDoSomethingError error
    mockedDoSomethingElseResult []int
}

func (m *MockMyInterface) DoSomething(i int) error {
    return m.mockedDoSomethingError
}

func (m *MockMyInterface) DoSomethingElse() ([]int, error) {
    return m.mockedDoSomethingElseResult, nil
}
Salin selepas log masuk

Pendekatan lain, yang dicadangkan oleh @elithrar dalam ulasan, ialah membenamkan taip yang anda ingin ejek dalam struct anda sendiri. Ini membolehkan anda mengejek kaedah yang memerlukannya secara selektif:

type Concrete struct {
    *somepackage.Client
}
Salin selepas log masuk

Dengan membenamkan Klien, anda boleh terus memanggil kaedah seperti DoSomethingNotNeedingMocking tanpa menambahkannya pada antara muka atau mencipta olok-olok untuk mereka.

Teknik ini menyediakan alternatif yang berdaya maju kepada tampalan monyet untuk ujian dan kod penanda aras yang tidak berstruktur di sekeliling antara muka.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Kesan Tampalan Monyet dalam Go untuk Ujian dan Penandaarasan?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan