Одностраничный API REST на сервере Go для возврата MAC-адреса системы - PullRequest
0 голосов
/ 06 июля 2018

У меня есть веб-приложение на основе PHP. На странице входа в систему он вызывает AJAX-сервер Go (расположенный на клиентском компьютере), чтобы получить его MAC-адрес. Ниже приведен код сервера Go:

основной пакет

import (
  "net"
  "net/http"
  "encoding/json"
)

//define struct for mac address json
type MacAddress struct {
    Id string
}

/**
 * Get device mac address
 */
func GetMacAddress(w http.ResponseWriter, r *http.Request) {

   w.Header().Set("Access-Control-Allow-Origin", "*")


   mac := &MacAddress{Id: ""}
   ifas, err := net.Interfaces()
   if err != nil {
       json.NewEncoder(w).Encode(mac)
       return
   }

   for _, ifa := range ifas {
       a := ifa.HardwareAddr.String()
       if a != "" {
           mac := &MacAddress{Id: a}
           json.NewEncoder(w).Encode(mac)
           break
       }
   }
   return
}

/**
 * Main function
 */
func main() {

  http.HandleFunc("/", GetMacAddress)
  if err := http.ListenAndServe(":8000", nil); err != nil {
    panic(err)
  }
}

Результат:

{Id: "8c:16:45:5h:1e:0e"}

Здесь у меня 2 вопроса.

Иногда я получаю ошибку

panic: listen tcp :8000: bind: address already in use

и я вручную убиваю процесс. Итак, что можно улучшить в моем коде, чтобы избежать этой ошибки и закрыть ранее запущенный сервер?

Может ли автономный скомпилированный файл Go (созданный в Ubuntu) запускаться на других системах, таких как windows, linux или mac, без наличия всех библиотек Go и установки?

1 Ответ

0 голосов
/ 08 июля 2018

Информацию о том, как кросс-компилировать программу Go для разных операционных систем, можно найти здесь . Вкратце, вместо запуска go build main.go, запустите:

env GOARCH=amd64 GOOS=<target_OS> CGO_ENABLED=1 go build -v main.go

У меня обычно есть Makefile, чтобы упростить процесс кросс-компиляции для Linux, Windows и MacOS.

Что касается вашего второго вопроса, я могу воспроизвести вашу ошибку только на моей машине, когда я попытаюсь ListenAndServe дважды. То есть Я подозреваю, что во время ваших циклов отладки вы забыли закрыть работающий сервер, пытаясь запустить новый экземпляр в другом окне терминала. Обязательно прервите программу Go с помощью ctrl + c, прежде чем запускать ее снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...