Как прокинуть параметр с хендлера дальше в приложение?

В языке программирования Go, параметры могут быть переданы из хендлера (handler) в другие части приложения различными способами.

Один из способов - использование контекста (context). Контекст представляет собой объект, который можно использовать для передачи значений и метаданных через границы вызовов функций, включая хендлеры HTTP. Контекст имеет методы для установки и получения значений.

Пример использования контекста для передачи параметра из хендлера в другие части приложения:

package main

import (
    "net/http"
    "context"
)

func myHandler(w http.ResponseWriter, r *http.Request) {
    // Создаем контекст с помощью функции WithValue
    ctx := context.WithValue(r.Context(), "myParam", "some value")

    // Вызываем функцию, которая принимает контекст
    myFunction(ctx)
}

func myFunction(ctx context.Context) {
    // Получаем значение параметра из контекста
    myParam := ctx.Value("myParam").(string)

    // Используем значение параметра
    // ...
}

func main() {
    http.HandleFunc("/", myHandler)
    http.ListenAndServe(":8080", nil)
}

В этом примере, в функции myHandler мы создаем новый контекст с помощью функции WithValue, передавая параметры "myParam" и "some value". Далее, этот контекст передается в функцию myFunction, где значение параметра можно получить с помощью метода Value.

Еще один способ передачи параметров из хендлера в другие части приложения - использование структурного типа. Мы можем создать структуру, содержащую необходимые параметры, и передать эту структуру в другие функции как параметр.

Пример использования структурного типа для передачи параметра из хендлера:

package main

import (
    "net/http"
)

type myParams struct {
    Param1 string
    Param2 int
}

func myHandler(w http.ResponseWriter, r *http.Request) {
    // Создаем объект структуры и передаем его в функцию
    params := myParams{
        Param1: "some value",
        Param2: 123,
    }

    // Вызываем функцию, которая принимает объект структуры
    myFunction(params)
}

func myFunction(params myParams) {
    // Используем значения параметров
    // ...
}

func main() {
    http.HandleFunc("/", myHandler)
    http.ListenAndServe(":8080", nil)
}

В этом примере, в функции myHandler мы создаем объект структуры myParams и передаем его в функцию myFunction в качестве параметра.

Выбор между этими методами зависит от характера передаваемых параметров и особенностей вашего приложения. Используйте контексты, когда вам нужно передавать большее количество данных и/или метаданных из одной части приложения в другую. При использовании структурных типов, вы можете передавать группы параметров, которые связаны логически между собой.