Mengatasi fungsi daripada modul lain dalam Golang

王林
Lepaskan: 2024-02-14 18:15:10
ke hadapan
579 orang telah melayarinya

从 Golang 中的另一个模块覆盖函数

editor php Xigua di sini untuk memperkenalkan anda kepada topik yang menarik: mengatasi fungsi daripada modul lain di Golang. Di Golang, reka bentuk modular ialah corak pengaturcaraan biasa, yang menjadikan kod lebih mudah untuk dikekalkan dan dilanjutkan. Fungsi mengatasi ialah ciri berkuasa yang membolehkan kami mengatasi fungsi dalam satu modul dalam modul lain untuk mencapai tingkah laku tersuai. Artikel ini akan menerangkan secara terperinci cara menggunakan fungsi ganti, serta faedah dan pertimbangannya. Mari kita terokai topik menarik ini bersama-sama!

Kandungan soalan

Bagaimana untuk mengatasi fungsi yang dibuat dalam modul lain dalam golang?

modul a

Dalam modul, saya mempunyai fungsi newpersonapiservice, kod lengkap adalah seperti berikut:

package openapi

import (
    "context"
    "errors"
    "net/http"
)

// personapiservice is a service that implements the logic for the personapiservicer
// this service should implement the business logic for every endpoint for the personapi api.
// include any external packages or services that will be required by this service.
type personapiservice struct {
}

// newpersonapiservice creates a default api service
func newpersonapiservice() personapiservicer {
    return &personapiservice{}
}

// showperson - detail
func (s *personapiservice) showperson(ctx context.context) (implresponse, error) {
    // todo - update showperson with the required logic for this service method.
    // add api_person_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.

    //todo: uncomment the next line to return response response(200, person{}) or use other options such as http.ok ...
    //return response(200, person{}), nil

    //todo: uncomment the next line to return response response(0, error{}) or use other options such as http.ok ...
    //return response(0, error{}), nil

    return response(http.statusnotimplemented, nil), errors.new("showperson method not implemented")
}
Salin selepas log masuk

modul b

Dalam modul yang berasingan, saya ingin mengatasi perkhidmatan personapi baharu ini.

Saya boleh memanggil fungsi ini dalam modul lain dengan melakukan:

package main

import (
    "log"
    "net/http"

    openapi "build/code/spec/src"
)

func main() {

    log.printf("server started")

    personapiservice := openapi.newpersonapiservice()
    personapicontroller := openapi.newpersonapicontroller(personapiservice)

    router := openapi.newrouter(personapicontroller)

    log.fatal(http.listenandserve(":8080", router))

}
Salin selepas log masuk

Walau bagaimanapun, jika saya cuba mengatasi fungsi tersebut, saya mendapat ralat kompilasi, jenis openapi tidak dapat diselesaikan, inilah yang saya cuba lakukan:

package main

import (
    "context"
    "log"
    "net/http"

    openapi "build/code/spec/src"
)

func main() {

    log.printf("server started")

    personapiservice := openapi.newpersonapiservice()
    personapicontroller := openapi.newpersonapicontroller(personapiservice)

    router := openapi.newrouter(personapicontroller)

    log.fatal(http.listenandserve(":8080", router))

}

func (s openapi.personapiservice) showperson(ctx context.context) (openapi.implresponse, error) {

    return openapi.response(200, openapi.person{}), nil
}
Salin selepas log masuk

Berikut ialah gambar ralat kompilasi

Maklumat lain: Saya percaya modul b merujuk modul a dengan betul.

Kandungan fail go.mod modul a adalah seperti berikut:

module build/code/spec

go 1.13

require github.com/go-chi/chi/v5 v5.0.3
Salin selepas log masuk

Kandungan fail go.mod modul b adalah seperti berikut:

module bakkt.com/boilerplate

go 1.19

replace build/code/spec => ./../build/generated/

require build/code/spec v0.0.0-00010101000000-000000000000

require github.com/go-chi/chi/v5 v5.0.3 // indirect
Salin selepas log masuk

Penyelesaian

Penyelesaiannya ialah dengan melaksanakan kaedah showperson dalam modul lain, anda perlu mencipta jenis baharu yang melaksanakan antara muka personapiservicer dan menyediakan pelaksanaan sendiri kaedah showperson.

Menjalankan kod ini dalam modul b berfungsi dan membolehkan saya menukar respons panggilan api yang ditakrifkan dalam modul a.

package main

import (
    "context"
    "log"
    "net/http"

    openapi "build/code/spec/src"
)

type MyPersonApiService struct{}

func NewMyPersonApiService() openapi.PersonApiServicer {
    return &MyPersonApiService{}
}

func (s *MyPersonApiService) ShowPerson(ctx context.Context) (openapi.ImplResponse, error) {
    // TODO: Add your own implementation of the ShowPerson method here.

    // For example, you could retrieve a person's details and return them as follows:
    person := openapi.Person{Id: 23, Name: "Vark Thins", Age: 20}
    return openapi.Response(http.StatusOK, person), nil
}

func main() {

    log.Printf("Server started")

    PersonApiService := NewMyPersonApiService()
    PersonApiController := openapi.NewPersonApiController(PersonApiService)

    router := openapi.NewRouter(PersonApiController)

    log.Fatal(http.ListenAndServe(":8080", router))

}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengatasi fungsi daripada modul lain dalam Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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