Функция reflect.Swapper

Функция reflect.Swapper возвращает функцию, которая позволяет обменивать местами два элемента в слайсе. В качестве параметра она принимает слайс любого типа и возвращает функцию с сигнатурой func(i, j int), где i и j - индексы элементов, которые необходимо поменять местами. Возвращенная функция работает напрямую с переданным слайсом, изменяя его содержимое.

Синтаксис

goreflect.Swapper(slice)

Пример

Давайте создадим функцию обмена для слайса строк и поменяем местами элементы с индексами 1 и 3:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  slice := []string{"a", "b", "c", "d", "e"}
  fmt.Println("Before swap:", slice)

  swap := reflect.Swapper(slice)
  swap(1, 3)

  fmt.Println("After swap:", slice)
}

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

go"Before swap: [a b c d e]"
"After swap: [a c d b e]"

Пример

Давайте используем reflect.Swapper для обмена элементов в слайсе целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  numbers := []int{1, 2, 3, 4, 5}
  fmt.Println("Before swap:", numbers)

  swap := reflect.Swapper(numbers)
  swap(0, 4)

  fmt.Println("After swap:", numbers)
}

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

go"Before swap: [1 2 3 4 5]"
"After swap: [5 2 3 4 1]"

Пример

Рассмотрим ситуацию, когда обмен элементов выполняется несколько раз подряд:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  slice := []string{"a", "b", "c", "d", "e"}
  fmt.Println("Initial:", slice)

  swap := reflect.Swapper(slice)
  swap(0, 2)
  fmt.Println("After swap 0 and 2:", slice)
  swap(2, 4)
  fmt.Println("After swap 2 and 4:", slice)
  swap(1, 3)
  fmt.Println("After swap 1 and 3:", slice)
}

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

go"Initial: [a b c d e]"
"After swap 0 and 2: [c b a d e]"
"After swap 2 and 4: [c b e d a]"
"After swap 1 and 3: [c d e b a]"

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

  • функцию reflect.ValueOf,
    которая возвращает отраженное значение переменной
  • функцию reflect.TypeOf,
    которая возвращает отраженный тип переменной
  • функцию reflect.DeepEqual,
    которая выполняет глубокое сравнение значений
  • функцию reflect.Copy,
    которая копирует элементы между слайсами через отражение