Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menguruskan Fungsi untuk Struktur Go Serupa dengan Medan Dikongsi?

Bagaimana untuk Menguruskan Fungsi untuk Struktur Go Serupa dengan Medan Dikongsi?

DDD
Lepaskan: 2024-10-29 04:52:02
asal
363 orang telah melayarinya

How to Manage Functions for Similar Go Structs with Shared Fields?

Go Best Practice: Mengurus Fungsi untuk Struktur Serupa dengan Medan Dikongsi

Dalam Go, adalah perkara biasa untuk menghadapi berbilang struct dengan medan yang serupa dan terdapat keperluan untuk melakukan operasi yang sama pada mereka. Untuk mengelakkan pengulangan kod sambil mengekalkan fleksibiliti, pertimbangkan strategi berikut:

Mencipta Jenis Tersuai untuk Medan Dikongsi:

Jika medan kongsi ialah jenis data ringkas ( cth., rentetan), pertimbangkan untuk menentukan jenis tersuai untuknya. Ini membolehkan anda melampirkan kaedah pada jenis tersuai, yang kemudiannya boleh digunakan oleh mana-mana struct yang membenamkan jenis tersebut.

<code class="go">type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}</code>
Salin selepas log masuk

Kemudian, benamkan jenis Versi dalam struct:

<code class="go">type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}</code>
Salin selepas log masuk

Ini membolehkan anda mencetak versi menggunakan kaedah PrintVersion pada medan Versi:

<code class="go">g.PrintVersion()
e.PrintVersion()</code>
Salin selepas log masuk

Menggunakan Refleksi:

Jika medan kongsi boleh menjadi jenis yang berbeza atau jika anda mahukan lebih fleksibiliti, anda boleh menggunakan refleksi untuk menggunakan kaedah yang sesuai secara dinamik. Pendekatan ini lebih kompleks dan mempunyai beberapa implikasi prestasi, tetapi ia memberikan fleksibiliti yang lebih besar.

<code class="go">type Printer interface {
    PrintVersion() error
}

func PrintVersion(p Printer) error {
    t := reflect.TypeOf(p)
    method, ok := t.MethodByName("PrintVersion")
    if !ok {
        return fmt.Errorf("object doesn't have a PrintVersion method")
    }

    return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}</code>
Salin selepas log masuk

Anda kemudian boleh menggunakan fungsi PrintVersion untuk menggunakan kaedah PrintVersion pada mana-mana objek yang melaksanakan antara muka Pencetak:

<code class="go">var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menguruskan Fungsi untuk Struktur Go Serupa dengan Medan Dikongsi?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan