http - 无法从命令行访问 go 服务器/将 Web 服务器逻辑添加到现有代码
问题描述
在我的第一次迭代中,我得到了以下编译和工作:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func routineHandle (query string, ch chan <- string) {
ch <- query
wg.Wait()
}
func ping () {
ch := make(chan string)
wg.Add(1)
go routineHandle("testquery",ch)
wg.Done()
msg := <-ch
fmt.Println("Channel Message",msg)
}
func main () {
ping()
}
这成功地使用了 1 个通道来执行goroutine routineHandle
现在,我想添加执行以下操作的 Web 服务器功能:
- 侦听端口并接受/返回请求
- 挂钩到routineHandle,以便我们可以将该goroutine用作Api Server Method
我的代码在没有 gui 的 linux 机器上,所以我不知道如何测试 Web 服务器功能。
我的代码如下所示:
package main
import (
"fmt"
"sync"
"net/http"
)
var wg sync.WaitGroup
func routineHandle (query string, ch chan <- string) {
ch <- query
wg.Wait()
}
func ping (w http.ResponseWriter, r *http.Request) {
ch := make(chan string)
wg.Add(1)
go routineHandle("testquery",ch)
wg.Done()
msg := <-ch
//fmt.Println("Channel Message",msg)
w.Write([]byte msg)
}
func main() {
http.HandleFunc("/",ping)
http.ListenAndServe(":1234",nil)
}
您会注意到我的第二段代码添加了一些内容:
- 我添加了
net/http
包 - 我添加
http listener
到main method
- 我在 ping 函数中添加了响应编写器和请求参数
fmt.Println()
我从c.Write
最终目标是输入查询,然后在routineHandle
goroutine中使用该查询
就像我说的那样,我不知道如何在ubuntu box without a gui
最后一件事要注意。如果您发现任何问题,请告诉我。我想知道在 http 服务器中运行 goroutine 是否会导致问题
解决方案
问题中的代码错误地使用了等待组(应交换等待和完成,不应全局共享该组)并且与通道冗余。删除使用等待组修复代码。
package main
import (
"net/http"
)
func routineHandle(query string, ch chan<- string) {
ch <- query
}
func ping(w http.ResponseWriter, r *http.Request) {
ch := make(chan string)
go routineHandle("testquery", ch)
msg := <-ch
w.Write([]byte(msg))
}
func main() {
http.HandleFunc("/", ping)
http.ListenAndServe(":1234", nil)
}
推荐阅读
- node.js - 如何在mongodb url中动态更改主机和端口
- reactjs - 当用户在 ReactJS 的 ConfirmAlert 插件中单击是或否时如何调用函数
- node.js - valueMap() 和 mapsValue() 的区别?
- big-o - 如何找到嵌套循环的大 0
- c# - 为什么 asp.net core 无法反序列化这个 json?
- css - 如何在垂直导航栏中创建子导航
- spring - 带有 LEFT JOIN 查询的 JPQL 命名查询参数抛出异常
- java - 当我创建新数据时参数应该为空时,我不断收到空异常
- angular - Nativescript 角度工作者更新示例?
- python - LSTM 的网格搜索超参数调整