代码之家  ›  专栏  ›  技术社区  ›  somejkuser

无法从命令行访问go server/正在将web服务器逻辑添加到现有代码

  •  0
  • somejkuser  · 技术社区  · 8 年前

    在我的第一次迭代中,我得到了以下编译和工作:

    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服务器方法

    我的代码在没有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 戈鲁廷

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

    最后一点要注意。如果你注意到任何问题 拜托 告诉我。我想知道在http服务器中运行goroutine是否会导致问题

    1 回复  |  直到 8 年前
        1
  •  0
  •   Cerise Limón    8 年前

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

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