Spec-Zone.ru › Go

Пакет reflect

  • import "reflect"
  • Обзор
  • Индекс
  • Примеры
  • Подкаталоги

Обзор

Пакет reflect реализует рефлексию во время выполнения, позволяя программе манипулировать объектами с произвольными типами. Типичное использование заключается в том, чтобы взять значение со статическим типом interface{} и извлечь его динамическую информацию о типе, вызвав TypeOf, который возвращает Type.

Вызов ValueOf возвращает Value, представляющее данные во время выполнения. Zero принимает Type и возвращает Value, представляющее нулевое значение для этого типа.

См. "Законы рефлексии" для введения в рефлексию в Go: https://golang.org/doc/articles/laws_of_reflection.html

Индекс

  • Константы
  • func Copy(dst, src Value) int
  • func DeepEqual(x, y any) bool
  • func Swapper(slice any) func(i, j int)
  • тип ChanDir
  • func (d ChanDir) String() string
  • тип Kind
  • func (k Kind) String() string
  • тип MapIter
  • func (iter *MapIter) Key() Value
  • func (iter *MapIter) Next() bool
  • func (iter *MapIter) Reset(v Value)
  • func (iter *MapIter) Value() Value
  • тип Method
  • func (m Method) IsExported() bool
  • тип SelectCase
  • тип SelectDir
  • тип SliceHeader
  • тип StringHeader
  • тип StructField
  • func VisibleFields(t Type) []StructField
  • func (f StructField) IsExported() bool
  • тип StructTag
  • func (tag StructTag) Get(key string) string
  • func (tag StructTag) Lookup(key string) (value string, ok bool)
  • тип Type
  • func ArrayOf(length int, elem Type) Type
  • func ChanOf(dir ChanDir, t Type) Type
  • func FuncOf(in, out []Type, variadic bool) Type
  • func MapOf(key, elem Type) Type
  • func PointerTo(t Type) Type
  • func PtrTo(t Type) Type
  • func SliceOf(t Type) Type
  • func StructOf(fields []StructField) Type
  • func TypeFor[T any]() Type
  • func TypeOf(i any) Type
  • тип Value
  • func Append(s Value, x ...Value) Value
  • func AppendSlice(s, t Value) Value
  • func Indirect(v Value) Value
  • func MakeChan(typ Type, buffer int) Value
  • func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value
  • func MakeMap(typ Type) Value
  • func MakeMapWithSize(typ Type, n int) Value
  • func MakeSlice(typ Type, len, cap int) Value
  • func New(typ Type) Value
  • func NewAt(typ Type, p unsafe.Pointer) Value
  • func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
  • func SliceAt(typ Type, p unsafe.Pointer, n int) Value
  • func ValueOf(i any) Value
  • func Zero(typ Type) Value
  • func (v Value) Addr() Value
  • func (v Value) Bool() bool
  • func (v Value) Bytes() []byte
  • func (v Value) Call(in []Value) []Value
  • func (v Value) CallSlice(in []Value) []Value
  • func (v Value) CanAddr() bool
  • func (v Value) CanComplex() bool
  • func (v Value) CanConvert(t Type) bool
  • func (v Value) CanFloat() bool
  • func (v Value) CanInt() bool
  • func (v Value) CanInterface() bool
  • func (v Value) CanSet() bool
  • func (v Value) CanUint() bool
  • func (v Value) Cap() int
  • func (v Value) Clear()
  • func (v Value) Close()
  • func (v Value) Comparable() bool
  • func (v Value) Complex() complex128
  • func (v Value) Convert(t Type) Value
  • func (v Value) Elem() Value
  • func (v Value) Equal(u Value) bool
  • func (v Value) Field(i int) Value
  • func (v Value) FieldByIndex(index []int) Value
  • func (v Value) FieldByIndexErr(index []int) (Value, error)
  • func (v Value) FieldByName(name string) Value
  • func (v Value) FieldByNameFunc(match func(string) bool) Value
  • func (v Value) Float() float64
  • func (v Value) Grow(n int)
  • func (v Value) Index(i int) Value
  • func (v Value) Int() int64
  • func (v Value) Interface() (i any)
  • func (v Value) InterfaceData() [2]uintptr
  • func (v Value) IsNil() bool
  • func (v Value) IsValid() bool
  • func (v Value) IsZero() bool
  • func (v Value) Kind() Kind
  • func (v Value) Len() int
  • func (v Value) MapIndex(key Value) Value
  • func (v Value) MapKeys() []Value
  • func (v Value) MapRange() *MapIter
  • func (v Value) Method(i int) Value
  • func (v Value) MethodByName(name string) Value
  • func (v Value) NumField() int
  • func (v Value) NumMethod() int
  • func (v Value) OverflowComplex(x complex128) bool
  • func (v Value) OverflowFloat(x float64) bool
  • func (v Value) OverflowInt(x int64) bool
  • func (v Value) OverflowUint(x uint64) bool
  • func (v Value) Pointer() uintptr
  • func (v Value) Recv() (x Value, ok bool)
  • func (v Value) Send(x Value)
  • func (v Value) Seq() iter.Seq[Value]
  • func (v Value) Seq2() iter.Seq2[Value, Value]
  • func (v Value) Set(x Value)
  • func (v Value) SetBool(x bool)
  • func (v Value) SetBytes(x []byte)
  • func (v Value) SetCap(n int)
  • func (v Value) SetComplex(x complex128)
  • func (v Value) SetFloat(x float64)
  • func (v Value) SetInt(x int64)
  • func (v Value) SetIterKey(iter *MapIter)
  • func (v Value) SetIterValue(iter *MapIter)
  • func (v Value) SetLen(n int)
  • func (v Value) SetMapIndex(key, elem Value)
  • func (v Value) SetPointer(x unsafe.Pointer)
  • func (v Value) SetString(x string)
  • func (v Value) SetUint(x uint64)
  • func (v Value) SetZero()
  • func (v Value) Slice(i, j int) Value
  • func (v Value) Slice3(i, j, k int) Value
  • func (v Value) String() string
  • func (v Value) TryRecv() (x Value, ok bool)
  • func (v Value) TrySend(x Value) bool
  • func (v Value) Type() Type
  • func (v Value) Uint() uint64
  • func (v Value) UnsafeAddr() uintptr
  • func (v Value) UnsafePointer() unsafe.Pointer
  • тип ValueError
  • func (e *ValueError) Error() string
  • Ошибки

Примеры

Kind
MakeFunc
StructOf
StructTag
StructTag.Lookup
TypeOf
Value.FieldByIndex
Value.FieldByName

Файлы пакета

abi.go badlinkname.go deepequal.go float32reg_generic.go iter.go makefunc.go swapper.go type.go value.go visiblefields.go

Константы

Ptr — старое название для типа Pointer.

const Ptr = Pointer

func Copy

func Copy(dst, src Value) int

Copy копирует содержимое src в dst до тех пор, пока dst не заполнится или src не исчерпается. Возвращает количество скопированных элементов. Dst и src должны быть типа Slice или Array, и dst и src должны иметь одинаковый тип элементов.

В качестве специального случая, src может иметь тип String, если тип элемента dst — Uint8.

функция DeepEqual

func DeepEqual(x, y any) bool

DeepEqual сообщает, являются ли x и y «глубоко равными», что определяется следующим образом. Два значения одинакового типа глубоко равны, если выполняется одно из следующих условий. Значения разных типов никогда не являются глубоко равными.

Массивы считаются глубоко равными, если их соответствующие элементы глубоко равны.

Структуры считаются глубоко равными, если их соответствующие поля, как экспортированные, так и неэкспортированные, глубоко равны.

Функции считаются глубоко равными, если обе являются nil; в противном случае они не глубоко равны.

Значения интерфейсов считаются глубоко равными, если они содержат глубоко равные конкретные значения.

Словари считаются глубоко равными, если выполняются все следующие условия: оба они nil или оба не nil, у них одинаковая длина, и либо они являются одним и тем же объектом словаря, либо их соответствующие ключи (сопоставляемые с использованием равенства Go) отображаются на глубоко равные значения.

Значения указателей считаются глубоко равными, если они равны с использованием оператора == Go или если они указывают на глубоко равные значения.

Срезы считаются глубоко равными, когда выполняются все следующие условия: оба они nil или оба не nil, у них одинаковая длина, и либо они указывают на одну и ту же начальную запись одного и того же базового массива (т.е., &x[0] == &y[0]), либо их соответствующие элементы (до длины) глубоко равны. Обратите внимание, что непустой пустой срез и пустой срез (например, []byte{} и []byte(nil)) не считаются глубоко равными.

Другие значения — числа, булевы значения, строки и каналы — считаются глубоко равными, если они равны с использованием оператора == Go.

В общем случае DeepEqual — это рекурсивное ослабление оператора == Go. Однако этот принцип невозможно реализовать без некой несогласованности. В частности, значение может не быть равным самому себе, либо потому, что оно имеет тип func (в общем случае несравнимое), либо потому, что это число с плавающей точкой NaN (не равно самому себе в сравнении с плавающей точкой), либо потому, что это массив, структура или интерфейс, содержащий такое значение. С другой стороны, значения указателей всегда равны самим себе, даже если они указывают на или содержат такие проблемные значения, потому что они сравниваются как равные с помощью оператора == Go, и этого достаточно для того, чтобы быть глубоко равными, независимо от содержимого. DeepEqual определён так, чтобы этот же краткий способ применялся к срезам и словарям: если x и y являются одним и тем же срезом или одним и тем же словарем, они считаются глубоко равными независимо от содержимого.

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

функция Swapper 1.8

func Swapper(slice any) func(i, j int)

Swapper возвращает функцию, которая меняет местами элементы в предоставленном срезе.

Swapper вызывает панику, если предоставленный интерфейс не является срезом.

тип ChanDir

ChanDir представляет направление типа канала.

type ChanDir int
const (
    RecvDir ChanDir             = 1 << iota // <-chan
    SendDir                                 // chan<-
    BothDir = RecvDir | SendDir             // chan
)

функция (ChanDir) String

func (d ChanDir) String() string

тип Kind

Kind представляет собой конкретный тип типа, который представляет Type. Нулевой Kind не является допустимым типом.

type Kind uint
const (
    Invalid Kind = iota
    Bool
    Int
    Int8
    Int16
    Int32
    Int64
    Uint
    Uint8
    Uint16
    Uint32
    Uint64
    Uintptr
    Float32
    Float64
    Complex64
    Complex128
    Array
    Chan
    Func
    Interface
    Map
    Pointer
    Slice
    String
    Struct
    UnsafePointer
)

Пример

Код:

for _, v := range []any{"hi", 42, func() {}} {
    switch v := reflect.ValueOf(v); v.Kind() {
    case reflect.String:
        fmt.Println(v.String())
    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        fmt.Println(v.Int())
    default:
        fmt.Printf("unhandled kind %s", v.Kind())
    }
}

Вывод:

hi
42
unhandled kind func

функция (Kind) String

func (k Kind) String() string

String возвращает имя k.

тип MapIter 1.12

MapIter — итератор для обхода словаря. См. Value.MapRange.

type MapIter struct {
    // contains filtered or unexported fields
}

функция (*MapIter) Key 1.12

func (iter *MapIter) Key() Value

Key возвращает ключ текущей записи словаря iter.

функция (*MapIter) Next 1.12

func (iter *MapIter) Next() bool

Next перемещает итератор словаря вперед и сообщает, есть ли ещё записи. Возвращает false, когда iter исчерпан; последующие вызовы MapIter.Key, MapIter.Value или MapIter.Next вызовут панику.

функция (*MapIter) Reset 1.18

func (iter *MapIter) Reset(v Value)

Reset изменяет iter для итерации по v. Вызывает панику, если Kind v не является Map и v не является нулевым значением. Reset(Value{}) заставляет iter не ссылаться на какой-либо словарь, что может позволить ранее проитерированному словарю быть удалённым сборщиком мусора.

функция (*MapIter) Value 1.12

func (iter *MapIter) Value() Value

Value возвращает значение текущей записи словаря iter.

тип Method

Method представляет собой отдельный метод.

type Method struct {
    // Name is the method name.
    Name string

    // PkgPath is the package path that qualifies a lower case (unexported)
    // method name. It is empty for upper case (exported) method names.
    // The combination of PkgPath and Name uniquely identifies a method
    // in a method set.
    // See https://golang.org/ref/spec#Uniqueness_of_identifiers
    PkgPath string

    Type  Type  // method type
    Func  Value // func with receiver as first argument
    Index int   // index for Type.Method
}

функция (Method) IsExported 1.17

func (m Method) IsExported() bool

IsExported сообщает, экспортирован ли метод.

тип SelectCase 1.1

SelectCase описывает отдельный случай в операции select. Тип случая зависит от Dir, направления связи.

Если Dir равен SelectDefault, случай представляет собой случай по умолчанию. Chan и Send должны быть нулевыми значениями.

Если Dir равен SelectSend, случай представляет собой операцию отправки. Обычно значение Chan должно быть каналом, а значение Send должно быть присваиваемым типу элемента канала. В качестве специального случая, если Chan — нулевое значение, то случай игнорируется, и поле Send также игнорируется и может быть либо нулевым, либо ненулевым.

Если Dir равен SelectRecv, случай представляет собой операцию приёма. Обычно значение Chan должно быть каналом, а Send — нулевым значением. Если Chan — нулевое значение, то случай игнорируется, но Send всё ещё должно быть нулевым значением. Когда выбирается операция приёма, полученное значение возвращается методом Select.

type SelectCase struct {
    Dir  SelectDir // direction of case
    Chan Value     // channel to use (for send or receive)
    Send Value     // value to send (for send)
}

тип SelectDir 1.1

SelectDir описывает направление связи случая select.

type SelectDir int
const (
    SelectSend    SelectDir // case Chan <- Send
    SelectRecv              // case <-Chan:
    SelectDefault           // default
)

тип SliceHeader

SliceHeader — это представление среза в runtime. Его нельзя безопасно или переносимо использовать, и его представление может измениться в последующей версии. Кроме того, поле Data недостаточно, чтобы гарантировать, что данные, на которые оно ссылается, не будут удалены сборщиком мусора, поэтому программы должны хранить отдельный, правильно типизированный указатель на базовые данные.

Устарело: используйте unsafe.Slice или unsafe.SliceData вместо этого.

type SliceHeader struct {
    Data uintptr
    Len  int
    Cap  int
}

тип StringHeader

StringHeader — это представление строки в runtime. Его нельзя безопасно или переносимо использовать, и его представление может измениться в последующей версии. Кроме того, поле Data недостаточно, чтобы гарантировать, что данные, на которые оно ссылается, не будут удалены сборщиком мусора, поэтому программы должны хранить отдельный, правильно типизированный указатель на базовые данные.

Устарело: используйте unsafe.String или unsafe.StringData вместо этого.

type StringHeader struct {
    Data uintptr
    Len  int
}

тип StructField

StructField описывает одно поле в структуре.

type StructField struct {
    // Name is the field name.
    Name string

    // PkgPath is the package path that qualifies a lower case (unexported)
    // field name. It is empty for upper case (exported) field names.
    // See https://golang.org/ref/spec#Uniqueness_of_identifiers
    PkgPath string

    Type      Type      // field type
    Tag       StructTag // field tag string
    Offset    uintptr   // offset within struct, in bytes
    Index     []int     // index sequence for Type.FieldByIndex
    Anonymous bool      // is an embedded field
}

функция VisibleFields 1.17

func VisibleFields(t Type) []StructField

VisibleFields возвращает все видимые поля в t, которое должно быть типом структуры. Поле считается видимым, если к нему можно получить доступ напрямую с помощью вызова FieldByName. Возвращаемые поля включают поля внутри анонимных членов структуры и неэкспортированные поля. Они следуют тому же порядку, что и в структуре, с анонимными полями, непосредственно за которыми следуют их продвигаемые поля.

Для каждого элемента e возвращённого среза, соответствующее поле можно извлечь из значения v типа t, вызвав v.FieldByIndex(e.Index).

функция (StructField) IsExported 1.17

func (f StructField) IsExported() bool

IsExported сообщает, экспортировано ли поле.

тип StructTag

StructTag — строка тега в поле структуры.

По соглашению, строки тегов представляют собой объединение необязательно разделенных пробелами пар ключ:"значение". Каждый ключ — это непустая строка, состоящая из символов, отличных от пробела (U+0020 ' '), кавычки (U+0022 '"') и двоеточия (U+003A ':'). Каждое значение заключено в двойные кавычки (U+0022 '"') и имеет синтаксис Go-строки.

type StructTag string

Пример

Код:

type S struct {
    F string `species:"gopher" color:"blue"`
}

s := S{}
st := reflect.TypeOf(s)
field := st.Field(0)
fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))

Вывод:

blue gopher

функция (StructTag) Get

func (tag StructTag) Get(key string) string

Get возвращает значение, связанное с ключом в строке тега. Если такого ключа в теге нет, Get возвращает пустую строку. Если тег не имеет стандартного формата, возвращаемое значение Get не определено. Чтобы определить, установлен ли тег явно в пустую строку, используйте StructTag.Lookup.

функция (StructTag) Lookup 1.7

func (tag StructTag) Lookup(key string) (value string, ok bool)

Lookup возвращает значение, связанное с ключом в строке тега. Если ключ присутствует в теге, возвращается значение (которое может быть пустым). В противном случае возвращаемое значение будет пустой строкой. Значение ok указывает, было ли значение явно установлено в строке тега. Если тег не имеет стандартного формата, возвращаемое значение Lookup не определено.

Пример

Код:

type S struct {
    F0 string `alias:"field_0"`
    F1 string `alias:""`
    F2 string
}

s := S{}
st := reflect.TypeOf(s)
for i := 0; i < st.NumField(); i++ {
    field := st.Field(i)
    if alias, ok := field.Tag.Lookup("alias"); ok {
        if alias == "" {
            fmt.Println("(blank)")
        } else {
            fmt.Println(alias)
        }
    } else {
        fmt.Println("(not specified)")
    }
}

Вывод:

field_0
(blank)
(not specified)

тип Type

Type — это представление типа Go.

Не все методы применимы ко всем видам типов. Ограничения, если таковые имеются, указаны в документации для каждого метода. Используйте метод Kind, чтобы определить тип перед вызовом методов, специфичных для типа. Вызов метода, неподходящего для типа, приводит к панике во время выполнения.

Значения Type сравнимы, например, с помощью оператора ==, поэтому они могут использоваться в качестве ключей словарей. Два значения Type равны, если они представляют идентичные типы.

type Type interface {

    // Align returns the alignment in bytes of a value of
    // this type when allocated in memory.
    Align() int

    // FieldAlign returns the alignment in bytes of a value of
    // this type when used as a field in a struct.
    FieldAlign() int

    // Method returns the i'th method in the type's method set.
    // It panics if i is not in the range [0, NumMethod()).
    //
    // For a non-interface type T or *T, the returned Method's Type and Func
    // fields describe a function whose first argument is the receiver,
    // and only exported methods are accessible.
    //
    // For an interface type, the returned Method's Type field gives the
    // method signature, without a receiver, and the Func field is nil.
    //
    // Methods are sorted in lexicographic order.
    Method(int) Method

    // MethodByName returns the method with that name in the type's
    // method set and a boolean indicating if the method was found.
    //
    // For a non-interface type T or *T, the returned Method's Type and Func
    // fields describe a function whose first argument is the receiver.
    //
    // For an interface type, the returned Method's Type field gives the
    // method signature, without a receiver, and the Func field is nil.
    MethodByName(string) (Method, bool)

    // NumMethod returns the number of methods accessible using Method.
    //
    // For a non-interface type, it returns the number of exported methods.
    //
    // For an interface type, it returns the number of exported and unexported methods.
    NumMethod() int

    // Name returns the type's name within its package for a defined type.
    // For other (non-defined) types it returns the empty string.
    Name() string

    // PkgPath returns a defined type's package path, that is, the import path
    // that uniquely identifies the package, such as "encoding/base64".
    // If the type was predeclared (string, error) or not defined (*T, struct{},
    // []int, or A where A is an alias for a non-defined type), the package path
    // will be the empty string.
    PkgPath() string

    // Size returns the number of bytes needed to store
    // a value of the given type; it is analogous to unsafe.Sizeof.
    Size() uintptr

    // String returns a string representation of the type.
    // The string representation may use shortened package names
    // (e.g., base64 instead of "encoding/base64") and is not
    // guaranteed to be unique among types. To test for type identity,
    // compare the Types directly.
    String() string

    // Kind returns the specific kind of this type.
    Kind() Kind

    // Implements reports whether the type implements the interface type u.
    Implements(u Type) bool

    // AssignableTo reports whether a value of the type is assignable to type u.
    AssignableTo(u Type) bool

    // ConvertibleTo reports whether a value of the type is convertible to type u.
    // Even if ConvertibleTo returns true, the conversion may still panic.
    // For example, a slice of type []T is convertible to *[N]T,
    // but the conversion will panic if its length is less than N.
    ConvertibleTo(u Type) bool

    // Comparable reports whether values of this type are comparable.
    // Even if Comparable returns true, the comparison may still panic.
    // For example, values of interface type are comparable,
    // but the comparison will panic if their dynamic type is not comparable.
    Comparable() bool

    // Bits returns the size of the type in bits.
    // It panics if the type's Kind is not one of the
    // sized or unsized Int, Uint, Float, or Complex kinds.
    Bits() int

    // ChanDir returns a channel type's direction.
    // It panics if the type's Kind is not Chan.
    ChanDir() ChanDir

    // IsVariadic reports whether a function type's final input parameter
    // is a "..." parameter. If so, t.In(t.NumIn() - 1) returns the parameter's
    // implicit actual type []T.
    //
    // For concreteness, if t represents func(x int, y ... float64), then
    //
    //	t.NumIn() == 2
    //	t.In(0) is the reflect.Type for "int"
    //	t.In(1) is the reflect.Type for "[]float64"
    //	t.IsVariadic() == true
    //
    // IsVariadic panics if the type's Kind is not Func.
    IsVariadic() bool

    // Elem returns a type's element type.
    // It panics if the type's Kind is not Array, Chan, Map, Pointer, or Slice.
    Elem() Type

    // Field returns a struct type's i'th field.
    // It panics if the type's Kind is not Struct.
    // It panics if i is not in the range [0, NumField()).
    Field(i int) StructField

    // FieldByIndex returns the nested field corresponding
    // to the index sequence. It is equivalent to calling Field
    // successively for each index i.
    // It panics if the type's Kind is not Struct.
    FieldByIndex(index []int) StructField

    // FieldByName returns the struct field with the given name
    // and a boolean indicating if the field was found.
    // If the returned field is promoted from an embedded struct,
    // then Offset in the returned StructField is the offset in
    // the embedded struct.
    FieldByName(name string) (StructField, bool)

    // FieldByNameFunc returns the struct field with a name
    // that satisfies the match function and a boolean indicating if
    // the field was found.
    //
    // FieldByNameFunc considers the fields in the struct itself
    // and then the fields in any embedded structs, in breadth first order,
    // stopping at the shallowest nesting depth containing one or more
    // fields satisfying the match function. If multiple fields at that depth
    // satisfy the match function, they cancel each other
    // and FieldByNameFunc returns no match.
    // This behavior mirrors Go's handling of name lookup in
    // structs containing embedded fields.
    //
    // If the returned field is promoted from an embedded struct,
    // then Offset in the returned StructField is the offset in
    // the embedded struct.
    FieldByNameFunc(match func(string) bool) (StructField, bool)

    // In returns the type of a function type's i'th input parameter.
    // It panics if the type's Kind is not Func.
    // It panics if i is not in the range [0, NumIn()).
    In(i int) Type

    // Key returns a map type's key type.
    // It panics if the type's Kind is not Map.
    Key() Type

    // Len returns an array type's length.
    // It panics if the type's Kind is not Array.
    Len() int

    // NumField returns a struct type's field count.
    // It panics if the type's Kind is not Struct.
    NumField() int

    // NumIn returns a function type's input parameter count.
    // It panics if the type's Kind is not Func.
    NumIn() int

    // NumOut returns a function type's output parameter count.
    // It panics if the type's Kind is not Func.
    NumOut() int

    // Out returns the type of a function type's i'th output parameter.
    // It panics if the type's Kind is not Func.
    // It panics if i is not in the range [0, NumOut()).
    Out(i int) Type

    // OverflowComplex reports whether the complex128 x cannot be represented by type t.
    // It panics if t's Kind is not Complex64 or Complex128.
    OverflowComplex(x complex128) bool

    // OverflowFloat reports whether the float64 x cannot be represented by type t.
    // It panics if t's Kind is not Float32 or Float64.
    OverflowFloat(x float64) bool

    // OverflowInt reports whether the int64 x cannot be represented by type t.
    // It panics if t's Kind is not Int, Int8, Int16, Int32, or Int64.
    OverflowInt(x int64) bool

    // OverflowUint reports whether the uint64 x cannot be represented by type t.
    // It panics if t's Kind is not Uint, Uintptr, Uint8, Uint16, Uint32, or Uint64.
    OverflowUint(x uint64) bool

    // CanSeq reports whether a [Value] with this type can be iterated over using [Value.Seq].
    CanSeq() bool

    // CanSeq2 reports whether a [Value] with this type can be iterated over using [Value.Seq2].
    CanSeq2() bool
    // contains filtered or unexported methods
}

функция ArrayOf 1.5

func ArrayOf(length int, elem Type) Type

ArrayOf возвращает массивный тип с заданной длиной и типом элемента. Например, если t представляет int, ArrayOf(5, t) представляет [5]int.

Если полученный тип будет больше доступного адресного пространства, ArrayOf вызывает панику.

функция ChanOf 1.1

func ChanOf(dir ChanDir, t Type) Type

ChanOf возвращает тип канала с заданным направлением и типом элемента. Например, если t представляет int, ChanOf(RecvDir, t) представляет <-chan int.

Временная среда выполнения gc накладывает ограничение в 64 КБ на типы элементов канала. Если размер t равен или превышает это ограничение, ChanOf вызывает панику.

функция FuncOf 1.5

func FuncOf(in, out []Type, variadic bool) Type

FuncOf возвращает тип функции с заданными типами аргументов и результата. Например, если k представляет int, а e представляет string, FuncOf([]Type{k}, []Type{e}, false) представляет func(int) string.

Аргумент variadic управляет тем, является ли функция переменной длины. FuncOf вызывает панику, если in[len(in)-1] не представляет срез, а variadic — true.

func MapOf 1.1

func MapOf(key, elem Type) Type

MapOf возвращает тип карты с заданными типами ключа и элемента. Например, если k представляет int, а e представляет string, MapOf(k, e) представляет map[int]string.

Если тип ключа не является допустимым типом ключа карты (то есть, если он не реализует оператор Go ==), MapOf вызывает панику.

func PointerTo 1.18

func PointerTo(t Type) Type

PointerTo возвращает указатель на тип с элементом t. Например, если t представляет тип Foo, PointerTo(t) представляет *Foo.

func PtrTo

func PtrTo(t Type) Type

PtrTo возвращает указатель на тип с элементом t. Например, если t представляет тип Foo, PtrTo(t) представляет *Foo.

PtrTo — устаревшее написание для PointerTo. Обе функции ведут себя идентично.

Устарело: Заменено на PointerTo.

func SliceOf 1.1

func SliceOf(t Type) Type

SliceOf возвращает тип среза с типом элемента t. Например, если t представляет int, SliceOf(t) представляет []int.

func StructOf 1.7

func StructOf(fields []StructField) Type

StructOf возвращает тип структуры, содержащей поля. Поля Offset и Index игнорируются и вычисляются так, как это делал бы компилятор.

StructOf в настоящее время не поддерживает продвинутые методы вложенных полей и вызывает панику, если переданы неэкспортируемые StructFields.

Пример

Код:

typ := reflect.StructOf([]reflect.StructField{
    {
        Name: "Height",
        Type: reflect.TypeOf(float64(0)),
        Tag:  `json:"height"`,
    },
    {
        Name: "Age",
        Type: reflect.TypeOf(int(0)),
        Tag:  `json:"age"`,
    },
})

v := reflect.New(typ).Elem()
v.Field(0).SetFloat(0.4)
v.Field(1).SetInt(2)
s := v.Addr().Interface()

w := new(bytes.Buffer)
if err := json.NewEncoder(w).Encode(s); err != nil {
    panic(err)
}

fmt.Printf("value: %+v\n", s)
fmt.Printf("json:  %s", w.Bytes())

r := bytes.NewReader([]byte(`{"height":1.5,"age":10}`))
if err := json.NewDecoder(r).Decode(s); err != nil {
    panic(err)
}
fmt.Printf("value: %+v\n", s)

Вывод:

value: &{Height:0.4 Age:2}
json:  {"height":0.4,"age":2}
value: &{Height:1.5 Age:10}

func TypeFor

func TypeFor[T any]() Type

TypeFor возвращает Type, представляющий тип аргумента T.

func TypeOf

func TypeOf(i any) Type

TypeOf возвращает отражающий тип Type, представляющий динамический тип i. Если i — значение интерфейса nil, TypeOf возвращает nil.

Пример

Код:

// As interface types are only used for static typing, a
// common idiom to find the reflection Type for an interface
// type Foo is to use a *Foo value.
writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()

fileType := reflect.TypeOf((*os.File)(nil))
fmt.Println(fileType.Implements(writerType))

Вывод:

true

тип Value

Value — это интерфейс отражения к значению Go.

Не все методы применяются ко всем видам значений. Ограничения, если таковые имеются, указаны в документации для каждого метода. Используйте метод Kind, чтобы определить вид значения перед вызовом специфичных для вида методов. Вызов метода, неподходящего для вида типа, вызывает панику во время выполнения.

Значение по умолчанию Value не представляет никакого значения. Его метод Value.IsValid возвращает false, его метод Kind возвращает Invalid, его метод String возвращает "<неверное значение Value>", и все другие методы вызывают панику. Большинство функций и методов никогда не возвращают неверное значение. Если такое происходит, в документации явно указываются условия.

Значение Value может использоваться одновременно несколькими горутинами, при условии, что соответствующее значение Go может использоваться одновременно для эквивалентных прямых операций.

Для сравнения двух значений Value сравните результаты метода Interface. Использование == на двух значениях Value не сравнивает значения, которые они представляют.

type Value struct {
    // contains filtered or unexported fields
}

func Append

func Append(s Value, x ...Value) Value

Append добавляет значения x в срез s и возвращает полученный срез. Как и в Go, каждое значение x должно быть присваиваемым типу элемента среза.

func AppendSlice

func AppendSlice(s, t Value) Value

AppendSlice добавляет срез t к срезу s и возвращает полученный срез. Срезы s и t должны иметь одинаковый тип элемента.

func Indirect

func Indirect(v Value) Value

Indirect возвращает значение, на которое указывает v. Если v — нулевой указатель, Indirect возвращает значение по умолчанию Value. Если v не является указателем, Indirect возвращает v.

func MakeChan

func MakeChan(typ Type, buffer int) Value

MakeChan создаёт новый канал с указанным типом и размером буфера.

func MakeFunc 1.1

func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value

MakeFunc возвращает новую функцию заданного типа Type, которая оборачивает функцию fn. При вызове эта новая функция выполняет следующее:

  • преобразует свои аргументы в срез значений Value.
  • выполняет results := fn(args).
  • возвращает результаты как срез значений Value, по одному на формальный результат.

Реализация fn может предполагать, что срез аргументов Value имеет количество и тип аргументов, заданных typ. Если typ описывает функцию переменной длины, последнее значение Value представляет собой срез, представляющий аргументы переменной длины, как и в теле функции переменной длины. Срез значений Value, возвращаемый fn, должен иметь количество и тип результатов, заданные typ.

Метод Value.Call позволяет вызывающему методу вызывать типизированную функцию в терминах значений Value; в отличие от этого, MakeFunc позволяет вызывающему методу реализовать типизированную функцию в терминах значений Value.

В разделе примеров документации показано, как использовать MakeFunc для построения функции swap для различных типов.

Пример

Код:

// swap is the implementation passed to MakeFunc.
// It must work in terms of reflect.Values so that it is possible
// to write code without knowing beforehand what the types
// will be.
swap := func(in []reflect.Value) []reflect.Value {
    return []reflect.Value{in[1], in[0]}
}

// makeSwap expects fptr to be a pointer to a nil function.
// It sets that pointer to a new function created with MakeFunc.
// When the function is invoked, reflect turns the arguments
// into Values, calls swap, and then turns swap's result slice
// into the values returned by the new function.
makeSwap := func(fptr any) {
    // fptr is a pointer to a function.
    // Obtain the function value itself (likely nil) as a reflect.Value
    // so that we can query its type and then set the value.
    fn := reflect.ValueOf(fptr).Elem()

    // Make a function of the right type.
    v := reflect.MakeFunc(fn.Type(), swap)

    // Assign it to the value fn represents.
    fn.Set(v)
}

// Make and call a swap function for ints.
var intSwap func(int, int) (int, int)
makeSwap(&intSwap)
fmt.Println(intSwap(0, 1))

// Make and call a swap function for float64s.
var floatSwap func(float64, float64) (float64, float64)
makeSwap(&floatSwap)
fmt.Println(floatSwap(2.72, 3.14))

Вывод:

1 0
3.14 2.72

func MakeMap

func MakeMap(typ Type) Value

MakeMap создаёт новую карту с указанным типом.

func MakeMapWithSize 1.9

func MakeMapWithSize(typ Type, n int) Value

MakeMapWithSize создаёт новую карту с указанным типом и начальным пространством примерно для n элементов.

func MakeSlice

func MakeSlice(typ Type, len, cap int) Value

MakeSlice создаёт новое значение среза с нулевыми значениями для указанного типа среза, длины и ёмкости.

func New

func New(typ Type) Value

New возвращает значение Value, представляющее указатель на новое нулевое значение для указанного типа. То есть, тип возвращаемого значения Value — PointerTo(typ).

func NewAt

func NewAt(typ Type, p unsafe.Pointer) Value

NewAt возвращает значение Value, представляющее указатель на значение указанного типа, используя p как этот указатель.

func Select 1.1

func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)

Select выполняет операцию select, описанную списком случаев. Подобно оператору Go select, он блокируется, пока хотя бы один из случаев не сможет продолжить выполнение, делает единообразный псевдослучайный выбор и затем выполняет этот случай. Он возвращает индекс выбранного случая и, если этот случай был операцией получения, полученное значение и булево значение, указывающее, соответствует ли значение отправке в канал (в отличие от нулевого значения, полученного из-за закрытия канала). Select поддерживает максимум 65536 случаев.

func SliceAt 1.23

func SliceAt(typ Type, p unsafe.Pointer, n int) Value

SliceAt возвращает значение Value, представляющее срез, чьи данные начинаются в p, а длина и ёмкость равны n.

Это аналогично unsafe.Slice.

func ValueOf

func ValueOf(i any) Value

ValueOf возвращает новое значение Value, инициализированное конкретным значением, хранящимся в интерфейсе i. ValueOf(nil) возвращает значение по умолчанию Value.

func Zero

func Zero(typ Type) Value

Zero возвращает значение Value, представляющее нулевое значение для указанного типа. Результат отличается от нулевого значения структуры Value, которое вообще не представляет никакого значения. Например, Zero(TypeOf(42)) возвращает значение Value с типом Int и значением 0. Возвращаемое значение не является адресуемым и не может быть установлено.

func (Value) Addr

func (v Value) Addr() Value

Addr возвращает значение указателя, представляющее адрес v. Оно вызывает панику, если Value.CanAddr возвращает false. Addr обычно используется для получения указателя на поле структуры или элемент среза для вызова метода, требующего получателя-указатель.

func (Value) Bool

func (v Value) Bool() bool

Bool возвращает базовое значение v. Оно вызывает панику, если вид v не Bool.

func (Value) Bytes

func (v Value) Bytes() []byte

Bytes возвращает базовое значение v. Оно вызывает панику, если базовое значение v не является срезом байтов или адресуемым массивом байтов.

func (Value) Call

func (v Value) Call(in []Value) []Value

Call вызывает функцию v с входными аргументами in. Например, если len(in) == 3, v.Call(in) представляет вызов Go v(in[0], in[1], in[2]). Call вызывает панику, если вид v не Func. Он возвращает выходные результаты как значения Value. Как и в Go, каждый входной аргумент должен быть присваиваемым типу соответствующего входного параметра функции. Если v — функция переменной длины, Call создаёт параметр среза переменной длины сам, копируя соответствующие значения.

func (Value) CallSlice

func (v Value) CallSlice(in []Value) []Value

CallSlice вызывает функцию v переменной длины с входными аргументами in, присваивая срез in[len(in)-1] к последнему аргументу переменной длины v. Например, если len(in) == 3, v.CallSlice(in) представляет вызов Go v(in[0], in[1], in[2]...). CallSlice вызывает панику, если вид v не Func или если v не является функцией переменной длины. Он возвращает выходные результаты как значения Value. Как и в Go, каждый входной аргумент должен быть присваиваемым типу соответствующего входного параметра функции.

func (Value) CanAddr

func (v Value) CanAddr() bool

CanAddr сообщает, можно ли получить адрес значения с помощью Value.Addr. Такие значения называются адресуемыми. Значение адресуемо, если оно является элементом среза, элементом адресуемого массива, полем адресуемой структуры или результатом разыменования указателя. Если CanAddr возвращает false, вызов Value.Addr вызовет панику.

func (Value) CanComplex 1.18

func (v Value) CanComplex() bool

CanComplex сообщает, можно ли использовать Value.Complex без вызова паники.

func (Value) CanConvert 1.17

func (v Value) CanConvert(t Type) bool

CanConvert сообщает, можно ли преобразовать значение v в тип t. Если v.CanConvert(t) возвращает true, то v.Convert(t) не вызовет панику.

func (Value) CanFloat 1.18

func (v Value) CanFloat() bool

CanFloat сообщает, можно ли использовать Value.Float без вызова паники.

func (Value) CanInt 1.18

func (v Value) CanInt() bool

CanInt сообщает, можно ли использовать Int без вызова паники.

func (Value) CanInterface

func (v Value) CanInterface() bool

CanInterface сообщает, можно ли использовать Value.Interface без вызова паники.

func (Value) CanSet

func (v Value) CanSet() bool

CanSet сообщает, можно ли изменить значение v. Значение Value можно изменить только если оно адресуемо и не было получено с помощью неэкспортированных полей структуры. Если CanSet возвращает false, вызов Value.Set или любого специфичного для типа сеттера (например, Value.SetBool, Value.SetInt) приведёт к панике.

func (Value) CanUint 1.18

func (v Value) CanUint() bool

CanUint сообщает, можно ли использовать Value.Uint без паники.

func (Value) Cap

func (v Value) Cap() int

Cap возвращает ёмкость v. Он вызывает панику, если Kind v не является Array, Chan, Slice или указателем на Array.

func (Value) Clear 1.21

func (v Value) Clear()

Clear очищает содержимое карты или обнуляет содержимое среза.

Он вызывает панику, если Kind v не является Map или Slice.

func (Value) Close

func (v Value) Close()

Close закрывает канал v. Он вызывает панику, если Kind v не является Chan или v является каналом только для чтения.

func (Value) Comparable 1.20

func (v Value) Comparable() bool

Comparable сообщает, является ли значение v сравнимым. Если тип v является интерфейсом, это проверяет динамический тип. Если это возвращает true, то v.Interface() == x не вызовет панику для любого x, а также v.Equal(u) для любого Value u.

func (Value) Complex

func (v Value) Complex() complex128

Complex возвращает базовое значение v в виде complex128. Он вызывает панику, если Kind v не является Complex64 или Complex128

func (Value) Convert 1.1

func (v Value) Convert(t Type) Value

Convert возвращает значение v, преобразованное в тип t. Если стандартные правила преобразования Go не допускают преобразования значения v в тип t, или при преобразовании v в тип t возникает паника, Convert вызывает панику.

func (Value) Elem

func (v Value) Elem() Value

Elem возвращает значение, содержащееся в интерфейсе v или к которому указывает указатель v. Он вызывает панику, если Kind v не является Interface или Pointer. Возвращает нулевое значение Value, если v равно nil.

func (Value) Equal 1.20

func (v Value) Equal(u Value) bool

Equal возвращает true, если v равно u. Для двух недействительных значений Equal вернёт true. Для значения интерфейса Equal сравнит значение внутри интерфейса. В противном случае, если значения имеют разные типы, Equal вернёт false. В противном случае, для массивов и структур Equal сравнит каждый элемент в порядке, и вернёт false, если найдёт неравные элементы. Во время всех сравнений, если сравниваются значения одного типа, и тип не сравним, Equal вызовет панику.

func (Value) Field

func (v Value) Field(i int) Value

Field возвращает i-е поле структуры v. Он вызывает панику, если Kind v не является Struct или i находится вне диапазона.

func (Value) FieldByIndex

func (v Value) FieldByIndex(index []int) Value

FieldByIndex возвращает вложенное поле, соответствующее индексу. Он вызывает панику, если для вычисления требуется переход через пустой указатель или поле, которое не является структурой.

Пример

Код:

// This example shows a case in which the name of a promoted field
// is hidden by another field: FieldByName will not work, so
// FieldByIndex must be used instead.
type user struct {
    firstName string
    lastName  string
}

type data struct {
    user
    firstName string
    lastName  string
}

u := data{
    user:      user{"Embedded John", "Embedded Doe"},
    firstName: "John",
    lastName:  "Doe",
}

s := reflect.ValueOf(u).FieldByIndex([]int{0, 1})
fmt.Println("embedded last name:", s)

Вывод:

embedded last name: Embedded Doe

func (Value) FieldByIndexErr 1.18

func (v Value) FieldByIndexErr(index []int) (Value, error)

FieldByIndexErr возвращает вложенное поле, соответствующее индексу. Возвращает ошибку, если вычисление требует перехода через пустой указатель, но вызывает панику, если оно должно перейти через поле, которое не является структурой.

func (Value) FieldByName

func (v Value) FieldByName(name string) Value

FieldByName возвращает поле структуры с заданным именем. Возвращает нулевое значение Value, если поле не найдено. Он вызывает панику, если Kind v не является Struct.

Пример

Код:

type user struct {
    firstName string
    lastName  string
}
u := user{firstName: "John", lastName: "Doe"}
s := reflect.ValueOf(u)

fmt.Println("Name:", s.FieldByName("firstName"))

Вывод:

Name: John

func (Value) FieldByNameFunc

func (v Value) FieldByNameFunc(match func(string) bool) Value

FieldByNameFunc возвращает поле структуры с именем, удовлетворяющим функции сопоставления. Он вызывает панику, если Kind v не является Struct. Возвращает нулевое значение Value, если поле не найдено.

func (Value) Float

func (v Value) Float() float64

Float возвращает базовое значение v в виде float64. Он вызывает панику, если Kind v не является Float32 или Float64

func (Value) Grow 1.20

func (v Value) Grow(n int)

Grow увеличивает емкость среза, если необходимо, гарантируя место для n дополнительных элементов. После Grow(n), по крайней мере, n элементов могут быть добавлены в срез без новой аллокации.

Он вызывает панику, если Kind v не является Slice или если n отрицательное или слишком большое для аллокации памяти.

func (Value) Index

func (v Value) Index(i int) Value

Index возвращает i-й элемент v. Он вызывает панику, если Kind v не является Array, Slice или String или i находится вне диапазона.

func (Value) Int

func (v Value) Int() int64

Int возвращает базовое значение v в виде int64. Он вызывает панику, если Kind v не является Int, Int8, Int16, Int32 или Int64.

func (Value) Interface

func (v Value) Interface() (i any)

Interface возвращает текущее значение v в виде interface{}. Это эквивалентно:

var i interface{} = (v's underlying value)

Он вызывает панику, если значение Value было получено с помощью доступа к неэкспортированным полям структуры.

func (Value) InterfaceData

func (v Value) InterfaceData() [2]uintptr

InterfaceData возвращает пару неуказанных значений uintptr. Он вызывает панику, если Kind v не является Interface.

В более ранних версиях Go эта функция возвращала значение интерфейса как пару uintptr. Начиная с Go 1.4, реализация значений интерфейса исключает любое определенное использование InterfaceData.

Устарело: Представление значений интерфейса в памяти не совместимо с InterfaceData.

func (Value) IsNil

func (v Value) IsNil() bool

IsNil проверяет, является ли его аргумент v nil. Аргумент должен быть значением chan, func, interface, map, pointer или slice; если это не так, IsNil вызывает панику. Обратите внимание, что IsNil не всегда эквивалентен обычному сравниванию с nil в Go. Например, если v был создан путем вызова ValueOf с незаинициализированной переменной интерфейса i, i==nil будет true, но v.IsNil вызовет панику, так как v будет нулевым значением Value.

func (Value) IsValid

func (v Value) IsValid() bool

IsValid проверяет, представляет ли v значение. Возвращает false, если v является нулевым значением. Если Value.IsValid возвращает false, все остальные методы, кроме String, вызывают панику. Большинство функций и методов никогда не возвращают недействительного значения Value. Если одна из них это делает, в документации явно указаны условия.

func (Value) IsZero 1.13

func (v Value) IsZero() bool

IsZero сообщает, является ли v нулевым значением для его типа. Он вызывает панику, если аргумент недействителен.

func (Value) Kind

func (v Value) Kind() Kind

Kind возвращает Kind v. Если v является нулевым значением (Value.IsValid возвращает false), Kind возвращает Invalid.

func (Value) Len

func (v Value) Len() int

Len возвращает длину v. Он вызывает панику, если Kind v не является Array, Chan, Map, Slice, String или указателем на Array.

func (Value) MapIndex

func (v Value) MapIndex(key Value) Value

MapIndex возвращает значение, связанное с ключом в карте v. Он вызывает панику, если Kind v не является Map. Возвращает нулевое значение Value, если ключ не найден в карте или если v представляет собой пустую карту. Как и в Go, значение ключа должно быть присваиваемо типу ключа карты.

func (Value) MapKeys

func (v Value) MapKeys() []Value

MapKeys возвращает срез, содержащий все ключи, присутствующие в карте, в неопределенном порядке. Он вызывает панику, если Kind v не является Map. Возвращает пустой срез, если v представляет собой пустую карту.

func (Value) MapRange 1.12

func (v Value) MapRange() *MapIter

MapRange возвращает итератор диапазона для карты. Он вызывает панику, если Kind v не является Map.

Вызовите MapIter.Next для продвижения итератора, и MapIter.Key/MapIter.Value для доступа к каждому элементу. MapIter.Next возвращает false, когда итератор исчерпан. MapRange следует той же семантике итерации, что и оператор range.

Пример:

iter := reflect.ValueOf(m).MapRange()
for iter.Next() {
	k := iter.Key()
	v := iter.Value()
	...
}

func (Value) Method

func (v Value) Method(i int) Value

Method возвращает значение функции, соответствующей i-му методу v. Аргументы вызова Call на возвращенной функции не должны включать получатель; возвращаемая функция всегда будет использовать v в качестве получателя. Method вызывает панику, если i находится вне диапазона или если v является пустым значением интерфейса.

func (Value) MethodByName

func (v Value) MethodByName(name string) Value

MethodByName возвращает значение функции, соответствующей методу v с данным именем. Аргументы вызова Call на возвращенной функции не должны включать получатель; возвращаемая функция всегда будет использовать v в качестве получателя. Возвращает нулевое значение Value, если метод не найден.

func (Value) NumField

func (v Value) NumField() int

NumField возвращает количество полей в структуре v. Он вызывает панику, если Kind v не является Struct.

func (Value) NumMethod

func (v Value) NumMethod() int

NumMethod возвращает количество методов в наборе методов значения.

Для типа, не являющегося интерфейсом, он возвращает количество экспортированных методов.

Для типа интерфейса он возвращает количество экспортированных и неэкспортированных методов.

func (Value) OverflowComplex

func (v Value) OverflowComplex(x complex128) bool

OverflowComplex сообщает, можно ли представить complex128 x типом v. Он вызывает панику, если Kind v не является Complex64 или Complex128.

func (Value) OverflowFloat

func (v Value) OverflowFloat(x float64) bool

OverflowFloat сообщает, можно ли представить float64 x типом v. Он вызывает панику, если Kind v не является Float32 или Float64.

func (Value) OverflowInt

func (v Value) OverflowInt(x int64) bool

OverflowInt сообщает, можно ли представить int64 x типом v. Он вызывает панику, если Kind v не является Int, Int8, Int16, Int32 или Int64.

func (Value) OverflowUint

func (v Value) OverflowUint(x uint64) bool

OverflowUint сообщает, может ли значение uint64 x быть представлено типом v. Возникает паника, если Kind v не равен Uint, Uintptr, Uint8, Uint16, Uint32 или Uint64.

func (Value) Pointer

func (v Value) Pointer() uintptr

Pointer возвращает значение v как uintptr. Возникает паника, если Kind v не равен Chan, Func, Map, Pointer, Slice, String или UnsafePointer.

Если Kind v равен Func, возвращаемый указатель — это указатель на внутренний код, но не обязательно достаточный для однозначной идентификации функции. Единственная гарантия — что результат равен нулю тогда и только тогда, когда v — nil func Value.

Если Kind v равен Slice, возвращаемый указатель — это указатель на первый элемент среза. Если срез равен nil, возвращаемое значение равно 0. Если срез пуст, но не равен nil, возвращаемое значение отлично от нуля.

Если Kind v равен String, возвращаемый указатель — это указатель на первый элемент внутренней последовательности байтов строки.

Предпочтительнее использовать uintptr(Value.UnsafePointer()) для получения эквивалентного результата.

func (Value) Recv

func (v Value) Recv() (x Value, ok bool)

Recv получает и возвращает значение из канала v. Возникает паника, если Kind v не равен Chan. Прием блокируется до тех пор, пока значение не будет готово. Логическое значение ok равно true, если значение x соответствует отправке в канал, и false, если получено нулевое значение из-за закрытия канала.

func (Value) Send

func (v Value) Send(x Value)

Send отправляет x в канал v. Возникает паника, если Kind v не равен Chan или если тип x не совпадает с типом элемента v. Как и в Go, значение x должно быть присваиваемо типу элемента канала.

func (Value) Seq 1.23

func (v Value) Seq() iter.Seq[Value]

Seq возвращает iter.Seq[Value], который циклически проходит по элементам v. Если Kind v равен Func, это должна быть функция без результатов, принимающая один аргумент типа func(T) bool для некоторого типа T. Если Kind v равен Pointer, тип элемента указателя должен иметь тип Array. В противном случае Kind v должен быть Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr, Array, Chan, Map, Slice или String.

func (Value) Seq2 1.23

func (v Value) Seq2() iter.Seq2[Value, Value]

Seq2 возвращает iter.Seq2[Value, Value], который циклически проходит по элементам v. Если Kind v равен Func, это должна быть функция без результатов, принимающая один аргумент типа func(K, V) bool для некоторых типов K, V. Если Kind v равен Pointer, тип элемента указателя должен иметь тип Array. В противном случае Kind v должен быть Array, Map, Slice или String.

func (Value) Set

func (v Value) Set(x Value)

Set присваивает x значению v. Возникает паника, если Value.CanSet возвращает false. Как и в Go, значение x должно быть присваиваемо типу v и не должно быть получено из неэкспортированного поля.

func (Value) SetBool

func (v Value) SetBool(x bool)

SetBool устанавливает значение v. Возникает паника, если Kind v не равен Bool или если Value.CanSet возвращает false.

func (Value) SetBytes

func (v Value) SetBytes(x []byte)

SetBytes устанавливает значение v. Возникает паника, если v — не срез байтов.

func (Value) SetCap 1.2

func (v Value) SetCap(n int)

SetCap устанавливает емкость v на n. Возникает паника, если Kind v не равен Slice или если n меньше длины или больше емкости среза.

func (Value) SetComplex

func (v Value) SetComplex(x complex128)

SetComplex устанавливает значение v на x. Возникает паника, если Kind v не равен Complex64 или Complex128, или если Value.CanSet возвращает false.

func (Value) SetFloat

func (v Value) SetFloat(x float64)

SetFloat устанавливает значение v на x. Возникает паника, если Kind v не равен Float32 или Float64, или если Value.CanSet возвращает false.

func (Value) SetInt

func (v Value) SetInt(x int64)

SetInt устанавливает значение v на x. Возникает паника, если Kind v не равен Int, Int8, Int16, Int32 или Int64, или если Value.CanSet возвращает false.

func (Value) SetIterKey 1.18

func (v Value) SetIterKey(iter *MapIter)

SetIterKey присваивает v ключ текущей записи карты итератора. Эквивалентно v.Set(iter.Key()), но без создания нового Value. Как и в Go, ключ должен быть присваиваем типу v и не должен быть получен из неэкспортированного поля.

func (Value) SetIterValue 1.18

func (v Value) SetIterValue(iter *MapIter)

SetIterValue присваивает v значение текущей записи карты итератора. Эквивалентно v.Set(iter.Value()), но без создания нового Value. Как и в Go, значение должно быть присваиваемо типу v и не должно быть получено из неэкспортированного поля.

func (Value) SetLen

func (v Value) SetLen(n int)

SetLen устанавливает длину v на n. Возникает паника, если Kind v не равен Slice или если n отрицательно или больше емкости среза.

func (Value) SetMapIndex

func (v Value) SetMapIndex(key, elem Value)

SetMapIndex устанавливает элемент, связанный с ключом в карте v, на elem. Возникает паника, если Kind v не равен Map. Если elem — нулевое значение, SetMapIndex удаляет ключ из карты. В противном случае, если v содержит nil карту, SetMapIndex вызовет панику. Как и в Go, ключ должен быть присваиваем типу ключа карты, а значение elem — типу элемента карты.

func (Value) SetPointer

func (v Value) SetPointer(x unsafe.Pointer)

SetPointer устанавливает значение unsafe.Pointer v на x. Возникает паника, если Kind v не равен UnsafePointer.

func (Value) SetString

func (v Value) SetString(x string)

SetString устанавливает значение v на x. Возникает паника, если Kind v не равен String или если Value.CanSet возвращает false.

func (Value) SetUint

func (v Value) SetUint(x uint64)

SetUint устанавливает значение v на x. Возникает паника, если Kind v не равен Uint, Uintptr, Uint8, Uint16, Uint32 или Uint64, или если Value.CanSet возвращает false.

func (Value) SetZero 1.20

func (v Value) SetZero()

SetZero устанавливает v в нулевое значение типа v. Возникает паника, если Value.CanSet возвращает false.

func (Value) Slice

func (v Value) Slice(i, j int) Value

Slice возвращает v[i:j]. Возникает паника, если Kind v не равен Array, Slice или String, или если массив v не адресуем, или если индексы находятся вне границ.

func (Value) Slice3 1.2

func (v Value) Slice3(i, j, k int) Value

Slice3 — трёхиндексная форма операции среза: она возвращает v[i:j:k]. Возникает паника, если Kind v не равен Array или Slice, или если массив v не адресуем, или если индексы находятся вне границ.

func (Value) String

func (v Value) String() string

String возвращает строку, представляющую значение v. String — это особый случай из-за соглашений Go для метода String. В отличие от других методов-получателей, он не вызывает панику, если Kind v не равен String. Вместо этого он возвращает строку вида "<значение T>", где T — тип v. Пакет fmt обрабатывает значения Value специально. Он не вызывает их метод String неявно, а вместо этого выводит конкретные значения, которые они содержат.

func (Value) TryRecv

func (v Value) TryRecv() (x Value, ok bool)

TryRecv пытается получить значение из канала v, но не будет блокироваться. Возникает паника, если Kind v не равен Chan. Если прием возвращает значение, x — это переданное значение, а ok — true. Если прием не может завершиться без блокировки, x — нулевое значение, а ok — false. Если канал закрыт, x — нулевое значение для типа элемента канала, а ok — false.

func (Value) TrySend

func (v Value) TrySend(x Value) bool

TrySend пытается отправить x в канал v, но не будет блокироваться. Возникает паника, если Kind v не равен Chan. Возвращает, было ли значение отправлено. Как и в Go, значение x должно быть присваиваемо типу элемента канала.

func (Value) Type

func (v Value) Type() Type

Type возвращает тип v.

func (Value) Uint

func (v Value) Uint() uint64

Uint возвращает значение v в виде uint64. Возникает паника, если Kind v не равен Uint, Uintptr, Uint8, Uint16, Uint32 или Uint64.

func (Value) UnsafeAddr

func (v Value) UnsafeAddr() uintptr

UnsafeAddr возвращает указатель на данные v как uintptr. Возникает паника, если v не адресуем.

Предпочтительнее использовать uintptr(Value.Addr().UnsafePointer()) для получения эквивалентного результата.

func (Value) UnsafePointer 1.18

func (v Value) UnsafePointer() unsafe.Pointer

UnsafePointer возвращает значение v как unsafe.Pointer. Возникает паника, если Kind v не равен Chan, Func, Map, Pointer, Slice, String или UnsafePointer.

Если Kind v равен Func, возвращаемый указатель — это указатель на внутренний код, но не обязательно достаточный для однозначной идентификации функции. Единственная гарантия — что результат равен nil тогда и только тогда, когда v — nil func Value.

Если Kind v равен Slice, возвращаемый указатель — это указатель на первый элемент среза. Если срез равен nil, возвращаемое значение — nil. Если срез пуст, но не равен nil, возвращаемое значение — не nil.

Если Kind v равен String, возвращаемый указатель — это указатель на первый элемент внутренней последовательности байтов строки.

type ValueError

Ошибка ValueError возникает, когда метод Value вызывается на Value, который его не поддерживает. Такие случаи документированы в описании каждого метода.

type ValueError struct {
    Method string
    Kind   Kind
}

func (*ValueError) Error

func (e *ValueError) Error() string

Ошибки

  • ☞

    Функции FieldByName и связанные с ней функции считают имена полей структуры равными, если имена равны, даже если это неэкспортированные имена, происходящие из разных пакетов. Практическое следствие этого заключается в том, что результат t.FieldByName("x") не определён однозначно, если тип структуры t содержит несколько полей с именем x (вложенных из разных пакетов). FieldByName может вернуть одно из полей с именем x или может сообщить, что таких полей нет. Подробнее см. https://golang.org/issue/4876.

Подкаталоги

Имя Описание
..

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/reflect/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API