gpt4 book ai didi

带 channel 的 Golang handlefunc

转载 作者:IT王子 更新时间:2023-10-29 01:10:22 29 4
gpt4 key购买 nike

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

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

我有这个标准的东西:

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

func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
}

现在我希望“hello”函数能够在 channel 上写东西,供某人消费......我使用“普通”函数的方式是创建一个 channel :

c := make(chan string) 

并在函数调用中传递 c。像这样的东西:

dosomething(c)

但是...如果我想要“hello”来访问 channel c,我该怎么做呢?

最佳答案

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

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

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

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

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)
}
}

关于带 channel 的 Golang handlefunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28419876/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com