#rest #go #mux
#rest #Вперед #Мультиплексирование
Вопрос:
Я только что начал разработку REST api с GoLang. У меня есть класс с некоторыми методами в серверной части. rest api должен вызвать один из методов класса и вернуть ответ json. У меня возникла проблема с вызовом метода объекта или передачей объекта по ссылке. Мои cods выглядят следующим образом.
package main
import (
"time"
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
"./objects")
/*Global Variables*/
var host objects.HostOS // I have declared this to see if I can have a global variable and later on assign the actual object to that and call that object in the GetStats router method below.
func main() {
fmt.Println("Hello World")
hostConfig := objects.HostConfig{CPUConfig: cpuConfig, MemoryKB: 4096, OSMemoryKB: 1024, OSCompute: 100}
host := new(objects.HostOS)
host.Init(hostConfig)
host.Boot()
time.Sleep(3 * time.Second)
process := new(objects.Process)
process.Init(objects.ProcessConfig{MinThreadCount: 2, MaxThreadCount: 8, ParentOSInstance: host})
process.Start()
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/", Index)
router.HandleFunc("/get_os_stats", GetOSStats)
log.Fatal(http.ListenAndServe(":8080", router))
//host.GetStatsJson()
}
func Index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Welcome!")
}
func GetOSStats(w http.ResponseWriter, r *http.Request) {
// js, err := host.GetStatsJson() // This is what I would like to do
// Ideally I would get the Marshalled json and err and return them.
// The object method works fine as I have tested it, I am however unable to call the object method here.
fmt.Println("getting json stats")
host.GetStatsJson() //This is were I get the server panic issue and the code breaks
//I would like to access the method of the 'host' object defined in the main() method.
fmt.Fprintln(w, "GetOSStats!")
}
Я хотел бы вызвать метод объекта, определенного в функции main () внутри метода GetOSStats (), а затем вернуть вывод json.
Когда я объявляю глобальную переменную, а затем позже присваиваю ее в функции main, функция GetOSStats() по-прежнему обращается к структуре nil.
Когда я объявляю объект host obj в функции main и пытаюсь получить к нему доступ в функции GetOSStats (), он выдает исключение.
Я думаю, что мне нужно передать объект host obj по ссылке на функцию GetOSStats () при вызове ее в main, но я не уверен в том, как это сделать. Я попытался просмотреть документацию и примеры, но я не смог найти ничего, что могло бы мне помочь.
Заранее спасибо,
Ответ №1:
Вы повторно объявляете host
переменную локально (это также называется «затенением»)
host := new(objects.HostOS)
вместо этого вы должны использовать оператор присваивания
host = new(objects.HostOS)
Комментарии:
1. Спасибо @zerkms за указание на мою ошибку. Предложенное изменение сработало.
2. @zerkms По поводу вашего вопроса MDN, я обновил URL спецификации, чтобы ссылаться на tc39.github.io/ecma262 расположение вместо устаревшего ecma-international.org/ecma-262/9.0 (ES2018) местоположение. Текущая политика MDN заключается в том, чтобы всегда использовать
{{SpecName('ESDraft', …)}}
макрос для ссылок на спецификацию ES (вместо использования{{SpecName('ES2018', …)}}
или любых более старых версий спецификации ES). Если вы хотите обсудить эту политику, канал #mdn на irc.mozilla.org это хорошее место. Или discourse.mozilla.org/c/mdn