我是 Go 新手 - 以下問題:我的程式收到一個 http post 請求,現在我想將資料從它轉發到活動的 TCP 連接(程式運行并行 TCP 服務器)。在main()處理程式中注冊如下:
http.HandleFunc("/rcvtelegram", handleRestRequest)
因此,http-handler 函式是這樣的:
func handleRestRequest(w http.ResponseWriter, r *http.Request) {}
與客戶端的 TCP 連接是使用知道的 net.Conn 物件打開的main()。因此,理想情況下,我會使用 TCP 發送器函式啟動一個 go 例程,該函式偵聽傳入字串以通過 TCP 發送它。但是怎么做?對于通道,似乎我必須傳遞所有引數,但我在 http 處理程式函式中沒有連接物件。我還想避免使 tcp 連接成為全域變數。我看到了觀察者模式,但作為一個新手,它的復雜性讓我感到害怕(不確定它是否能解決我的問題)。
謝謝!
uj5u.com熱心網友回復:
使用結構型別來保存通道。在型別上實作http.Handler介面:
type RestHandler struct {
ch chan string
}
func (h *RestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// insert body of the handleRestRequest here.
// Use h.ch <- someString to send string to connection
}
在您的 main 函式中,為 TCP 發送者創建一個通道并在 goroutine 中啟動發送者:
ch := make(chan string)
go tcpSender(ch)
使用通道創建 *RestHandler 的值并將其注冊為處理程式:
http.Handle("/rcvtelegram", &RestHandler{ch:ch})
uj5u.com熱心網友回復:
基于上述建議,我以這種方式構建它:
type TcpHandler struct {
connection net.Conn
}
然后定義了一個自定義的 HTTP Handler:
func (t TcpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {...}
然后用現有的 TCP 連接注冊它main():
httpTcpHandler := TcpHandler{connection: conn}
mux := http.NewServeMux()
mux.Handle("/rcvtelegram", httpTcpHandler)
go startHttpServer(httpPort, mux)
作業正常!我越來越喜歡用 Go 編程了??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/480230.html
標籤:去
