Пакет reflect
Обзор
Пакет reflect реализует отражение во время выполнения, позволяя программе манипулировать объектами произвольных типов. Обычно значение со статическим типом interface{} преобразуют в информацию о его динамическом типе, вызывая TypeOf, которая возвращает Type.
Вызов ValueOf возвращает Value, представляющее данные во время выполнения. Zero принимает Type и возвращает Value, представляющее нулевое значение этого типа.
Введение в отражение в Go см. в статье «The Laws of Reflection»: https://golang.org/doc/articles/laws_of_reflection.html
Указатель
Примеры
Файлы пакета
abi.go badlinkname.go deepequal.go float32reg_generic.go iter.go makefunc.go map.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 — это Array, функция вызывает панику, если Value.CanSet возвращает false.
В частном случае src может иметь разновидность String, если тип элементов dst имеет разновидность Uint8.
func DeepEqual
func DeepEqual(x, y any) bool
DeepEqual сообщает, являются ли x и y «глубоко равными», что определяется следующим образом. Два значения идентичного типа глубоко равны, если выполняется один из следующих случаев. Значения разных типов никогда не бывают глубоко равными.
Значения массивов глубоко равны, если глубоко равны соответствующие им элементы.
Значения структур глубоко равны, если глубоко равны соответствующие им поля — как экспортируемые, так и неэкспортируемые.
Значения Func глубоко равны, если оба равны nil; в противном случае они не являются глубоко равными.
Значения интерфейсов глубоко равны, если они содержат глубоко равные конкретные значения.
Значения Map глубоко равны, если выполняются все следующие условия: оба значения либо nil, либо не nil; они имеют одинаковую длину; и либо это один и тот же объект map, либо соответствующие ключи (сопоставленные с использованием равенства Go) отображаются на глубоко равные значения.
Значения указателей глубоко равны, если они равны согласно оператору == в Go или если они указывают на глубоко равные значения.
Значения срезов глубоко равны, если выполняются все следующие условия: оба значения либо nil, либо не nil; они имеют одинаковую длину; и либо они указывают на один и тот же первый элемент одного и того же базового массива (то есть &x[0] == &y[0]), либо их соответствующие элементы (до длины среза) глубоко равны. Обратите внимание, что непустой срез нулевой длины и nil-срез (например, []byte{} и []byte(nil)) не являются глубоко равными.
Другие значения — числа, логические значения, строки и каналы — глубоко равны, если они равны согласно оператору == в Go.
В целом DeepEqual — это рекурсивное ослабление оператора == в Go. Однако эту идею невозможно реализовать без некоторой несогласованности. В частности, значение может быть не равно самому себе либо потому, что оно имеет тип func (в общем случае несравнимый), либо потому, что оно является значением NaN с плавающей точкой (не равным самому себе при сравнении чисел с плавающей точкой), либо потому, что это массив, структура или интерфейс, содержащие такое значение. С другой стороны, значения указателей всегда равны сами себе, даже если они указывают на такие проблемные значения или содержат их, поскольку они сравниваются как равные оператором == в Go, а этого достаточно для глубокой равности независимо от содержимого. DeepEqual определена так, что то же упрощение применяется к срезам и картам: если x и y — один и тот же срез или одна и та же карта, они глубоко равны независимо от содержимого.
При обходе значений данных DeepEqual может обнаружить цикл. При втором и последующих сравнениях двух ранее сравнивавшихся значений-указателей функция считает их равными, а не проверяет значения, на которые они указывают. Это гарантирует завершение DeepEqual.
func Swapper 1.8
func Swapper(slice any) func(i, j int)
Swapper возвращает функцию, которая меняет местами элементы указанного среза.
Swapper вызывает панику, если указанный интерфейс не является срезом.
func TypeAssert 1.25
func TypeAssert[T any](v Value) (T, bool)
TypeAssert семантически эквивалентна следующему выражению:
v2, ok := v.Interface().(T)
Обратите внимание, что эта функция, как и приведённое выше утверждение типа, может возвращать:
ok == false, если v.Type() == reflect.TypeFor[T](). Например, если T и v — типы интерфейсов и v.IsNil() == true. В этом случае v.Interface() возвращает интерфейсное значение nil, и утверждение .(T) завершается с ok == false.
ok == true, если v.Type() != reflect.TypeFor[T](). Например, если T — тип интерфейса, а v содержит значение, конкретный тип которого реализует T.
type ChanDir
ChanDir представляет направление канала.
type ChanDir int
const (
RecvDir ChanDir = 1 << iota // <-chan
SendDir // chan<-
BothDir = RecvDir | SendDir // chan
) func (ChanDir) String
func (d ChanDir) String() string
type 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
func (Kind) String
func (k Kind) String() string
String возвращает имя k.
type MapIter 1.12
MapIter — это итератор для перебора элементов map. См. Value.MapRange.
type MapIter struct {
// contains filtered or unexported fields
}
func (*MapIter) Key 1.12
func (iter *MapIter) Key() Value
Key возвращает ключ текущей записи map итератора iter.
func (*MapIter) Next 1.12
func (iter *MapIter) Next() bool
Next продвигает итератор map и сообщает, есть ли следующая запись. Функция возвращает false, если итератор iter исчерпан; последующие вызовы MapIter.Key, MapIter.Value или MapIter.Next вызовут панику.
func (*MapIter) Reset 1.18
func (iter *MapIter) Reset(v Value)
Reset изменяет iter, чтобы перебирать v. Функция вызывает панику, если Kind значения v не равен Map и v не является нулевым Value. Вызов Reset(Value{}) приводит к тому, что iter больше не ссылается ни на одну map, что может позволить сборщику мусора освободить ранее перебираемую map.
func (*MapIter) Value 1.12
func (iter *MapIter) Value() Value
Value возвращает значение текущей записи map итератора iter.
type 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
}
func (Method) IsExported 1.17
func (m Method) IsExported() bool
IsExported сообщает, является ли метод экспортируемым.
type SelectCase 1.1
SelectCase описывает отдельный вариант в операции select. Тип варианта зависит от Dir — направления передачи данных.
Если Dir равен SelectDefault, вариант представляет ветвь default. Chan и Send должны быть нулевыми значениями Value.
Если Dir равен SelectSend, вариант представляет операцию отправки. Обычно базовое значение Chan должно быть каналом, а базовое значение Send должно быть присваиваемым типу элемента канала. В частном случае, если Chan — нулевое значение Value, вариант игнорируется, а поле Send также игнорируется и может быть как нулевым, так и ненулевым.
Если Dir равен SelectRecv, вариант представляет операцию получения. Обычно базовое значение Chan должно быть каналом, а Send должно быть нулевым значением Value. Если Chan — нулевое значение Value, вариант игнорируется, но Send всё равно должно быть нулевым значением Value. При выборе операции получения Select возвращает полученное значение Value.
type SelectCase struct {
Dir SelectDir // direction of case
Chan Value // channel to use (for send or receive)
Send Value // value to send (for send)
}
type SelectDir 1.1
SelectDir описывает направление передачи данных в варианте select.
type SelectDir int
const (
SelectSend SelectDir // case Chan <- Send
SelectRecv // case <-Chan:
SelectDefault // default
) type SliceHeader
SliceHeader — это представление среза во время выполнения. Его нельзя безопасно или переносимо использовать, а его представление может измениться в последующих выпусках. Кроме того, поле Data не гарантирует, что данные, на которые оно ссылается, не будут собраны сборщиком мусора, поэтому программы должны хранить отдельный указатель правильного типа на базовые данные.
Устарело: используйте вместо этого unsafe.Slice или unsafe.SliceData.
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
type StringHeader
StringHeader — это представление строки во время выполнения. Его нельзя безопасно или переносимо использовать, а его представление может измениться в последующих выпусках. Кроме того, поле Data не гарантирует, что данные, на которые оно ссылается, не будут собраны сборщиком мусора, поэтому программы должны хранить отдельный указатель правильного типа на базовые данные.
Устарело: используйте вместо этого unsafe.String или unsafe.StringData.
type StringHeader struct {
Data uintptr
Len int
}
type 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
}
func VisibleFields 1.17
func VisibleFields(t Type) []StructField
VisibleFields возвращает все видимые поля t, который должен быть типом структуры. Поле считается видимым, если к нему можно обратиться напрямую с помощью вызова FieldByName. Возвращаемые поля включают поля внутри анонимных членов-структур и неэкспортируемые поля. Они расположены в том же порядке, что и в структуре; за анонимными полями сразу следуют продвинутые поля.
Для каждого элемента e возвращённого среза соответствующее поле можно получить из значения v типа t, вызвав v.FieldByIndex(e.Index).
func (StructField) IsExported 1.17
func (f StructField) IsExported() bool
IsExported сообщает, является ли поле экспортируемым.
type StructTag
StructTag — это строка тега поля структуры.
По соглашению строки тегов представляют собой конкатенацию пар key:"value", между которыми могут стоять пробелы. Каждый ключ — непустая строка, состоящая из непробельных управляющих символов, кроме пробела (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
func (StructTag) Get
func (tag StructTag) Get(key string) string
Get возвращает значение, связанное с key в строке тега. Если такого ключа в теге нет, Get возвращает пустую строку. Если тег не соответствует принятому формату, возвращаемое Get значение не определено. Чтобы определить, задан ли тег явно пустой строкой, используйте StructTag.Lookup.
func (StructTag) Lookup 1.7
func (tag StructTag) Lookup(key string) (value string, ok bool)
Lookup возвращает значение, связанное с key в строке тега. Если ключ присутствует в теге, возвращается значение (которое может быть пустым). В противном случае возвращаемое значение будет пустой строкой. Возвращаемое значение ok сообщает, было ли значение явно задано в строке тега. Если тег не соответствует принятому формату, возвращаемое Lookup значение не определено.
Пример
Код:
type S struct {
F0 string `alias:"field_0"`
F1 string `alias:""`
F2 string
}
s := S{}
st := reflect.TypeOf(s)
for field := range st.Fields() {
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
Type — это представление типа Go.
Не все методы применимы ко всем разновидностям типов. Ограничения, если они есть, указаны в документации каждого метода. Перед вызовом методов, специфичных для разновидности, используйте метод Kind, чтобы определить разновидность типа. Вызов метода, неприменимого к данной разновидности типа, вызывает панику во время выполнения.
Значения Type сравнимы, например, с помощью оператора ==, поэтому их можно использовать в качестве ключей map. Два значения 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.
//
// Calling this method will force the linker to retain all exported methods in all packages.
// This may make the executable binary larger but will not affect execution time.
Method(int) Method
// Methods returns an iterator over each method in the type's method set. The sequence is
// equivalent to calling Method successively for each index i in the range [0, NumMethod()).
Methods() iter.Seq[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.
//
// Calling this method will cause the linker to retain all methods with this name in all packages.
// If the linker can't determine the name, it will retain all exported methods.
// This may make the executable binary larger but will not affect execution time.
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
// Fields returns an iterator over each struct field for struct type t. The sequence is
// equivalent to calling Field successively for each index i in the range [0, NumField()).
// It panics if the type's Kind is not Struct.
Fields() iter.Seq[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
// Ins returns an iterator over each input parameter of function type t. The sequence
// is equivalent to calling In successively for each index i in the range [0, NumIn()).
// It panics if the type's Kind is not Func.
Ins() iter.Seq[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
// Outs returns an iterator over each output parameter of function type t. The sequence
// is equivalent to calling Out successively for each index i in the range [0, NumOut()).
// It panics if the type's Kind is not Func.
Outs() iter.Seq[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
} func ArrayOf 1.5
func ArrayOf(length int, elem Type) Type
ArrayOf возвращает тип массива с заданными длиной и типом элементов. Например, если t представляет int, ArrayOf(5, t) представляет [5]int.
Если размер получившегося типа превышает доступное адресное пространство, ArrayOf вызывает панику.
func ChanOf 1.1
func ChanOf(dir ChanDir, t Type) Type
ChanOf возвращает тип канала с заданными направлением и типом элементов. Например, если t представляет int, ChanOf(RecvDir, t) представляет <-chan int.
Среда выполнения gc накладывает ограничение в 64 kB на типы элементов канала. Если размер t равен этому ограничению или превышает его, ChanOf вызывает панику.
func 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 возвращает тип map с заданными типами ключей и элементов. Например, если k представляет int, а e представляет string, MapOf(k, e) представляет map[int]string.
Если тип ключа не является допустимым типом ключа map (то есть если для него не определён оператор == в 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 не поддерживает продвинутые методы встроенных полей и вызывает панику, если ему передать неэкспортируемые StructField.
Пример
Код:
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 1.22
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
type Value
Value — это интерфейс отражения для значения Go.
Не все методы применимы ко всем разновидностям значений. Ограничения, если они есть, указаны в документации каждого метода. Перед вызовом методов, специфичных для разновидности, используйте метод Kind, чтобы определить разновидность значения. Вызов метода, неприменимого к данной разновидности типа, вызывает панику во время выполнения.
Нулевое значение Value представляет отсутствие значения. Его метод Value.IsValid возвращает false, метод Kind возвращает Invalid, метод String возвращает "<invalid 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 — nil-указатель, 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 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 создаёт новую map указанного типа.
func MakeMapWithSize 1.9
func MakeMapWithSize(typ Type, n int) Value
MakeMapWithSize создаёт новую map указанного типа с начальным пространством примерно для n элементов.
func MakeSlice
func MakeSlice(typ Type, len, cap int) Value
MakeSlice создаёт новое срезовое значение с нулевой инициализацией для указанного типа среза, длины и ёмкости.
func New
func New(typ Type) Value
New возвращает Value, представляющее указатель на новое нулевое значение указанного типа. То есть Type возвращённого 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, описанную списком вариантов. Подобно оператору select в Go, функция блокируется, пока хотя бы один из вариантов не сможет выполниться, делает равновероятный псевдослучайный выбор, а затем выполняет выбранный вариант. Она возвращает индекс выбранного варианта и, если этот вариант был операцией получения, полученное значение и логическое значение, указывающее, соответствует ли значение отправке по каналу (в отличие от нулевого значения, полученного из-за закрытия канала). 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 с Kind 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. Функция вызывает панику, если Kind значения 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) соответствует вызову v(in[0], in[1], in[2]) в Go. Call вызывает панику, если Kind значения v не равен Func. Функция возвращает выходные результаты в виде Values. Как и в Go, каждый входной аргумент должен быть присваиваем параметру соответствующего типа функции. Если v — вариативная функция, Call самостоятельно создаёт вариативный параметр-срез, копируя в него соответствующие значения. Функция вызывает панику, если Value получено при обращении к неэкспортируемым полям структуры.
func (Value) CallSlice
func (v Value) CallSlice(in []Value) []Value
CallSlice вызывает вариативную функцию v с входными аргументами in, присваивая срез in[len(in)-1] последнему вариативному аргументу v. Например, если len(in) == 3, вызов v.CallSlice(in) соответствует вызову v(in[0], in[1], in[2]...) в Go. CallSlice вызывает панику, если Kind значения v не равен Func или если v не является вариативной функцией. Функция возвращает выходные результаты в виде Values. Как и в Go, каждый входной аргумент должен быть присваиваем параметру соответствующего типа функции. Функция вызывает панику, если Value получено при обращении к неэкспортируемым полям структуры.
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. Если v равен nil, возвращается нулевое Value.
func (Value) Equal 1.20
func (v Value) Equal(u Value) bool
Equal сообщает, равны ли v и u. Для двух недопустимых значений Equal сообщит, что они равны. Для значения-интерфейса Equal сравнивает значение внутри интерфейса. В противном случае, если значения имеют разные типы, Equal сообщит, что они не равны. Для массивов и структур Equal сравнивает каждый элемент по порядку и сообщает, что значения не равны, если обнаружит неравные элементы. При любом сравнении значений одного типа 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 возвращает вложенное поле, соответствующее индексу. Функция вызывает панику, если при вычислении требуется пройти через nil-указатель или поле, не являющееся структурой.
Пример
Код:
// 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 возвращает вложенное поле, соответствующее индексу. Функция возвращает ошибку, если при вычислении требуется пройти через nil-указатель, но вызывает панику, если требуется пройти через поле, не являющееся структурой.
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 возвращает поле структуры с именем, соответствующим условию функции match. Функция вызывает панику, если Kind значения v не равен Struct. Если поле не найдено, возвращается нулевое Value.
func (Value) Fields 1.26
func (v Value) Fields() iter.Seq2[StructField, Value]
Fields возвращает итератор по каждому StructField значения v вместе с соответствующим ему Value.
Последовательность эквивалентна последовательным вызовам Value.Field для каждого индекса i в диапазоне [0, NumField()).
Функция вызывает панику, если Kind значения v не равен Struct.
Пример
Код:
type Person struct {
Name string
Age int
City string
Country string
}
p := Person{Name: "Alice", Age: 30, City: "New York", Country: "USA"}
v := reflect.ValueOf(p)
fmt.Println("Iterating over all struct fields:")
for field, value := range v.Fields() {
fmt.Printf(" %s = %v\n", field.Name, value)
}
Результат:
Iterating over all struct fields: Name = Alice Age = 30 City = New York Country = USA
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 отрицательно или слишком велико для выделения памяти либо если Value.CanSet возвращает false.
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, указателем или срезом; в противном случае 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. Если 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 (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 возвращает значение, связанное с ключом key в карте v. Функция вызывает панику, если Kind значения v не равен Map. Если ключ не найден в карте или v представляет nil-карту, возвращается нулевое Value. Как и в Go, значение ключа должно быть присваиваемо типу ключей карты.
func (Value) MapKeys
func (v Value) MapKeys() []Value
MapKeys возвращает срез, содержащий все ключи карты в неопределённом порядке. Функция вызывает панику, если Kind значения v не равен Map. Если v представляет nil-карту, возвращается пустой срез.
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 — nil-интерфейс.
Вызов этого метода заставит компоновщик сохранить все экспортируемые методы во всех пакетах. Это может увеличить размер исполняемого файла, но не повлияет на время выполнения.
func (Value) MethodByName
func (v Value) MethodByName(name string) Value
MethodByName возвращает значение-функцию, соответствующее методу v с указанным именем. В аргументы вызова Call для возвращённой функции не следует включать получателя: возвращённая функция всегда будет использовать v в качестве получателя. Если метод не найден, возвращается нулевое Value.
Вызов этого метода заставит компоновщик сохранить все методы с таким именем во всех пакетах. Если компоновщик не может определить имя, он сохранит все экспортируемые методы. Это может увеличить размер исполняемого файла, но не повлияет на время выполнения.
func (Value) Methods 1.26
func (v Value) Methods() iter.Seq2[Method, Value]
Methods возвращает итератор по каждому методу Method значения v вместе с соответствующим методом Value; это функция, у которой v привязано в качестве получателя. Поэтому получателя не следует включать в аргументы Value.Call.
Последовательность эквивалентна последовательным вызовам Value.Method для каждого индекса i в диапазоне [0, NumMethod()).
Methods вызывает панику, если v — nil-интерфейс.
Вызов этого метода заставит компоновщик сохранить все экспортируемые методы во всех пакетах. Это может увеличить размер исполняемого файла, но не повлияет на время выполнения.
Пример
Код:
r := bytes.NewReader([]byte("hello"))
v := reflect.ValueOf(r)
fmt.Println("Methods of *bytes.Reader:")
for method, methodValue := range v.Methods() {
fmt.Printf(" %s\n", method.Name)
// Call the Len method as an example
if method.Name == "Len" {
result := methodValue.Call(nil)
fmt.Printf(" Len() = %v\n", result[0])
}
}
Результат:
Methods of *bytes.Reader: Len Len() = 5 Read ReadAt ReadByte ReadRune Reset Seek Size UnreadByte UnreadRune WriteTo
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.
Если 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, тип элемента указателя должен иметь Kind 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, тип элемента указателя должен иметь Kind 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 не является срезом байтов или если Value.CanSet возвращает false.
func (Value) SetCap 1.2
func (v Value) SetCap(n int)
SetCap задаёт ёмкость v, равную n. Функция вызывает панику, если Kind значения v не равен Slice, если n меньше длины или больше ёмкости среза либо если Value.CanSet возвращает false.
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 ключ текущей записи карты итератора iter. Метод эквивалентен v.Set(iter.Key()), но не требует выделения памяти для нового Value. Как и в Go, ключ должен быть присваиваем типу v и не должен быть получен из неэкспортируемого поля. Функция вызывает панику, если Value.CanSet возвращает false.
func (Value) SetIterValue 1.18
func (v Value) SetIterValue(iter *MapIter)
SetIterValue присваивает v значение текущей записи карты итератора iter. Метод эквивалентен v.Set(iter.Value()), но не требует выделения памяти для нового Value. Как и в Go, значение должно быть присваиваемо типу v и не должно быть получено из неэкспортируемого поля. Функция вызывает панику, если Value.CanSet возвращает false.
func (Value) SetLen
func (v Value) SetLen(n int)
SetLen задаёт длину v, равную n. Функция вызывает панику, если Kind значения v не равен Slice, если n отрицательно или больше ёмкости среза либо если Value.CanSet возвращает false.
func (Value) SetMapIndex
func (v Value) SetMapIndex(key, elem Value)
SetMapIndex задаёт элемент elem, связанный с ключом key в карте v. Функция вызывает панику, если Kind значения v не равен Map. Если elem — нулевое Value, SetMapIndex удаляет ключ из карты. В противном случае, если v содержит nil-карту, SetMapIndex вызывает панику. Как и в Go, key должен быть присваиваем типу ключей карты, а значение elem — типу элементов карты.
func (Value) SetPointer
func (v Value) SetPointer(x unsafe.Pointer)
SetPointer задаёт значению unsafe.Pointer v значение x. Функция вызывает панику, если Kind значения v не равен UnsafePointer или если Value.CanSet возвращает false.
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 нулевое значение его типа. Функция вызывает панику, если 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 value>", где T — тип v. Пакет fmt обрабатывает Values особым образом. Он не вызывает их метод String неявно, а вместо этого выводит хранящиеся в них конкретные значения.
func (Value) TryRecv
func (v Value) TryRecv() (x Value, ok bool)
TryRecv пытается получить значение из канала v, не блокируясь. Функция вызывает панику, если Kind значения v не равен Chan. Если операция получения возвращает значение, x содержит переданное значение, а ok равно true. Если операция не может завершиться без блокировки, x — нулевое Value, а 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, возвращённый указатель указывает на базовый указатель кода, но этого не обязательно достаточно, чтобы однозначно идентифицировать одну функцию. Единственная гарантия состоит в том, что результат равен нулю тогда и только тогда, когда v — nil-значение типа func.
Если 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/