Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kami Boleh Mentakrifkan Gelagat Biasa untuk Koleksi Jenis Slice Berbeza dalam Go?

Bagaimanakah Kami Boleh Mentakrifkan Gelagat Biasa untuk Koleksi Jenis Slice Berbeza dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 02:48:09808semak imbas

How Can We Define Common Behavior for Collections of Different Slice Types in Go?

Mentakrifkan Gelagat Biasa untuk Koleksi Kepingan

Siasatan ini mencari pengesyoran untuk mewujudkan tingkah laku yang konsisten antara koleksi kepingan. Pertimbangkan contoh bekerja dengan selang separuh terbuka. Katakan anda mempunyai dua jenis selang sedemikian:

  • Selang Jam: Mewakili selang dalam satu hari, seperti "dari 1:00 petang selepas itu."
  • Tempoh: Mewakili selang tanpa penghujung yang ditentukan, seperti "mulai 9 Julai 1810 kami mengisytiharkan kemerdekaan."

Kedua-dua ClockInterval dan hirisan Tempoh sering ditemui dalam kod. Cabaran timbul apabila anda perlu mencari selang penutup untuk masa tertentu. Ini memerlukan penulisan fungsi FindEnclosingHalfOpenInterval untuk kedua-dua jenis, yang membawa kepada kod pendua.

Sampel kod yang disediakan (https://play.golang.org/p/Cy7fFaFzYJR) menunjukkan satu pendekatan, yang melibatkan penukaran jenis antara kepingan. Walau bagaimanapun, ia menimbulkan persoalan sama ada terdapat cara yang lebih cekap untuk mentakrifkan gelagat biasa untuk berbilang jenis kepingan.

Menukar Kepingan

Kaedah yang sesuai untuk menukar kepingan daripada satu jenis kepada yang lain adalah untuk mencipta kepingan baharu dan mengulangi elemen, menukarnya secara individu. Untuk penukaran yang lebih pantas, anda boleh pra-membuat kepingan yang terhasil:

func ToIntervalsFromClockIntervals(clockIntervals []ClockInterval) HalfOpenIntervals {
    intervals := make(HalfOpenIntervals, 0, len(clockIntervals))
    for _, clockInterval := range clockIntervals {
        intervals = append(intervals, clockInterval)
    }
    return intervals
}

Komposisi

Sebagai alternatif, pertimbangkan untuk menggunakan gubahan untuk menyelesaikan masalah ini. Ini melibatkan mencipta struct asas yang mengandungi logik FindEnclosingInterval biasa. Contohnya:

type HalfOpenIntervalBase struct {
    intervals []HalfOpenInterval
}

func (base *HalfOpenIntervalBase) FindEnclosingInterval(time Time) HalfOpenInterval {
    // Find and return the enclosing interval using base.intervals
}

Anda kemudiannya boleh mencipta jenis berasingan untuk ClockInterval dan Period yang membenamkan struct asas ini:

type ClockInterval struct {
    HalfOpenIntervalBase
}

type Period struct {
    HalfOpenIntervalBase
}

Menggunakan pendekatan ini, ClockInterval dan Period boleh memanfaatkan fungsi FindEnclosingInterval dari struct asas, menghapuskan penduaan.

Pengertian Terlalu

Adalah penting untuk ambil perhatian bahawa generalisasi yang berlebihan boleh menjadi tidak produktif. Walaupun tergoda untuk mengejar penyelesaian universal yang mengelakkan pertindihan kod, ia bukanlah pendekatan yang paling praktikal dalam Go. Penduaan kod untuk jenis yang berbeza selalunya diperlukan dan akhirnya boleh membawa kepada kod yang lebih bersih dan boleh diselenggara.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mentakrifkan Gelagat Biasa untuk Koleksi Jenis Slice Berbeza 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