Метод http.Request.Clone

Метод http.Request.Clone создает глубокую копию HTTP-запроса. В первый параметр метод принимает контекст, который будет использован для нового запроса. Метод возвращает новый экземпляр http.Request, который является копией исходного запроса, но с новым контекстом. Клонирование полезно при необходимости многократной отправки одного и того же запроса с разными параметрами или для безопасной модификации запроса в разных горутинах.

Синтаксис

goreq.Clone(ctx)

Метод принимает контекст context.Context и возвращает новый запрос. Если переданный контекст равен nil, используется контекст исходного запроса.

Пример

Давайте создадим запрос, клонируем его и изменим метод у клона:

gopackage main

import (
  "context"
  "fmt"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "https://example.com", nil)
  ctx := context.Background()

  clonedReq := req.Clone(ctx)

  clonedReq.Method = "POST"

  fmt.Println("Original method:", req.Method)
  fmt.Println("Cloned method:", clonedReq.Method)
}

Результат выполнения кода:

go"Original method: GET"
"Cloned method: POST"

Пример

Давайте клонируем запрос с заголовками и проверим, что они были скопированы:

gopackage main

import (
  "context"
  "fmt"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "https://example.com", nil)
  req.Header.Set("Authorization", "Bearer token123")
  req.Header.Set("Content-Type", "application/json")

  ctx := context.Background()
  clonedReq := req.Clone(ctx)

  fmt.Println("Original headers:", req.Header)
  fmt.Println("Cloned headers:", clonedReq.Header)
}

Результат выполнения кода:

go"Original headers: map[Authorization:[Bearer token123] Content-Type:[application/json]]"
"Cloned headers: map[Authorization:[Bearer token123] Content-Type:[application/json]]"

Пример

Давайте покажем, что клон имеет независимые заголовки от оригинала:

gopackage main

import (
  "context"
  "fmt"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "https://example.com", nil)
  req.Header.Set("X-Custom", "value1")

  ctx := context.Background()
  clonedReq := req.Clone(ctx)

  clonedReq.Header.Set("X-Custom", "value2")

  fmt.Println("Original header:", req.Header.Get("X-Custom"))
  fmt.Println("Cloned header:", clonedReq.Header.Get("X-Custom"))
}

Результат выполнения кода:

go"Original header: value1"
"Cloned header: value2"

Смотрите также

  • метод http.Request.WithContext,
    который создает новый запрос с измененным контекстом
  • функцию http.NewRequest,
    которая создает новый HTTP-запрос с указанными методом и URL
  • метод http.Request.ParseForm,
    который парсит параметры формы из тела запроса
  • метод http.Request.Context,
    который возвращает контекст текущего запроса