Пакет reflect
Обзор
Пакет reflect реализует рефлексию во время выполнения, позволяя программе манипулировать объектами с произвольными типами. Типичное использование заключается в том, чтобы взять значение со статическим типом interface{} и извлечь его динамическую информацию о типе, вызвав TypeOf, который возвращает Type.
Вызов ValueOf возвращает Value, представляющее данные во время выполнения. Zero принимает Type и возвращает Value, представляющее нулевое значение для этого типа.
См. "Законы рефлексии" для введения в рефлексию в Go: https://golang.org/doc/articles/laws_of_reflection.html
Индекс
Примеры
Файлы пакета
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/