Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memanjangkan Jenis Sedia Ada dalam Go Apabila Sambungan Terus Tidak Disokong?

Bagaimanakah Saya Boleh Memanjangkan Jenis Sedia Ada dalam Go Apabila Sambungan Terus Tidak Disokong?

DDD
DDDasal
2024-12-13 18:24:14337semak imbas

How Can I Extend Existing Types in Go When Direct Extension Is Not Supported?

Melanjutkan Jenis Sedia Ada dalam Go

Dalam Go, melanjutkan jenis sedia ada yang ditakrifkan dalam pakej luaran tidak disokong secara langsung. Walau bagaimanapun, terdapat penyelesaian untuk mencapai hasil yang serupa.

Mari kita pertimbangkan contoh yang diberikan dalam soalan:

package util

import(
    "net/http"
    "github.com/0xor1/gorillaseed/src/server/lib/mux"
)

func (r *mux.Route) Subroute(tpl string, h http.Handler) *mux.Route{
    return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
}

func (r *mux.Router) Subroute(tpl string, h http.Handler) *mux.Route{
    return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
}

Apabila cuba menyusun kod ini, seseorang menghadapi ralat: "Tidak dapat menentukan kaedah baharu pada mux.Router jenis bukan tempatan". Ini kerana Go tidak membenarkan sambungan terus jenis daripada pakej luaran.

Penyelesaian 1: Tentukan Jenis Pembungkus

Satu penyelesaian adalah dengan menentukan struct pembungkus yang membenamkan jenis asal dan menyediakan kaedah yang dikehendaki. Contohnya:

type MyRoute struct {
    *mux.Route
}

func (r *MyRoute) Subroute(tpl string, h http.Handler) *mux.Route {
    return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
}

type MyRouter struct {
    *mux.Router
}

func (r *MyRouter) Subroute(tpl string, h http.Handler) *mux.Route {
    return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
}

Penyelesaian 2: Jenis Penegasan

Pilihan lain ialah menggunakan penegasan jenis untuk menukar jenis asal kepada antara muka{} dan kemudian kepada jenis tersuai yang menyediakan kaedah yang diingini. Contohnya:

func (r interface{}) Subroute(tpl string, h http.Handler) *mux.Route {
    switch v := r.(type) {
    case *mux.Route:
        return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
    case *mux.Router:
        return v.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
    default:
        panic("unreachable")
    }
}

Nota: Penyelesaian ini mungkin memperkenalkan kerumitan tambahan dan harus digunakan dengan berhati-hati. Jika boleh, sebaiknya elakkan mengubah suai jenis luaran dan sebaliknya tentukan jenis anda sendiri yang membungkus atau memanjangkan fungsi yang anda perlukan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanjangkan Jenis Sedia Ada dalam Go Apabila Sambungan Terus Tidak Disokong?. 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