Метод reflect.Value.SetBool

Метод reflect.Value.SetBool устанавливает новое логическое значение для переменной, представленной объектом reflect.Value. В первый параметр метод принимает значение типа bool, которое будет присвоено переменной. Для успешной установки значения необходимо, чтобы переменная была адресуемой (CanSet возвращает true) и имела тип bool, иначе метод вызовет панику.

Синтаксис

gofunc (v Value) SetBool(x bool)

Пример

Давайте создадим переменную типа bool и изменим ее значение с помощью метода SetBool:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var isActive bool = true
  fmt.Println("Before:", isActive)

  v := reflect.ValueOf(&isActive).Elem()
  v.SetBool(false)

  fmt.Println("After:", isActive)
}

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

go"Before: true"
"After: false"

Пример

Метод SetBool также работает с полями структур. Изменим значение поля типа bool в структуре:

gopackage main

import (
  "fmt"
  "reflect"
)

type Config struct {
  Enabled bool
  Active  bool
}

func main() {
  cfg := Config{Enabled: true, Active: false}
  fmt.Println("Before:", cfg)

  v := reflect.ValueOf(&cfg).Elem()
  field := v.FieldByName("Enabled")
  field.SetBool(false)

  fmt.Println("After:", cfg)
}

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

go"Before: {true false}"
"After: {false false}"

Пример

Важно проверять возможность установки значения с помощью метода CanSet перед вызовом SetBool, чтобы избежать паники:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var flag bool = true

  v := reflect.ValueOf(flag)
  if v.CanSet() {
    v.SetBool(false)
  } else {
    fmt.Println("Cannot set value (it's not addressable)")
  }

  fmt.Println("Flag:", flag)

  // Правильный способ - передача указателя
  vPtr := reflect.ValueOf(&flag).Elem()
  if vPtr.CanSet() {
    vPtr.SetBool(false)
  }

  fmt.Println("Flag after proper set:", flag)
}

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

go"Cannot set value (it's not addressable)"
"Flag: true"
"Flag after proper set: false"

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

  • функцию reflect.ValueOf,
    которая создает reflect.Value из интерфейса
  • метод reflect.Value.CanSet,
    который проверяет возможность изменения значения
  • метод reflect.Value.SetInt,
    который устанавливает целочисленное значение
  • метод reflect.Value.SetString,
    который устанавливает строковое значение