Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 创建http处理程序_Go - Fatal编程技术网

Go 创建http处理程序

Go 创建http处理程序,go,Go,我有main.go,我想改成更好的结构(类似于main2.go),因为如果项目长大了,对新开发人员来说,代码的解释就不容易了 我的想法是创建一个名为handle的文件夹,并将文件handle.go和所有handles方法放在其中,我发现的问题是我不知道如何在handler.go中设置http.HandleFunc(“/R1”,HandlerOne)和http.HandleFunc(/R2),并从main2.go调用它 梅因,加油 package main import ( "fmt"

我有main.go,我想改成更好的结构(类似于main2.go),因为如果项目长大了,对新开发人员来说,代码的解释就不容易了

我的想法是创建一个名为handle的文件夹,并将文件handle.go和所有handles方法放在其中,我发现的问题是我不知道如何在handler.go中设置
http.HandleFunc(“/R1”,HandlerOne)
http.HandleFunc(/R2),并从main2.go调用它

梅因,加油

package main

import (
    "fmt"
    "net/http"

)

func HandlerOne(w http.ResponseWriter, req *http.Request) {
    fmt.Println("message one")
}

func HandlerTwo(w http.ResponseWriter, req *http.Request) {
    fmt.Println("message two")
}

func main() {

    http.HandleFunc("/R1", HandlerOne)
    http.HandleFunc("/R2", HandlerTwo)

    err := http.ListenAndServe(":9998", nil)

    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}
美茵2.go

package main

import (
    "fmt"
    "net/http"

)


func main() {

   // Call handle.go

    err := http.ListenAndServe(":9998", nil)

    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}
package main

import (
        "fmt"
        "net/http"
        "handlers/handle"

)


func main() {

        // Call handle.go
        handle.SetUpMapping(...) // i dont know what parameter put here
        err := http.ListenAndServe(":9998", nil)

        if err != nil {
                    fmt.Printf("Server failed: ", err.Error())
        }
}
去吧

package handle

import (
    "fmt"
    "net/http"
)

func HandlerOne(w http.ResponseWriter, req *http.Request) {
    fmt.Println("message one")
 }

func HandlerTwo(w http.ResponseWriter, req *http.Request) {
    fmt.Println("message two")
}
注意: 谢谢@kluig的回答。我想补充一点,我想说的似乎不是很清楚:

我想要的是在
handle.go在哪里可以放置所有句柄的映射。i、 我喜欢那样的人

func SetUpMapping(...){
    http.HandleFunc("/R1", HandlerOne)
    http.HandleFunc("/R2", HandlerTwo)

   .....  //Others mapping
    http.HandleFunc("/RN", HandlerN)

}
在哪里。。。应该是http的一个引用,但这是一个包,基本上类似于代码3

代码3

美茵2.go

package main

import (
    "fmt"
    "net/http"

)


func main() {

   // Call handle.go

    err := http.ListenAndServe(":9998", nil)

    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}
package main

import (
        "fmt"
        "net/http"
        "handlers/handle"

)


func main() {

        // Call handle.go
        handle.SetUpMapping(...) // i dont know what parameter put here
        err := http.ListenAndServe(":9998", nil)

        if err != nil {
                    fmt.Printf("Server failed: ", err.Error())
        }
}

我把你的代码放到
$GOPATH/handlers
文件夹中,把main2.go放到
$GOPATH/handlers/handle
文件夹中。然后我换了主菜2.去吧

package main

import (
    "fmt"
    "net/http"

    "handlers/handle"
)

func main() {

    // Call handle.go

    http.HandleFunc("/R1", handle.HandlerOne)
    http.HandleFunc("/R2", handle.HandlerTwo)

    err := http.ListenAndServe(":9998", nil)

    if err != nil {
        fmt.Printf("Server failed: ", err.Error())
    }
}
它编译并运行良好。我相信这就是你要求的

更新

好的,你可以把这个加到你的把手上

func SetUpMapping() {
    http.HandleFunc("/R1", HandlerOne)
    http.HandleFunc("/R2", HandlerTwo)

    .....  //Others mapping
    http.HandleFunc("/RN", HandlerN)

}
然后在main2.go

package main

import (
        "fmt"
        "net/http"
        "handlers/handle"
)


func main() {

        // Call handle.go
        handle.SetUpMapping() // you don't need any parameters here
        err := http.ListenAndServe(":9998", nil)

        if err != nil {
                    fmt.Printf("Server failed: ", err.Error())
        }
}

阅读基础知识:谢谢@Klug的回答,我添加了一条注释,更好地解释了我想要的内容。@carlosanderesgarcía好的,更新了我的答案。http就像对包http的“全局”引用,您不需要将其作为参数发送