带有通道的Golang把手

带有通道的Golang把手,go,Go,我想这个问题以前有人问过(可能不止一次),但我找不到 我正在学习Go,我想通过向“处理程序”发送一个通道来扩展经典的web服务器示例 我有一个标准的东西: func hello(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello world!") } func main() { http.HandleFunc("/", hello) http.ListenAndServe(":8000",

我想这个问题以前有人问过(可能不止一次),但我找不到

我正在学习Go,我想通过向“处理程序”发送一个通道来扩展经典的web服务器示例

我有一个标准的东西:

func hello(w http.ResponseWriter, r *http.Request) {
   io.WriteString(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8000", nil)
}
现在我希望“hello”功能能够在频道上写东西,供用户使用。。。我使用“正常”函数的方法是创建一个通道:

c := make(chan string) 
并在对函数的调用中传递c。比如:

dosomething(c)

但是。。。如果我想通过“hello”访问频道c,我该怎么做?

有几种方法可以解决这个问题,最简单的方法是在一个包中定义一个导出的频道,然后在您想要使用频道的任何地方导入所述包

package mychannel

var Chan = make(chan string)
func makeHello(logger chan string) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        logger <- r.Host
        io.WriteString(w, "Hello world!")
    }
}

有两种其他方法可以做到这一点(除了在前面的答案中导出频道)

第一种方法是使用一个函数返回另一个处理函数。当函数返回时,它将在通道周围创建一个闭包

package mychannel

var Chan = make(chan string)
func makeHello(logger chan string) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        logger <- r.Host
        io.WriteString(w, "Hello world!")
    }
}
func makeHello(logger chan string)func(http.ResponseWriter,*http.Request){
return func(w http.ResponseWriter,r*http.Request){

logger非常感谢您提供了这么好的示例。我最终使用了方法1,它做得非常完美。来自python,我不知道如何做这么简单的事情。有趣的是,实际上有一个非常简单的解决方案来解决这个问题,所需的只是范式转换。方法2不起作用。每次向main()添加通道时,服务器启动但不工作。通过使用struct ad receiver或global var chan。@Andy上面的示例代码不工作吗?我认为它非常清楚地表明方法2可以工作,但我想知道我是否错了。我也使用了第一种方法,非常有用谢谢你的帮助!最后我使用了方法pro取而代之的是sberry,但我还是很感谢你的帮助!这就像“Go风格的单身模式”.@SiuChingPong AsukaKenji-nah,只是一个全局变量。你可以在Go中使用一个带有公共构造函数的私有类型的singleton,该函数返回私有类型的实例的私有变量,这将强制执行singleton模式。不过,我不确定我是否见过有人在Go中编写代码来执行大部分操作。