還有兩種方法可以做到這一點(除了導出您的頻道,如在前面的答案)。
第一個是使用一個函數來返回另一個處理函數。當函數返回時,它將在通道周圍創建一個閉包。
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)
}
}
非常感謝你爲這個偉大的例子。我最終使用了方法1,它完美地完成了這項工作。 – plithner 2015-02-10 09:50:13
來自python我無法弄清楚如何做這樣一個簡單的事情。有趣的是,這個問題實際上是一個非常簡單的解決方案,所需要的只是一個範式轉變。 – Esser420 2018-01-03 12:27:08