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
Lepaskan: 2024-12-13 18:24:14
asal
334 orang telah melayarinya

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)
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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")
    }
}
Salin selepas log masuk

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!

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