Невозможно получить доступ к серверу go из командной строки / добавить логику веб-сервера в существующий код - PullRequest
0 голосов
/ 07 июня 2018

В моей первой итерации я получил следующее для компиляции и работы:

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

Теперь я хочу добавить вебВозможности сервера, которые выполняют следующие функции:

  • Прослушивает порт и принимает / возвращает запросы
  • Подключает к рутине рутина, чтобы мы могли использовать эту программу в качестве метода сервера Api

Мой код на linux box без графического интерфейса, поэтому я не знаю, как проверить возможности веб-сервера.

Мой код выглядит следующим образом:

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 package
  • Я добавил http listener в main method
  • Я добавил средство записи ответов и параметры запроса в функцию ping
  • Я изменил с fmt.Println() на c.Write

Конечной целью было бы ввести запрос и затем использовать этот запрос в routineHandle goroutine

Как я и сказал, Я не знаю, как протестировать эту окончательную реализацию на ubuntu box without a gui

И последнее, на что следует обратить внимание.Если вы заметили какие-либо проблемы ПОЖАЛУЙСТА , дайте мне знать.Интересно, если запуск goroutine внутри http-сервера вызовет проблему

1 Ответ

0 голосов
/ 07 июня 2018

Код в вопросе неправильно использует группу ожидания (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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...