首页 > 解决方案 > 无法从命令行访问 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 服务器功能:

我的代码在没有 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)
}

您会注意到我的第二段代码添加了一些内容:

最终目标是输入查询,然后在routineHandlegoroutine中使用该查询

就像我说的那样,我不知道如何在ubuntu box without a gui

最后一件事要注意。如果您发现任何问题,告诉我。我想知道在 http 服务器中运行 goroutine 是否会导致问题

标签: httpgo

解决方案


问题中的代码错误地使用了等待组(应交换等待和完成,不应全局共享该组)并且与通道冗余。删除使用等待组修复代码。

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

推荐阅读