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!
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") }
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)) }
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 }
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
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
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)) }
Atas ialah kandungan terperinci Mengatasi fungsi daripada modul lain dalam Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!