为了账号安全,请及时绑定邮箱和手机立即绑定

Golang handlefunc 带通道

Golang handlefunc 带通道

Go
撒科打诨 2021-09-13 16:11:34
我认为这个问题以前曾被问过(可能不止一次),但我找不到它......我正在学习 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)但是......如果我想要“你好”访问频道c,我该怎么做?
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

还有其他两种方法可以做到这一点(除了像上一个答案那样导出频道)。


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


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!")

    }

}

第二种是使用一个结构体,该结构体将通道作为成员保存,并使用指针接收器方法来处理请求......


type DataPasser struct {

    logs chan string

}


func (p *DataPasser) handleHello(w http.ResponseWriter, r *http.Request) {

    p.logs <- r.URL.String()

    io.WriteString(w, "Hello world")

}

这是一个完整的工作示例(只需点击 /1 和 /2 即可查看两个示例)


package main


import (

    "fmt"

    "io"

    "net/http"

)


func main() {

    // METHOD 1

    logs := make(chan string)

    go logLogs(logs)

    handleHello := makeHello(logs)


    // METHOD 2

    passer := &DataPasser{logs: make(chan string)}

    go passer.log()


    http.HandleFunc("/1", handleHello)

    http.HandleFunc("/2", passer.handleHello)

    http.ListenAndServe(":9999", nil)

}


// METHOD 1


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 logLogs(logger chan string) {

    for item := range logger {

        fmt.Println("1. Item", item)

    }

}


// METHOD 2


type DataPasser struct {

    logs chan string

}


func (p *DataPasser) handleHello(w http.ResponseWriter, r *http.Request) {

    p.logs <- r.URL.String()

    io.WriteString(w, "Hello world")

}


func (p *DataPasser) log() {

    for item := range p.logs {

        fmt.Println("2. Item", item)

    }

}


查看完整回答
反对 回复 2021-09-13
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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


package mychannel


var Chan = make(chan string)


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信