Вызвать метод объекта в методе маршрутизатора REST в GoLang

#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