vendredi 11 décembre 2020

Shared var between files always returns 0

I'm learning Golang because my company asked me to start using it for backend. I'm a fairly new programmer and I have a problem testing the tracking of a concrete api endpoint.

This is my main.go file:

package main

import (
    "encoding/json"
    "fmt"
    "html/template"
    "log"
    "net/http"
    "strconv"
    "strings"
    "time"
)

type Resultado struct {
    Suma float64
}

type Llamada struct {
    Metodo   string
    When     string
    Path     string
    Consulta string
}

type FormData struct {
    Title    string
    ErrMsg   string
    Llamadas []Llamada
}

var LlamadasArr []Llamada

func main() {
    http.HandleFunc("/", inicio)
    http.HandleFunc("/api/sum", sum)
    http.HandleFunc("/llamadas", llamadas)
    http.HandleFunc("/formulario", sumForm)
    if err := http.ListenAndServe(":80", nil); err == nil {
        panic(err)
    }
}

func llamadas(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("./public/templates/llamadas.html", "./public/templates/partials/header.html")
    t.Execute(w, FormData{"Llamadas API Suma", "No se realizaron llamadas a la API durante esta sesión.", LlamadasArr})
}

func sumForm(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("./public/templates/formulario.html", "./public/templates/partials/header.html")
    t.Execute(w, struct {
        Title string
        Msg   string
        Msg2  string
    }{"Formulario Suma", "Consulta el historial de llamadas a la API", "Introduce los números separados por comas"})
}

func inicio(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("./public/templates/index.html", "./public/templates/partials/header.html")
    t.Execute(w, struct {
        Title string
    }{"Inicio"})
}

func sum(w http.ResponseWriter, r *http.Request) {
    dt := time.Now()
    llamada := Llamada{
        Metodo:   r.Method,
        When:     dt.Format("01-02-2006 15:04:05"),
        Path:     r.URL.Path,
        Consulta: r.URL.RawQuery,
    }
    LlamadasArr = append(LlamadasArr, llamada)

    query := r.URL.Query()["numeros"]
    splitted := strings.Split(query[0], ",")
    sum := 0.0

    for i := 0; i < len(splitted); i++ {
        if num, err := strconv.ParseFloat(splitted[i], 64); err == nil {
            sum += num
        }
    }

    resultado := Resultado{
        Suma: sum,
    }

    var jsonData []byte
    jsonData, err := json.MarshalIndent(resultado, "", "    ")
    if err != nil {
        log.Println(err)
    }
    fmt.Fprintln(w, string(jsonData))
}

My testing file:

func TestCalls(t *testing.T) {
    io.WriteString(os.Stdout, ">Probando REGISTRO DE LLAMADAS A SUMA\n")
    count := 0
    for count < 22 {
        http.Get("http://localhost/api/sum?numeros=1")
        io.WriteString(os.Stdout, fmt.Sprint(len(LlamadasArr)))
        count++
    }
}

Output is always 0, I tested the value in the main file and it's changing. I'm a bit lost and I would appreciate any help. Thanks in advance.

Aucun commentaire:

Enregistrer un commentaire