简体   繁体   中英

Golang best way of calling/invoking sub project

Im moving my project from PHP to Golang and I looking efficient way of calling/invoking/handling control to sub project main.go from src main.go , I want to pass control from

http://localhost/  =>   http://localhost/sub-project1/
http://localhost/  =>   http://localhost/sub-project2/
http://localhost/  =>   http://localhost/sub-projectn/

I'm new to Golang I don't know how to do it in best way, and my project structure is

src/
    main.go
    sub-project1/
        main.go
    sub-project2/
        main.go
    sub-projectn/
        main.go
    gitHub.com/
        ......
    golang.org/
        ......

I'm using httprouter for routing, in main.go which is located under src contain following

package main
import ....

// homePageHandler
// contactPageHandler
// aboutPageHandler
// loginPageHandler
// signupPageHandler

func main() {
    router := httprouter.New()
    router.GET("/", homePageHandler)
    router.GET("/contact", contactPageHandler)
    router.GET("/about", aboutPageHandler)
    router.GET("/login", loginPageHandler)
    router.GET("/signup", signupPageHandler)

    // here I want to pass control to my sub project main.go 
    // and I don't want to write any /sub-project routing urls here,
    // because each /sub-project's contain many urls 
    router.GET("/sub-project1", ??????)
    router.GET("/sub-project2", ??????)
    router.GET("/sub-project3", ??????)
    router.GET("/sub-projectn", ??????)
}

and all files must be passes from src main.go because whole project has only one main() and inside any /sub-projectx main.go I want to do this

package main
import ....
// subprojectPageHandler
// feature1PageHandler
// feature2PageHandler
// feature3PageHandler
// ........
// featurenPageHandler

func main() {
    router := httprouter.New()
    router.GET("/sub-projectx", subprojectPageHandler)
    router.GET("/sub-projectx/feature1", feature1PageHandler)
    router.GET("/sub-projectx/feature2", feature2PageHandler)
    router.GET("/sub-projectx/feature3", feature3PageHandler)
    ..........
    router.GET("/sub-projectx/featureN", featureNPageHandler)


    // here I want to pass control to my sub project main.go 
    // and I don't want to write any /sub-project routing urls here,
    // because each /sub-project's contain many urls 
    router.GET("/sub-project1", ??????)
    router.GET("/sub-project2", ??????)
    router.GET("/sub-project3", ??????)
    router.GET("/sub-projectn", ??????)
}

To be

Golang source code is not running through interpreter, but is built into a binary, which gives less flexibility in case of dynamic projects. That said, I'd keep my projects isolated one from another, and would let Nginx (for example) take care of multiple project grouping. Of course, that would require some refactoring like creating shared packages, etc.

Or not to be

If, for some reason, you still think running multiple projects via single binary is ok, it's your choice. In this case you might have a look into route grouping that are available in some frameworks. Here's what Go Gin provides :

func main() {
    router := gin.Default()

    // Simple group: v1
    v1 := router.Group("/v1")
    {
        v1.POST("/login", loginEndpoint)
        v1.POST("/submit", submitEndpoint)
        v1.POST("/read", readEndpoint)
    }

    // Simple group: v2
    v2 := router.Group("/v2")
    {
        v2.POST("/login", loginEndpoint)
        v2.POST("/submit", submitEndpoint)
        v2.POST("/read", readEndpoint)
    }

    router.Run(":8080")
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM