Метод reflect.Value.Convert

Метод reflect.Value.Convert преобразует значение, хранящееся в reflect.Value, к типу, переданному в качестве аргумента. Метод возвращает новое значение reflect.Value, представляющее результат преобразования. В первый параметр метод принимает значение типа reflect.Type, к которому необходимо выполнить преобразование.

Важно отметить, что преобразование возможно только в том случае, если исходный тип может быть преобразован к целевому типу согласно правилам Go. Проверить возможность преобразования можно с помощью метода reflect.Type.ConvertibleTo. Если преобразование невозможно, метод вызовет панику.

Синтаксис

govalue.Convert(targetType)

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  v := reflect.ValueOf(x)

  targetType := reflect.TypeOf(float64(0))
  converted := v.Convert(targetType)

  fmt.Println(converted.Interface())
}

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

go42

Пример

Давайте преобразуем строковое значение к типу []byte:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s := "abcde"
  v := reflect.ValueOf(s)

  targetType := reflect.TypeOf([]byte{})
  converted := v.Convert(targetType)

  fmt.Println(converted.Interface())
}

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

go[97 98 99 100 101]

Пример

Давайте проверим возможность преобразования перед его выполнением:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 12345
  v := reflect.ValueOf(x)

  targetType := reflect.TypeOf("")
  if v.Type().ConvertibleTo(targetType) {
    converted := v.Convert(targetType)
    fmt.Println(converted.Interface())
  } else {
    fmt.Println("Conversion is not possible")
  }
}

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

go"Conversion is not possible"

Пример

Давайте преобразуем значение интерфейса к конкретному типу:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var i interface{} = 3.14
  v := reflect.ValueOf(i)

  targetType := reflect.TypeOf(int(0))
  converted := v.Convert(targetType)

  fmt.Println(converted.Interface())
}

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

go3

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

  • метод reflect.Type.ConvertibleTo,
    который проверяет возможность преобразования между типами
  • функцию reflect.ValueOf,
    которая создает отражаемое значение из интерфейса
  • метод reflect.Value.Interface,
    который извлекает исходное значение из отражаемого
  • функцию reflect.TypeOf,
    которая возвращает динамический тип интерфейса