Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mendaftar Pakej Go Tanpa Membuat Ketergantungan Kitaran?

Bagaimana untuk Mendaftar Pakej Go Tanpa Membuat Ketergantungan Kitaran?

DDD
Lepaskan: 2024-12-21 06:52:10
asal
864 orang telah melayarinya

How to Register Go Packages Without Creating Cyclic Dependencies?

Mendaftar Pakej dalam Go tanpa Ketergantungan Kitaran

Masalah:

Anda mempunyai pakej pusat yang menyediakan antara muka dan bergantung pada pakej lain yang menawarkan pelaksanaan antara muka tersebut. Walau bagaimanapun, termasuk pakej bergantung ini dalam pakej pusat mewujudkan pergantungan kitaran, yang tidak dibenarkan oleh Go.

Penyelesaian Perpustakaan Standard:

  • Tanpa Central Registry: Tentukan antara muka dalam satu pakej dan pelaksanaan konkrit dalam pakej berasingan. Pengguna secara eksplisit menyatakan pelaksanaan yang hendak digunakan.
  • Dengan Central Registry: Pelaksanaan mendaftarkan diri mereka dalam pendaftaran pusat (selalunya melalui fungsi package init()). Ini membenarkan pelanjutan tetapi memerlukan pendaftaran manual.

Penyelesaian Pendaftaran Tersuai:

  • Buat pakej tambahan (pf) yang menyediakan kaedah "kilang" untuk mewujudkan pelaksanaan tertentu.
  • Pakej kilang bergantung pada kedua-dua pakej antara muka (pi) dan pakej pelaksanaan (pa, pb, dsb.), tetapi ini tidak mewujudkan kitaran kerana pf tidak bergantung pada dirinya sendiri.

Memilih Penyelesaian Terbaik:

Pendekatan yang ideal bergantung pada keperluan khusus:

  • Jika anda boleh menentukan pelaksanaan untuk digunakan, pilih penyelesaian pertama (tanpa pusat registry).
  • Jika kebolehlanjutan adalah kritikal dan anda tidak boleh meramalkan pelaksanaan, pertimbangkan penyelesaian kedua atau ketiga (dengan pendaftaran pusat atau tersuai).

Contoh Kod untuk Penyelesaian Pendaftaran Tersuai:

// Package pi defines an interface I.
package pi

type I interface {
    // Some method.
    DoSomething()
}

// Package pa implements I with type A.
package pa

import "pi"

type A struct{}

func (a *A) DoSomething() {
    // Some implementation.
}

// Package pb implements I with type B.
package pb

import "pi"

type B struct{}

func (b *B) DoSomething() {
    // Some implementation.
}

// Package pf provides a factory to create instances of I.
package pf

import (
    "pi"
    "pa"
    "pb"
)

// NewClient returns an instance of I based on a flag.
func NewClient(flag string) pi.I {
    switch flag {
    case "a":
        return &pa.A{}
    case "b":
        return &pb.B{}
    default:
        panic("Invalid flag")
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mendaftar Pakej Go Tanpa Membuat Ketergantungan Kitaran?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan