reflect

Imports

Imports #

"internal/abi"
"unsafe"
"unsafe"
"iter"
"internal/abi"
"internal/goarch"
"internal/unsafeheader"
"unsafe"
"internal/abi"
"internal/goarch"
"unsafe"
"internal/abi"
"internal/race"
"internal/runtime/maps"
"internal/runtime/sys"
"unsafe"
"internal/abi"
"internal/goarch"
"runtime"
"strconv"
"sync"
"unicode"
"unicode/utf8"
"unsafe"
"errors"
"internal/abi"
"internal/goarch"
"internal/itoa"
"internal/unsafeheader"
"math"
"runtime"
"unsafe"
"arena"
"internal/bytealg"
"unsafe"
"internal/abi"
"internal/goarch"
"unsafe"
"internal/abi"
"unsafe"
_ "unsafe"

Constants & Variables

Array const #

const Array

Bool const #

const Bool

BothDir const #

const BothDir = *ast.BinaryExpr

Chan const #

const Chan

Complex128 const #

const Complex128

Complex64 const #

const Complex64

Float32 const #

const Float32

Float64 const #

const Float64

Func const #

const Func

Int const #

const Int

Int16 const #

const Int16

Int32 const #

const Int32

Int64 const #

const Int64

Int8 const #

const Int8

Interface const #

const Interface

Invalid const #

const Invalid Kind = iota

Map const #

const Map

Pointer const #

const Pointer

Ptr const #

Ptr is the old name for the [Pointer] kind.

const Ptr = Pointer

RecvDir const #

const RecvDir ChanDir = *ast.BinaryExpr

SelectDefault const #

const SelectDefault

SelectRecv const #

const SelectRecv

SelectSend const #

const SelectSend

SendDir const #

const SendDir

Slice const #

const Slice

String const #

const String

Struct const #

const Struct

Uint const #

const Uint

Uint16 const #

const Uint16

Uint32 const #

const Uint32

Uint64 const #

const Uint64

Uint8 const #

const Uint8

Uintptr const #

const Uintptr

UnsafePointer const #

const UnsafePointer

_ const #

const _ SelectDir = iota

abiStepBad const #

const abiStepBad abiStepKind = iota

abiStepFloatReg const #

const abiStepFloatReg

abiStepIntReg const #

const abiStepIntReg

abiStepPointer const #

const abiStepPointer

abiStepStack const #

const abiStepStack

bytesType var #

var bytesType = *ast.CallExpr

callGC var #

var callGC bool

debugReflectCall const #

const debugReflectCall = false

dummy var #

var dummy struct{...}

flagAddr const #

const flagAddr flag = *ast.BinaryExpr

flagEmbedRO const #

const flagEmbedRO flag = *ast.BinaryExpr

flagIndir const #

const flagIndir flag = *ast.BinaryExpr

flagKindMask const #

const flagKindMask flag = *ast.BinaryExpr

flagKindWidth const #

const flagKindWidth = 5

flagMethod const #

const flagMethod flag = *ast.BinaryExpr

flagMethodShift const #

const flagMethodShift = 10

flagRO const #

const flagRO flag = *ast.BinaryExpr

flagStickyRO const #

const flagStickyRO flag = *ast.BinaryExpr

floatArgRegs var #

These variables are used by the register assignment algorithm in this file. They should be modified with care (no other reflect code may be executing) and are generally only modified when testing this package. They should never be set higher than their internal/abi constant counterparts, because the system relies on a structure that is at least large enough to hold the registers the system supports. Currently they're set to zero because using the actual constants will break every part of the toolchain that uses reflect to call functions (e.g. go test, or anything that uses text/template). The values that are currently commented out there should be the actual values once we're ready to use the register ABI everywhere.

var floatArgRegs = abi.FloatArgRegs

floatRegSize var #

These variables are used by the register assignment algorithm in this file. They should be modified with care (no other reflect code may be executing) and are generally only modified when testing this package. They should never be set higher than their internal/abi constant counterparts, because the system relies on a structure that is at least large enough to hold the registers the system supports. Currently they're set to zero because using the actual constants will break every part of the toolchain that uses reflect to call functions (e.g. go test, or anything that uses text/template). The values that are currently commented out there should be the actual values once we're ready to use the register ABI everywhere.

var floatRegSize = *ast.CallExpr

funcLookupCache var #

The funcLookupCache caches FuncOf lookups. FuncOf does not share the common lookupCache since cacheKey is not sufficient to represent functions unambiguously.

var funcLookupCache struct{...}

funcTypes var #

var funcTypes []Type

funcTypesMutex var #

var funcTypesMutex sync.Mutex

intArgRegs var #

These variables are used by the register assignment algorithm in this file. They should be modified with care (no other reflect code may be executing) and are generally only modified when testing this package. They should never be set higher than their internal/abi constant counterparts, because the system relies on a structure that is at least large enough to hold the registers the system supports. Currently they're set to zero because using the actual constants will break every part of the toolchain that uses reflect to call functions (e.g. go test, or anything that uses text/template). The values that are currently commented out there should be the actual values once we're ready to use the register ABI everywhere.

var intArgRegs = abi.IntArgRegs

kindNames var #

var kindNames = []string{...}

layoutCache var #

var layoutCache sync.Map

lookupCache var #

The lookupCache caches ArrayOf, ChanOf, MapOf and SliceOf lookups.

var lookupCache sync.Map

ptrMap var #

ptrMap is the cache for PointerTo.

var ptrMap sync.Map

stringType var #

var stringType = *ast.CallExpr

stringType var #

var stringType = *ast.CallExpr

structLookupCache var #

The structLookupCache caches StructOf lookups. StructOf does not share the common lookupCache since we need to pin the memory associated with *structTypeFixedN.

var structLookupCache struct{...}

uint8Type var #

var uint8Type = *ast.CallExpr

zeroVal var #

go:linkname zeroVal runtime.zeroVal

var zeroVal [abi.ZeroValSize]byte

Type Aliases

ChanDir type #

ChanDir represents a channel type's direction.

type ChanDir int

Kind type #

A Kind represents the specific kind of type that a [Type] represents. The zero Kind is not a valid kind.

type Kind uint

SelectDir type #

A SelectDir describes the communication direction of a select case.

type SelectDir int

StructTag type #

A StructTag is the tag string in a struct field. By convention, tag strings are a concatenation of optionally space-separated key:"value" pairs. Each key is a non-empty string consisting of non-control characters other than space (U+0020 ' '), quote (U+0022 '"'), and colon (U+003A ':'). Each value is quoted using U+0022 '"' characters and Go string literal syntax.

type StructTag string

aNameOff type #

type aNameOff abi.NameOff

aTextOff type #

type aTextOff abi.TextOff

aTypeOff type #

type aTypeOff abi.TypeOff

abiStepKind type #

abiStepKind is the "op-code" for an abiStep instruction.

type abiStepKind int

arrayType type #

arrayType represents a fixed array type.

type arrayType abi.ArrayType

chanType type #

chanType represents a channel type.

type chanType abi.ChanType

flag type #

type flag uintptr

funcType type #

funcType represents a function type. A *rtype for each in and out parameter is stored in an array that directly follows the funcType (and possibly its uncommonType). So a function type with one method, one input, and one output is: struct { funcType uncommonType [2]*rtype // [0] is in, [1] is out }

type funcType abi.FuncType

hiter type #

TODO(prattmic): only for sharing the linkname declarations with old maps. Remove with old maps.

type hiter maps.Iter

mapType type #

mapType represents a map type. TODO(prattmic): Only used within this file, could be cleaned up.

type mapType abi.SwissMapType

structField type #

Struct field

type structField abi.StructField

uncommonType type #

uncommonType is present only for defined types or types with methods (if T is a defined type, the uncommonTypes for T and *T have methods). Using a pointer to this struct reduces the overall size required to describe a non-defined type with no methods.

type uncommonType abi.UncommonType

Interfaces

Type interface #

Type is the representation of a Go type. Not all methods apply to all kinds of types. Restrictions, if any, are noted in the documentation for each method. Use the Kind method to find out the kind of type before calling kind-specific methods. Calling a method inappropriate to the kind of type causes a run-time panic. Type values are comparable, such as with the == operator, so they can be used as map keys. Two Type values are equal if they represent identical types.

type Type interface {
Align() int
FieldAlign() int
Method(int) Method
MethodByName(string) (Method, bool)
NumMethod() int
Name() string
PkgPath() string
Size() uintptr
String() string
Kind() Kind
Implements(u Type) bool
AssignableTo(u Type) bool
ConvertibleTo(u Type) bool
Comparable() bool
Bits() int
ChanDir() ChanDir
IsVariadic() bool
Elem() Type
Field(i int) StructField
FieldByIndex(index []int) StructField
FieldByName(name string) (StructField, bool)
FieldByNameFunc(match func(string) bool) (StructField, bool)
In(i int) Type
Key() Type
Len() int
NumField() int
NumIn() int
NumOut() int
Out(i int) Type
OverflowComplex(x complex128) bool
OverflowFloat(x float64) bool
OverflowInt(x int64) bool
OverflowUint(x uint64) bool
CanSeq() bool
CanSeq2() bool
common() *abi.Type
uncommon() *uncommonType
}

Structs

MapIter struct #

A MapIter is an iterator for ranging over a map. See [Value.MapRange].

type MapIter struct {
m Value
hiter maps.Iter
}

MapIter struct #

A MapIter is an iterator for ranging over a map. See [Value.MapRange].

type MapIter struct {
m Value
hiter hiter
}

Method struct #

Method represents a single method.

type Method struct {
Name string
PkgPath string
Type Type
Func Value
Index int
}

SelectCase struct #

A SelectCase describes a single case in a select operation. The kind of case depends on Dir, the communication direction. If Dir is SelectDefault, the case represents a default case. Chan and Send must be zero Values. If Dir is SelectSend, the case represents a send operation. Normally Chan's underlying value must be a channel, and Send's underlying value must be assignable to the channel's element type. As a special case, if Chan is a zero Value, then the case is ignored, and the field Send will also be ignored and may be either zero or non-zero. If Dir is [SelectRecv], the case represents a receive operation. Normally Chan's underlying value must be a channel and Send must be a zero Value. If Chan is a zero Value, then the case is ignored, but Send must still be a zero Value. When a receive operation is selected, the received Value is returned by Select.

type SelectCase struct {
Dir SelectDir
Chan Value
Send Value
}

SliceHeader struct #

SliceHeader is the runtime representation of a slice. It cannot be used safely or portably and its representation may change in a later release. Moreover, the Data field is not sufficient to guarantee the data it references will not be garbage collected, so programs must keep a separate, correctly typed pointer to the underlying data. Deprecated: Use unsafe.Slice or unsafe.SliceData instead.

type SliceHeader struct {
Data uintptr
Len int
Cap int
}

StringHeader struct #

StringHeader is the runtime representation of a string. It cannot be used safely or portably and its representation may change in a later release. Moreover, the Data field is not sufficient to guarantee the data it references will not be garbage collected, so programs must keep a separate, correctly typed pointer to the underlying data. Deprecated: Use unsafe.String or unsafe.StringData instead.

type StringHeader struct {
Data uintptr
Len int
}

StructField struct #

A StructField describes a single field in a struct.

type StructField struct {
Name string
PkgPath string
Type Type
Tag StructTag
Offset uintptr
Index []int
Anonymous bool
}

Value struct #

Value is the reflection interface to a Go value. Not all methods apply to all kinds of values. Restrictions, if any, are noted in the documentation for each method. Use the Kind method to find out the kind of value before calling kind-specific methods. Calling a method inappropriate to the kind of type causes a run time panic. The zero Value represents no value. Its [Value.IsValid] method returns false, its Kind method returns [Invalid], its String method returns "", and all other methods panic. Most functions and methods never return an invalid value. If one does, its documentation states the conditions explicitly. A Value can be used concurrently by multiple goroutines provided that the underlying Go value can be used concurrently for the equivalent direct operations. To compare two Values, compare the results of the Interface method. Using == on two Values does not compare the underlying values they represent.

type Value struct {
typ_ *abi.Type
ptr unsafe.Pointer
flag
}

ValueError struct #

A ValueError occurs when a Value method is invoked on a [Value] that does not support it. Such cases are documented in the description of each method.

type ValueError struct {
Method string
Kind Kind
}

abiDesc struct #

abiDesc describes the ABI for a function or method.

type abiDesc struct {
call abiSeq
ret abiSeq
stackCallArgsSize uintptr
retOffset uintptr
spill uintptr
stackPtrs *bitVector
inRegPtrs abi.IntArgRegBitmap
outRegPtrs abi.IntArgRegBitmap
}

abiSeq struct #

abiSeq represents a sequence of ABI instructions for copying from a series of reflect.Values to a call frame (for call arguments) or vice-versa (for call results). An abiSeq should be populated by calling its addArg method.

type abiSeq struct {
steps []abiStep
valueStart []int
stackBytes uintptr
iregs int
fregs int
}

abiStep struct #

abiStep represents an ABI "instruction." Each instruction describes one part of how to translate between a Go value in memory and a call frame.

type abiStep struct {
kind abiStepKind
offset uintptr
size uintptr
stkOff uintptr
ireg int
freg int
}

bitVector struct #

Note: this type must agree with runtime.bitvector.

type bitVector struct {
n uint32
data []byte
}

cacheKey struct #

A cacheKey is the key for use in the lookupCache. Four values describe any of the types we are looking for: type kind, one or two subtypes, and an extra integer.

type cacheKey struct {
kind Kind
t1 *abi.Type
t2 *abi.Type
extra uintptr
}

common struct #

Embed this type to get common/uncommon

type common struct {
abi.Type
}

fieldScan struct #

A fieldScan represents an item on the fieldByNameFunc scan work list.

type fieldScan struct {
typ *structType
index []int
}

hiter struct #

hiter's structure matches runtime.hiter's structure. Having a clone here allows us to embed a map iterator inside type MapIter so that MapIters can be re-used without doing any allocations.

type hiter struct {
key unsafe.Pointer
elem unsafe.Pointer
t unsafe.Pointer
h unsafe.Pointer
buckets unsafe.Pointer
bptr unsafe.Pointer
overflow *[]unsafe.Pointer
oldoverflow *[]unsafe.Pointer
startBucket uintptr
offset uint8
wrapped bool
B uint8
i uint8
bucket uintptr
checkBucket uintptr
clearSeq uint64
}

interfaceType struct #

interfaceType represents an interface type.

type interfaceType struct {
abi.InterfaceType
}

layoutKey struct #

type layoutKey struct {
ftyp *funcType
rcvr *abi.Type
}

layoutType struct #

type layoutType struct {
t *abi.Type
framePool *sync.Pool
abid abiDesc
}

makeFuncCtxt struct #

This structure must be kept in sync with runtime.reflectMethodValue. Any changes should be reflected in all both.

type makeFuncCtxt struct {
fn uintptr
stack *bitVector
argLen uintptr
regPtrs abi.IntArgRegBitmap
}

makeFuncImpl struct #

makeFuncImpl is the closure value implementing the function returned by MakeFunc. The first three words of this type must be kept in sync with methodValue and runtime.reflectMethodValue. Any changes should be reflected in all three.

type makeFuncImpl struct {
makeFuncCtxt
ftyp *funcType
fn func([]Value) []Value
}

mapType struct #

mapType represents a map type.

type mapType struct {
abi.OldMapType
}

methodValue struct #

The first 3 words of this type must be kept in sync with makeFuncImpl and runtime.reflectMethodValue. Any changes should be reflected in all three.

type methodValue struct {
makeFuncCtxt
method int
rcvr Value
}

nonEmptyInterface struct #

nonEmptyInterface is the header for an interface value with methods.

type nonEmptyInterface struct {
itab *abi.ITab
word unsafe.Pointer
}

ptrType struct #

ptrType represents a pointer type.

type ptrType struct {
abi.PtrType
}

rtype struct #

rtype is the common implementation of most values. It is embedded in other struct types.

type rtype struct {
t abi.Type
}

runtimeSelect struct #

A runtimeSelect is a single case passed to rselect. This must match ../runtime/select.go:/runtimeSelect

type runtimeSelect struct {
dir SelectDir
typ *rtype
ch unsafe.Pointer
val unsafe.Pointer
}

sliceType struct #

sliceType represents a slice type.

type sliceType struct {
abi.SliceType
}

structType struct #

structType represents a struct type.

type structType struct {
abi.StructType
}

structTypeUncommon struct #

type structTypeUncommon struct {
structType
u uncommonType
}

visibleFieldsWalker struct #

type visibleFieldsWalker struct {
byName map[string]int
visiting map[Type]bool
fields []StructField
index []int
}

visit struct #

During deepValueEqual, must keep track of checks that are in progress. The comparison algorithm assumes that all checks in progress are true when it reencounters them. Visited comparisons are stored in a map indexed by visit.

type visit struct {
a1 unsafe.Pointer
a2 unsafe.Pointer
typ Type
}

Functions

Addr method #

Addr returns a pointer value representing the address of v. It panics if [Value.CanAddr] returns false. Addr is typically used to obtain a pointer to a struct field or slice element in order to call a method that requires a pointer receiver.

func (v Value) Addr() Value

Align method #

func (t *rtype) Align() int

Append function #

Append appends the values x to a slice s and returns the resulting slice. As in Go, each x's value must be assignable to the slice's element type.

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

AppendSlice function #

AppendSlice appends a slice t to a slice s and returns the resulting slice. The slices s and t must have the same element type.

func AppendSlice(s Value, t Value) Value

ArenaNew function #

ArenaNew returns a [Value] representing a pointer to a new zero value for the specified type, allocating storage for it in the provided arena. That is, the returned Value's Type is [PointerTo](typ).

func ArenaNew(a *arena.Arena, typ Type) Value

ArrayOf function #

ArrayOf returns the array type with the given length and element type. For example, if t represents int, ArrayOf(5, t) represents [5]int. If the resulting type would be larger than the available address space, ArrayOf panics.

func ArrayOf(length int, elem Type) Type

AssignableTo method #

func (t *rtype) AssignableTo(u Type) bool

Bits method #

func (t *rtype) Bits() int

Bool method #

Bool returns v's underlying value. It panics if v's kind is not [Bool].

func (v Value) Bool() bool

Bytes method #

Bytes returns v's underlying value. It panics if v's underlying value is not a slice of bytes or an addressable array of bytes.

func (v Value) Bytes() []byte

Call method #

Call calls the function v with the input arguments in. For example, if len(in) == 3, v.Call(in) represents the Go call v(in[0], in[1], in[2]). Call panics if v's Kind is not [Func]. It returns the output results as Values. As in Go, each input argument must be assignable to the type of the function's corresponding input parameter. If v is a variadic function, Call creates the variadic slice parameter itself, copying in the corresponding values.

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

CallSlice method #

CallSlice calls the variadic function v with the input arguments in, assigning the slice in[len(in)-1] to v's final variadic argument. For example, if len(in) == 3, v.CallSlice(in) represents the Go call v(in[0], in[1], in[2]...). CallSlice panics if v's Kind is not [Func] or if v is not variadic. It returns the output results as Values. As in Go, each input argument must be assignable to the type of the function's corresponding input parameter.

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

CanAddr method #

CanAddr reports whether the value's address can be obtained with [Value.Addr]. Such values are called addressable. A value is addressable if it is an element of a slice, an element of an addressable array, a field of an addressable struct, or the result of dereferencing a pointer. If CanAddr returns false, calling [Value.Addr] will panic.

func (v Value) CanAddr() bool

CanComplex method #

CanComplex reports whether [Value.Complex] can be used without panicking.

func (v Value) CanComplex() bool

CanConvert method #

CanConvert reports whether the value v can be converted to type t. If v.CanConvert(t) returns true then v.Convert(t) will not panic.

func (v Value) CanConvert(t Type) bool

CanFloat method #

CanFloat reports whether [Value.Float] can be used without panicking.

func (v Value) CanFloat() bool

CanInt method #

CanInt reports whether Int can be used without panicking.

func (v Value) CanInt() bool

CanInterface method #

CanInterface reports whether [Value.Interface] can be used without panicking.

func (v Value) CanInterface() bool

CanSeq method #

func (t *rtype) CanSeq() bool

CanSeq2 method #

func (t *rtype) CanSeq2() bool

CanSet method #

CanSet reports whether the value of v can be changed. A [Value] can be changed only if it is addressable and was not obtained by the use of unexported struct fields. If CanSet returns false, calling [Value.Set] or any type-specific setter (e.g., [Value.SetBool], [Value.SetInt]) will panic.

func (v Value) CanSet() bool

CanUint method #

CanUint reports whether [Value.Uint] can be used without panicking.

func (v Value) CanUint() bool

Cap method #

Cap returns v's capacity. It panics if v's Kind is not [Array], [Chan], [Slice] or pointer to [Array].

func (v Value) Cap() int

ChanDir method #

func (t *rtype) ChanDir() ChanDir

ChanOf function #

ChanOf returns the channel type with the given direction and element type. For example, if t represents int, ChanOf(RecvDir, t) represents <-chan int. The gc runtime imposes a limit of 64 kB on channel element types. If t's size is equal to or exceeds this limit, ChanOf panics.

func ChanOf(dir ChanDir, t Type) Type

Clear method #

Clear clears the contents of a map or zeros the contents of a slice. It panics if v's Kind is not [Map] or [Slice].

func (v Value) Clear()

Close method #

Close closes the channel v. It panics if v's Kind is not [Chan] or v is a receive-only channel.

func (v Value) Close()

Comparable method #

func (t *rtype) Comparable() bool

Comparable method #

Comparable reports whether the value v is comparable. If the type of v is an interface, this checks the dynamic type. If this reports true then v.Interface() == x will not panic for any x, nor will v.Equal(u) for any Value u.

func (v Value) Comparable() bool

Complex method #

Complex returns v's underlying value, as a complex128. It panics if v's Kind is not [Complex64] or [Complex128]

func (v Value) Complex() complex128

Convert method #

Convert returns the value v converted to type t. If the usual Go conversion rules do not allow conversion of the value v to type t, or if converting v to type t panics, Convert panics.

func (v Value) Convert(t Type) Value

ConvertibleTo method #

func (t *rtype) ConvertibleTo(u Type) bool

Copy function #

Copy copies the contents of src into dst until either dst has been filled or src has been exhausted. It returns the number of elements copied. Dst and src each must have kind [Slice] or [Array], and dst and src must have the same element type. It dst is an [Array], it panics if [Value.CanSet] returns false. As a special case, src can have kind [String] if the element type of dst is kind [Uint8].

func Copy(dst Value, src Value) int

DeepEqual function #

DeepEqual reports whether x and y are “deeply equal,” defined as follows. Two values of identical type are deeply equal if one of the following cases applies. Values of distinct types are never deeply equal. Array values are deeply equal when their corresponding elements are deeply equal. Struct values are deeply equal if their corresponding fields, both exported and unexported, are deeply equal. Func values are deeply equal if both are nil; otherwise they are not deeply equal. Interface values are deeply equal if they hold deeply equal concrete values. Map values are deeply equal when all of the following are true: they are both nil or both non-nil, they have the same length, and either they are the same map object or their corresponding keys (matched using Go equality) map to deeply equal values. Pointer values are deeply equal if they are equal using Go's == operator or if they point to deeply equal values. Slice values are deeply equal when all of the following are true: they are both nil or both non-nil, they have the same length, and either they point to the same initial entry of the same underlying array (that is, &x[0] == &y[0]) or their corresponding elements (up to length) are deeply equal. Note that a non-nil empty slice and a nil slice (for example, []byte{} and []byte(nil)) are not deeply equal. Other values - numbers, bools, strings, and channels - are deeply equal if they are equal using Go's == operator. In general DeepEqual is a recursive relaxation of Go's == operator. However, this idea is impossible to implement without some inconsistency. Specifically, it is possible for a value to be unequal to itself, either because it is of func type (uncomparable in general) or because it is a floating-point NaN value (not equal to itself in floating-point comparison), or because it is an array, struct, or interface containing such a value. On the other hand, pointer values are always equal to themselves, even if they point at or contain such problematic values, because they compare equal using Go's == operator, and that is a sufficient condition to be deeply equal, regardless of content. DeepEqual has been defined so that the same short-cut applies to slices and maps: if x and y are the same slice or the same map, they are deeply equal regardless of content. As DeepEqual traverses the data values it may find a cycle. The second and subsequent times that DeepEqual compares two pointer values that have been compared before, it treats the values as equal rather than examining the values to which they point. This ensures that DeepEqual terminates.

func DeepEqual(x any, y any) bool

Elem method #

Elem returns the value that the interface v contains or that the pointer v points to. It panics if v's Kind is not [Interface] or [Pointer]. It returns the zero Value if v is nil.

func (v Value) Elem() Value

Elem method #

func (t *rtype) Elem() Type

Equal method #

Equal reports true if v is equal to u. For two invalid values, Equal will report true. For an interface value, Equal will compare the value within the interface. Otherwise, If the values have different types, Equal will report false. Otherwise, for arrays and structs Equal will compare each element in order, and report false if it finds non-equal elements. During all comparisons, if values of the same type are compared, and the type is not comparable, Equal will panic.

func (v Value) Equal(u Value) bool

Error method #

func (e *ValueError) Error() string

Field method #

Field returns the i'th field of the struct v. It panics if v's Kind is not [Struct] or i is out of range.

func (v Value) Field(i int) Value

Field method #

func (t *rtype) Field(i int) StructField

Field method #

Field returns the i'th struct field.

func (t *structType) Field(i int) (f StructField)

FieldAlign method #

func (t *rtype) FieldAlign() int

FieldByIndex method #

func (t *rtype) FieldByIndex(index []int) StructField

FieldByIndex method #

FieldByIndex returns the nested field corresponding to index. It panics if evaluation requires stepping through a nil pointer or a field that is not a struct.

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

FieldByIndex method #

FieldByIndex returns the nested field corresponding to index.

func (t *structType) FieldByIndex(index []int) (f StructField)

FieldByIndexErr method #

FieldByIndexErr returns the nested field corresponding to index. It returns an error if evaluation requires stepping through a nil pointer, but panics if it must step through a field that is not a struct.

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

FieldByName method #

FieldByName returns the struct field with the given name and a boolean to indicate if the field was found.

func (t *structType) FieldByName(name string) (f StructField, present bool)

FieldByName method #

func (t *rtype) FieldByName(name string) (StructField, bool)

FieldByName method #

FieldByName returns the struct field with the given name. It returns the zero Value if no field was found. It panics if v's Kind is not [Struct].

func (v Value) FieldByName(name string) Value

FieldByNameFunc method #

FieldByNameFunc returns the struct field with a name that satisfies the match function and a boolean to indicate if the field was found.

func (t *structType) FieldByNameFunc(match func(string) bool) (result StructField, ok bool)

FieldByNameFunc method #

FieldByNameFunc returns the struct field with a name that satisfies the match function. It panics if v's Kind is not [Struct]. It returns the zero Value if no field was found.

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

FieldByNameFunc method #

func (t *rtype) FieldByNameFunc(match func(string) bool) (StructField, bool)

Float method #

Float returns v's underlying value, as a float64. It panics if v's Kind is not [Float32] or [Float64]

func (v Value) Float() float64

FuncOf function #

FuncOf returns the function type with the given argument and result types. For example if k represents int and e represents string, FuncOf([]Type{k}, []Type{e}, false) represents func(int) string. The variadic argument controls whether the function is variadic. FuncOf panics if the in[len(in)-1] does not represent a slice and variadic is true.

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

Get method #

Get returns the value associated with key in the tag string. If there is no such key in the tag, Get returns the empty string. If the tag does not have the conventional format, the value returned by Get is unspecified. To determine whether a tag is explicitly set to the empty string, use [StructTag.Lookup].

func (tag StructTag) Get(key string) string

Grow method #

Grow increases the slice's capacity, if necessary, to guarantee space for another n elements. After Grow(n), at least n elements can be appended to the slice without another allocation. It panics if v's Kind is not a [Slice], or if n is negative or too large to allocate the memory, or if [Value.CanSet] returns false.

func (v Value) Grow(n int)

Implements method #

func (t *rtype) Implements(u Type) bool

In method #

func (t *rtype) In(i int) Type

Index method #

Index returns v's i'th element. It panics if v's Kind is not [Array], [Slice], or [String] or i is out of range.

func (v Value) Index(i int) Value

Indirect function #

Indirect returns the value that v points to. If v is a nil pointer, Indirect returns a zero Value. If v is not a pointer, Indirect returns v.

func Indirect(v Value) Value

Int method #

Int returns v's underlying value, as an int64. It panics if v's Kind is not [Int], [Int8], [Int16], [Int32], or [Int64].

func (v Value) Int() int64

Interface method #

Interface returns v's current value as an interface{}. It is equivalent to: var i interface{} = (v's underlying value) It panics if the Value was obtained by accessing unexported struct fields.

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

InterfaceData method #

InterfaceData returns a pair of unspecified uintptr values. It panics if v's Kind is not Interface. In earlier versions of Go, this function returned the interface's value as a uintptr pair. As of Go 1.4, the implementation of interface values precludes any defined use of InterfaceData. Deprecated: The memory representation of interface values is not compatible with InterfaceData.

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

IsExported method #

IsExported reports whether the field is exported.

func (f StructField) IsExported() bool

IsExported method #

IsExported reports whether the method is exported.

func (m Method) IsExported() bool

IsNil method #

IsNil reports whether its argument v is nil. The argument must be a chan, func, interface, map, pointer, or slice value; if it is not, IsNil panics. Note that IsNil is not always equivalent to a regular comparison with nil in Go. For example, if v was created by calling [ValueOf] with an uninitialized interface variable i, i==nil will be true but v.IsNil will panic as v will be the zero Value.

func (v Value) IsNil() bool

IsValid method #

IsValid reports whether v represents a value. It returns false if v is the zero Value. If [Value.IsValid] returns false, all other methods except String panic. Most functions and methods never return an invalid Value. If one does, its documentation states the conditions explicitly.

func (v Value) IsValid() bool

IsVariadic method #

func (t *rtype) IsVariadic() bool

IsZero method #

IsZero reports whether v is the zero value for its type. It panics if the argument is invalid.

func (v Value) IsZero() bool

Key method #

Key returns the key of iter's current map entry.

func (iter *MapIter) Key() Value

Key method #

func (t *rtype) Key() Type

Key method #

func (t *rtype) Key() Type

Key method #

Key returns the key of iter's current map entry.

func (iter *MapIter) Key() Value

Kind method #

Kind returns v's Kind. If v is the zero Value ([Value.IsValid] returns false), Kind returns Invalid.

func (v Value) Kind() Kind

Kind method #

func (t *rtype) Kind() Kind

Len method #

Len returns v's length. It panics if v's Kind is not [Array], [Chan], [Map], [Slice], [String], or pointer to [Array].

func (v Value) Len() int

Len method #

func (t *rtype) Len() int

Lookup method #

Lookup returns the value associated with key in the tag string. If the key is present in the tag the value (which may be empty) is returned. Otherwise the returned value will be the empty string. The ok return value reports whether the value was explicitly set in the tag string. If the tag does not have the conventional format, the value returned by Lookup is unspecified.

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

MakeChan function #

MakeChan creates a new channel with the specified type and buffer size.

func MakeChan(typ Type, buffer int) Value

MakeFunc function #

MakeFunc returns a new function of the given [Type] that wraps the function fn. When called, that new function does the following: - converts its arguments to a slice of Values. - runs results := fn(args). - returns the results as a slice of Values, one per formal result. The implementation fn can assume that the argument [Value] slice has the number and type of arguments given by typ. If typ describes a variadic function, the final Value is itself a slice representing the variadic arguments, as in the body of a variadic function. The result Value slice returned by fn must have the number and type of results given by typ. The [Value.Call] method allows the caller to invoke a typed function in terms of Values; in contrast, MakeFunc allows the caller to implement a typed function in terms of Values. The Examples section of the documentation includes an illustration of how to use MakeFunc to build a swap function for different types.

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

MakeMap function #

MakeMap creates a new map with the specified type.

func MakeMap(typ Type) Value

MakeMapWithSize function #

MakeMapWithSize creates a new map with the specified type and initial space for approximately n elements.

func MakeMapWithSize(typ Type, n int) Value

MakeSlice function #

MakeSlice creates a new zero-initialized slice value for the specified slice type, length, and capacity.

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

MapIndex method #

MapIndex returns the value associated with key in the map v. It panics if v's Kind is not [Map]. It returns the zero Value if key is not found in the map or if v represents a nil map. As in Go, the key's value must be assignable to the map's key type.

func (v Value) MapIndex(key Value) Value

MapIndex method #

MapIndex returns the value associated with key in the map v. It panics if v's Kind is not [Map]. It returns the zero Value if key is not found in the map or if v represents a nil map. As in Go, the key's value must be assignable to the map's key type.

func (v Value) MapIndex(key Value) Value

MapKeys method #

MapKeys returns a slice containing all the keys present in the map, in unspecified order. It panics if v's Kind is not [Map]. It returns an empty slice if v represents a nil map.

func (v Value) MapKeys() []Value

MapKeys method #

MapKeys returns a slice containing all the keys present in the map, in unspecified order. It panics if v's Kind is not [Map]. It returns an empty slice if v represents a nil map.

func (v Value) MapKeys() []Value

MapOf function #

MapOf returns the map type with the given key and element types. For example, if k represents int and e represents string, MapOf(k, e) represents map[int]string. If the key type is not a valid map key type (that is, if it does not implement Go's == operator), MapOf panics.

func MapOf(key Type, elem Type) Type

MapOf function #

MapOf returns the map type with the given key and element types. For example, if k represents int and e represents string, MapOf(k, e) represents map[int]string. If the key type is not a valid map key type (that is, if it does not implement Go's == operator), MapOf panics.

func MapOf(key Type, elem Type) Type

MapRange method #

MapRange returns a range iterator for a map. It panics if v's Kind is not [Map]. Call [MapIter.Next] to advance the iterator, and [MapIter.Key]/[MapIter.Value] to access each entry. [MapIter.Next] returns false when the iterator is exhausted. MapRange follows the same iteration semantics as a range statement. Example: iter := reflect.ValueOf(m).MapRange() for iter.Next() { k := iter.Key() v := iter.Value() ... }

func (v Value) MapRange() *MapIter

MapRange method #

MapRange returns a range iterator for a map. It panics if v's Kind is not [Map]. Call [MapIter.Next] to advance the iterator, and [MapIter.Key]/[MapIter.Value] to access each entry. [MapIter.Next] returns false when the iterator is exhausted. MapRange follows the same iteration semantics as a range statement. Example: iter := reflect.ValueOf(m).MapRange() for iter.Next() { k := iter.Key() v := iter.Value() ... }

func (v Value) MapRange() *MapIter

Method method #

func (t *rtype) Method(i int) (m Method)

Method method #

Method returns the i'th method in the type's method set.

func (t *interfaceType) Method(i int) (m Method)

Method method #

Method returns a function value corresponding to v's i'th method. The arguments to a Call on the returned function should not include a receiver; the returned function will always use v as the receiver. Method panics if i is out of range or if v is a nil interface value.

func (v Value) Method(i int) Value

MethodByName method #

MethodByName returns a function value corresponding to the method of v with the given name. The arguments to a Call on the returned function should not include a receiver; the returned function will always use v as the receiver. It returns the zero Value if no method was found.

func (v Value) MethodByName(name string) Value

MethodByName method #

func (t *rtype) MethodByName(name string) (m Method, ok bool)

MethodByName method #

MethodByName method with the given name in the type's method set.

func (t *interfaceType) MethodByName(name string) (m Method, ok bool)

Name method #

func (t *rtype) Name() string

New function #

New returns a Value representing a pointer to a new zero value for the specified type. That is, the returned Value's Type is [PointerTo](typ).

func New(typ Type) Value

NewAt function #

NewAt returns a Value representing a pointer to a value of the specified type, using p as that pointer.

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

Next method #

Next advances the map iterator and reports whether there is another entry. It returns false when iter is exhausted; subsequent calls to [MapIter.Key], [MapIter.Value], or [MapIter.Next] will panic.

func (iter *MapIter) Next() bool

Next method #

Next advances the map iterator and reports whether there is another entry. It returns false when iter is exhausted; subsequent calls to [MapIter.Key], [MapIter.Value], or [MapIter.Next] will panic.

func (iter *MapIter) Next() bool

NumField method #

NumField returns the number of fields in the struct v. It panics if v's Kind is not [Struct].

func (v Value) NumField() int

NumField method #

func (t *rtype) NumField() int

NumIn method #

func (t *rtype) NumIn() int

NumMethod method #

NumMethod returns the number of methods in the value's method set. 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.

func (v Value) NumMethod() int

NumMethod method #

func (t *rtype) NumMethod() int

NumMethod method #

NumMethod returns the number of interface methods in the type's method set.

func (t *interfaceType) NumMethod() int

NumOut method #

func (t *rtype) NumOut() int

Out method #

func (t *rtype) Out(i int) Type

OverflowComplex method #

func (t *rtype) OverflowComplex(x complex128) bool

OverflowComplex method #

OverflowComplex reports whether the complex128 x cannot be represented by v's type. It panics if v's Kind is not [Complex64] or [Complex128].

func (v Value) OverflowComplex(x complex128) bool

OverflowFloat method #

OverflowFloat reports whether the float64 x cannot be represented by v's type. It panics if v's Kind is not [Float32] or [Float64].

func (v Value) OverflowFloat(x float64) bool

OverflowFloat method #

func (t *rtype) OverflowFloat(x float64) bool

OverflowInt method #

func (t *rtype) OverflowInt(x int64) bool

OverflowInt method #

OverflowInt reports whether the int64 x cannot be represented by v's type. It panics if v's Kind is not [Int], [Int8], [Int16], [Int32], or [Int64].

func (v Value) OverflowInt(x int64) bool

OverflowUint method #

OverflowUint reports whether the uint64 x cannot be represented by v's type. It panics if v's Kind is not [Uint], [Uintptr], [Uint8], [Uint16], [Uint32], or [Uint64].

func (v Value) OverflowUint(x uint64) bool

OverflowUint method #

func (t *rtype) OverflowUint(x uint64) bool

PkgPath method #

func (t *rtype) PkgPath() string

Pointer method #

Pointer returns v's value as a uintptr. It panics if v's Kind is not [Chan], [Func], [Map], [Pointer], [Slice], [String], or [UnsafePointer]. If v's Kind is [Func], the returned pointer is an underlying code pointer, but not necessarily enough to identify a single function uniquely. The only guarantee is that the result is zero if and only if v is a nil func Value. If v's Kind is [Slice], the returned pointer is to the first element of the slice. If the slice is nil the returned value is 0. If the slice is empty but non-nil the return value is non-zero. If v's Kind is [String], the returned pointer is to the first element of the underlying bytes of string. It's preferred to use uintptr(Value.UnsafePointer()) to get the equivalent result.

func (v Value) Pointer() uintptr

PointerTo function #

PointerTo returns the pointer type with element t. For example, if t represents type Foo, PointerTo(t) represents *Foo.

func PointerTo(t Type) Type

PtrTo function #

PtrTo returns the pointer type with element t. For example, if t represents type Foo, PtrTo(t) represents *Foo. PtrTo is the old spelling of [PointerTo]. The two functions behave identically. Deprecated: Superseded by [PointerTo].

func PtrTo(t Type) Type

Recv method #

Recv receives and returns a value from the channel v. It panics if v's Kind is not [Chan]. The receive blocks until a value is ready. The boolean value ok is true if the value x corresponds to a send on the channel, false if it is a zero value received because the channel is closed.

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

Reset method #

Reset modifies iter to iterate over v. It panics if v's Kind is not [Map] and v is not the zero Value. Reset(Value{}) causes iter to not to refer to any map, which may allow the previously iterated-over map to be garbage collected.

func (iter *MapIter) Reset(v Value)

Reset method #

Reset modifies iter to iterate over v. It panics if v's Kind is not [Map] and v is not the zero Value. Reset(Value{}) causes iter to not to refer to any map, which may allow the previously iterated-over map to be garbage collected.

func (iter *MapIter) Reset(v Value)

Select function #

Select executes a select operation described by the list of cases. Like the Go select statement, it blocks until at least one of the cases can proceed, makes a uniform pseudo-random choice, and then executes that case. It returns the index of the chosen case and, if that case was a receive operation, the value received and a boolean indicating whether the value corresponds to a send on the channel (as opposed to a zero value received because the channel is closed). Select supports a maximum of 65536 cases.

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

Send method #

Send sends x on the channel v. It panics if v's kind is not [Chan] or if x's type is not the same type as v's element type. As in Go, x's value must be assignable to the channel's element type.

func (v Value) Send(x Value)

Seq method #

Seq returns an iter.Seq[Value] that loops over the elements of v. If v's kind is Func, it must be a function that has no results and that takes a single argument of type func(T) bool for some type T. If v's kind is Pointer, the pointer element type must have kind Array. Otherwise v's kind must be Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr, Array, Chan, Map, Slice, or String.

func (v Value) Seq() *ast.IndexExpr

Seq2 method #

Seq2 returns an iter.Seq2[Value, Value] that loops over the elements of v. If v's kind is Func, it must be a function that has no results and that takes a single argument of type func(K, V) bool for some type K, V. If v's kind is Pointer, the pointer element type must have kind Array. Otherwise v's kind must be Array, Map, Slice, or String.

func (v Value) Seq2() *ast.IndexListExpr

Set method #

Set assigns x to the value v. It panics if [Value.CanSet] returns false. As in Go, x's value must be assignable to v's type and must not be derived from an unexported field.

func (v Value) Set(x Value)

SetBool method #

SetBool sets v's underlying value. It panics if v's Kind is not [Bool] or if [Value.CanSet] returns false.

func (v Value) SetBool(x bool)

SetBytes method #

SetBytes sets v's underlying value. It panics if v's underlying value is not a slice of bytes or if [Value.CanSet] returns false.

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

SetCap method #

SetCap sets v's capacity to n. It panics if v's Kind is not [Slice], or if n is smaller than the length or greater than the capacity of the slice, or if [Value.CanSet] returns false.

func (v Value) SetCap(n int)

SetComplex method #

SetComplex sets v's underlying value to x. It panics if v's Kind is not [Complex64] or [Complex128], or if [Value.CanSet] returns false.

func (v Value) SetComplex(x complex128)

SetFloat method #

SetFloat sets v's underlying value to x. It panics if v's Kind is not [Float32] or [Float64], or if [Value.CanSet] returns false.

func (v Value) SetFloat(x float64)

SetInt method #

SetInt sets v's underlying value to x. It panics if v's Kind is not [Int], [Int8], [Int16], [Int32], or [Int64], or if [Value.CanSet] returns false.

func (v Value) SetInt(x int64)

SetIterKey method #

SetIterKey assigns to v the key of iter's current map entry. It is equivalent to v.Set(iter.Key()), but it avoids allocating a new Value. As in Go, the key must be assignable to v's type and must not be derived from an unexported field. It panics if [Value.CanSet] returns false.

func (v Value) SetIterKey(iter *MapIter)

SetIterKey method #

SetIterKey assigns to v the key of iter's current map entry. It is equivalent to v.Set(iter.Key()), but it avoids allocating a new Value. As in Go, the key must be assignable to v's type and must not be derived from an unexported field. It panics if [Value.CanSet] returns false.

func (v Value) SetIterKey(iter *MapIter)

SetIterValue method #

SetIterValue assigns to v the value of iter's current map entry. It is equivalent to v.Set(iter.Value()), but it avoids allocating a new Value. As in Go, the value must be assignable to v's type and must not be derived from an unexported field. It panics if [Value.CanSet] returns false.

func (v Value) SetIterValue(iter *MapIter)

SetIterValue method #

SetIterValue assigns to v the value of iter's current map entry. It is equivalent to v.Set(iter.Value()), but it avoids allocating a new Value. As in Go, the value must be assignable to v's type and must not be derived from an unexported field. It panics if [Value.CanSet] returns false.

func (v Value) SetIterValue(iter *MapIter)

SetLen method #

SetLen sets v's length to n. It panics if v's Kind is not [Slice], or if n is negative or greater than the capacity of the slice, or if [Value.CanSet] returns false.

func (v Value) SetLen(n int)

SetMapIndex method #

SetMapIndex sets the element associated with key in the map v to elem. It panics if v's Kind is not [Map]. If elem is the zero Value, SetMapIndex deletes the key from the map. Otherwise if v holds a nil map, SetMapIndex will panic. As in Go, key's elem must be assignable to the map's key type, and elem's value must be assignable to the map's elem type.

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

SetMapIndex method #

SetMapIndex sets the element associated with key in the map v to elem. It panics if v's Kind is not [Map]. If elem is the zero Value, SetMapIndex deletes the key from the map. Otherwise if v holds a nil map, SetMapIndex will panic. As in Go, key's elem must be assignable to the map's key type, and elem's value must be assignable to the map's elem type.

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

SetPointer method #

SetPointer sets the [unsafe.Pointer] value v to x. It panics if v's Kind is not [UnsafePointer] or if [Value.CanSet] returns false.

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

SetString method #

SetString sets v's underlying value to x. It panics if v's Kind is not [String] or if [Value.CanSet] returns false.

func (v Value) SetString(x string)

SetUint method #

SetUint sets v's underlying value to x. It panics if v's Kind is not [Uint], [Uintptr], [Uint8], [Uint16], [Uint32], or [Uint64], or if [Value.CanSet] returns false.

func (v Value) SetUint(x uint64)

SetZero method #

SetZero sets v to be the zero value of v's type. It panics if [Value.CanSet] returns false.

func (v Value) SetZero()

Size method #

func (t *rtype) Size() uintptr

Slice method #

Slice returns v[i:j]. It panics if v's Kind is not [Array], [Slice] or [String], or if v is an unaddressable array, or if the indexes are out of bounds.

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

Slice3 method #

Slice3 is the 3-index form of the slice operation: it returns v[i:j:k]. It panics if v's Kind is not [Array] or [Slice], or if v is an unaddressable array, or if the indexes are out of bounds.

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

SliceAt function #

SliceAt returns a [Value] representing a slice whose underlying data starts at p, with length and capacity equal to n. This is like [unsafe.Slice].

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

SliceOf function #

SliceOf returns the slice type with element type t. For example, if t represents int, SliceOf(t) represents []int.

func SliceOf(t Type) Type

String method #

String returns the name of k.

func (k Kind) String() string

String method #

func (t *rtype) String() string

String method #

func (d ChanDir) String() string

String method #

String returns the string v's underlying value, as a string. String is a special case because of Go's String method convention. Unlike the other getters, it does not panic if v's Kind is not [String]. Instead, it returns a string of the form "" where T is v's type. The fmt package treats Values specially. It does not call their String method implicitly but instead prints the concrete values they hold.

func (v Value) String() string

StructOf function #

StructOf returns the struct type containing fields. The Offset and Index fields are ignored and computed as they would be by the compiler. StructOf currently does not support promoted methods of embedded fields and panics if passed unexported StructFields.

func StructOf(fields []StructField) Type

Swapper function #

Swapper returns a function that swaps the elements in the provided slice. Swapper panics if the provided interface is not a slice.

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

TryRecv method #

TryRecv attempts to receive a value from the channel v but will not block. It panics if v's Kind is not [Chan]. If the receive delivers a value, x is the transferred value and ok is true. If the receive cannot finish without blocking, x is the zero Value and ok is false. If the channel is closed, x is the zero value for the channel's element type and ok is false.

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

TrySend method #

TrySend attempts to send x on the channel v but will not block. It panics if v's Kind is not [Chan]. It reports whether the value was sent. As in Go, x's value must be assignable to the channel's element type.

func (v Value) TrySend(x Value) bool

Type method #

Type returns v's type.

func (v Value) Type() Type

TypeFor function #

TypeFor returns the [Type] that represents the type argument T.

func TypeFor() Type

TypeOf function #

TypeOf returns the reflection [Type] that represents the dynamic type of i. If i is a nil interface value, TypeOf returns nil.

func TypeOf(i any) Type

Uint method #

Uint returns v's underlying value, as a uint64. It panics if v's Kind is not [Uint], [Uintptr], [Uint8], [Uint16], [Uint32], or [Uint64].

func (v Value) Uint() uint64

UnsafeAddr method #

UnsafeAddr returns a pointer to v's data, as a uintptr. It panics if v is not addressable. It's preferred to use uintptr(Value.Addr().UnsafePointer()) to get the equivalent result.

func (v Value) UnsafeAddr() uintptr

UnsafePointer method #

UnsafePointer returns v's value as a [unsafe.Pointer]. It panics if v's Kind is not [Chan], [Func], [Map], [Pointer], [Slice], [String] or [UnsafePointer]. If v's Kind is [Func], the returned pointer is an underlying code pointer, but not necessarily enough to identify a single function uniquely. The only guarantee is that the result is zero if and only if v is a nil func Value. If v's Kind is [Slice], the returned pointer is to the first element of the slice. If the slice is nil the returned value is nil. If the slice is empty but non-nil the return value is non-nil. If v's Kind is [String], the returned pointer is to the first element of the underlying bytes of string.

func (v Value) UnsafePointer() unsafe.Pointer

Value method #

Value returns the value of iter's current map entry.

func (iter *MapIter) Value() Value

Value method #

Value returns the value of iter's current map entry.

func (iter *MapIter) Value() Value

ValueOf function #

ValueOf returns a new Value initialized to the concrete value stored in the interface i. ValueOf(nil) returns the zero Value.

func ValueOf(i any) Value

VisibleFields function #

VisibleFields returns all the visible fields in t, which must be a struct type. A field is defined as visible if it's accessible directly with a FieldByName call. The returned fields include fields inside anonymous struct members and unexported fields. They follow the same order found in the struct, with anonymous fields followed immediately by their promoted fields. For each element e of the returned slice, the corresponding field can be retrieved from a value v of type t by calling v.FieldByIndex(e.Index).

func VisibleFields(t Type) []StructField

Zero function #

Zero returns a Value representing the zero value for the specified type. The result is different from the zero value of the Value struct, which represents no value at all. For example, Zero(TypeOf(42)) returns a Value with Kind [Int] and value 0. The returned value is neither addressable nor settable.

func Zero(typ Type) Value

abiType method #

func (v Value) abiType() *abi.Type

abiTypeSlow method #

func (v Value) abiTypeSlow() *abi.Type

add function #

add returns p+x. The whySafe string is ignored, so that the function still inlines as efficiently as p+x, but all call sites should use the string to record why the addition is safe, which is to say why the addition does not cause x to advance to the very end of p's allocation and therefore point incorrectly at the next block in memory. add should be an internal detail (and is trivially copyable), but widely used packages access it using linkname. Notable members of the hall of shame include: - github.com/pinpoint-apm/pinpoint-go-agent - github.com/vmware/govmomi Do not remove or change the type signature. See go.dev/issue/67401. go:linkname add

func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer

addArg method #

addArg extends the abiSeq with a new Go value of type t. If the value was stack-assigned, returns the single abiStep describing that translation, and nil otherwise.

func (a *abiSeq) addArg(t *abi.Type) *abiStep

addRcvr method #

addRcvr extends the abiSeq with a new method call receiver according to the interface calling convention. If the receiver was stack-assigned, returns the single abiStep describing that translation, and nil otherwise. Returns true if the receiver is a pointer.

func (a *abiSeq) addRcvr(rcvr *abi.Type) (*abiStep, bool)

addReflectOff function #

addReflectOff adds a pointer to the reflection lookup map in the runtime. It returns a new ID that can be used as a typeOff or textOff, and will be resolved correctly. Implemented in the runtime package. addReflectOff should be an internal detail, but widely used packages access it using linkname. Notable members of the hall of shame include: - github.com/goplus/reflectx Do not remove or change the type signature. See go.dev/issue/67401. go:linkname addReflectOff go:noescape

func addReflectOff(ptr unsafe.Pointer) int32

addTypeBits function #

func addTypeBits(bv *bitVector, offset uintptr, t *abi.Type)

align function #

align returns the result of rounding x up to a multiple of n. n must be a power of two.

func align(x uintptr, n uintptr) uintptr

append method #

append a bit to the bitmap.

func (bv *bitVector) append(bit uint8)

appendVarint function #

func appendVarint(x []byte, v uintptr) []byte

archFloat32FromReg function #

func archFloat32FromReg(reg uint64) float32

archFloat32FromReg function #

func archFloat32FromReg(reg uint64) float32

archFloat32FromReg function #

func archFloat32FromReg(reg uint64) float32

archFloat32ToReg function #

func archFloat32ToReg(val float32) uint64

archFloat32ToReg function #

func archFloat32ToReg(val float32) uint64

archFloat32ToReg function #

func archFloat32ToReg(val float32) uint64

arena_New function #

func arena_New(a *arena.Arena, typ any) any

arrayAt function #

arrayAt returns the i-th element of p, an array whose elements are eltSize bytes wide. The array pointed at by p must have at least i+1 elements: it is invalid (but impossible to check here) to pass i >= len, because then the result will point outside the array. whySafe must explain why i < len. (Passing "i < len" is fine; the benefit is to surface this assumption at the call site.)

func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer

assignFloatN method #

assignFloatN assigns n values to registers, each "size" bytes large, from the data at [offset, offset+n*size) in memory. Each value at [offset+i*size, offset+(i+1)*size) for i < n is assigned to the next n floating-point registers. Returns whether assignment succeeded.

func (a *abiSeq) assignFloatN(offset uintptr, size uintptr, n int) bool

assignIntN method #

assignIntN assigns n values to registers, each "size" bytes large, from the data at [offset, offset+n*size) in memory. Each value at [offset+i*size, offset+(i+1)*size) for i < n is assigned to the next n integer registers. Bit i in ptrMap indicates whether the i'th value is a pointer. n must be <= 8. Returns whether assignment succeeded.

func (a *abiSeq) assignIntN(offset uintptr, size uintptr, n int, ptrMap uint8) bool

assignTo method #

assignTo returns a value v that can be assigned directly to dst. It panics if v is not assignable to dst. For a conversion to an interface type, target, if not nil, is a suggested scratch space to use. target must be initialized memory (or nil).

func (v Value) assignTo(context string, dst *abi.Type, target unsafe.Pointer) Value

badlinkname_Value_pointer function #

go:linkname badlinkname_Value_pointer reflect.(*Value).pointer

func badlinkname_Value_pointer(Value) unsafe.Pointer

badlinkname_rtype_Align function #

go:linkname badlinkname_rtype_Align reflect.(*rtype).Align

func badlinkname_rtype_Align(*rtype) int

badlinkname_rtype_AssignableTo function #

go:linkname badlinkname_rtype_AssignableTo reflect.(*rtype).AssignableTo

func badlinkname_rtype_AssignableTo(*rtype, Type) bool

badlinkname_rtype_Bits function #

go:linkname badlinkname_rtype_Bits reflect.(*rtype).Bits

func badlinkname_rtype_Bits(*rtype) int

badlinkname_rtype_ChanDir function #

go:linkname badlinkname_rtype_ChanDir reflect.(*rtype).ChanDir

func badlinkname_rtype_ChanDir(*rtype) ChanDir

badlinkname_rtype_Comparable function #

go:linkname badlinkname_rtype_Comparable reflect.(*rtype).Comparable

func badlinkname_rtype_Comparable(*rtype) bool

badlinkname_rtype_ConvertibleTo function #

go:linkname badlinkname_rtype_ConvertibleTo reflect.(*rtype).ConvertibleTo

func badlinkname_rtype_ConvertibleTo(*rtype, Type) bool

badlinkname_rtype_Elem function #

go:linkname badlinkname_rtype_Elem reflect.(*rtype).Elem

func badlinkname_rtype_Elem(*rtype) Type

badlinkname_rtype_Field function #

go:linkname badlinkname_rtype_Field reflect.(*rtype).Field

func badlinkname_rtype_Field(*rtype, int) StructField

badlinkname_rtype_FieldAlign function #

go:linkname badlinkname_rtype_FieldAlign reflect.(*rtype).FieldAlign

func badlinkname_rtype_FieldAlign(*rtype) int

badlinkname_rtype_FieldByIndex function #

go:linkname badlinkname_rtype_FieldByIndex reflect.(*rtype).FieldByIndex

func badlinkname_rtype_FieldByIndex(*rtype, []int) StructField

badlinkname_rtype_FieldByName function #

go:linkname badlinkname_rtype_FieldByName reflect.(*rtype).FieldByName

func badlinkname_rtype_FieldByName(*rtype, string) (StructField, bool)

badlinkname_rtype_FieldByNameFunc function #

go:linkname badlinkname_rtype_FieldByNameFunc reflect.(*rtype).FieldByNameFunc

func badlinkname_rtype_FieldByNameFunc(*rtype, func(string) bool) (StructField, bool)

badlinkname_rtype_Implements function #

go:linkname badlinkname_rtype_Implements reflect.(*rtype).Implements

func badlinkname_rtype_Implements(*rtype, Type) bool

badlinkname_rtype_In function #

go:linkname badlinkname_rtype_In reflect.(*rtype).In

func badlinkname_rtype_In(*rtype, int) Type

badlinkname_rtype_IsVariadic function #

go:linkname badlinkname_rtype_IsVariadic reflect.(*rtype).IsVariadic

func badlinkname_rtype_IsVariadic(*rtype) bool

badlinkname_rtype_Key function #

go:linkname badlinkname_rtype_Key reflect.(*rtype).Key

func badlinkname_rtype_Key(*rtype) Type

badlinkname_rtype_Kind function #

go:linkname badlinkname_rtype_Kind reflect.(*rtype).Kind

func badlinkname_rtype_Kind(*rtype) Kind

badlinkname_rtype_Len function #

go:linkname badlinkname_rtype_Len reflect.(*rtype).Len

func badlinkname_rtype_Len(*rtype) int

badlinkname_rtype_Method function #

go:linkname badlinkname_rtype_Method reflect.(*rtype).Method

func badlinkname_rtype_Method(*rtype, int) Method

badlinkname_rtype_MethodByName function #

go:linkname badlinkname_rtype_MethodByName reflect.(*rtype).MethodByName

func badlinkname_rtype_MethodByName(*rtype, string) (Method, bool)

badlinkname_rtype_Name function #

go:linkname badlinkname_rtype_Name reflect.(*rtype).Name

func badlinkname_rtype_Name(*rtype) string

badlinkname_rtype_NumField function #

go:linkname badlinkname_rtype_NumField reflect.(*rtype).NumField

func badlinkname_rtype_NumField(*rtype) int

badlinkname_rtype_NumIn function #

go:linkname badlinkname_rtype_NumIn reflect.(*rtype).NumIn

func badlinkname_rtype_NumIn(*rtype) int

badlinkname_rtype_NumMethod function #

go:linkname badlinkname_rtype_NumMethod reflect.(*rtype).NumMethod

func badlinkname_rtype_NumMethod(*rtype) int

badlinkname_rtype_NumOut function #

go:linkname badlinkname_rtype_NumOut reflect.(*rtype).NumOut

func badlinkname_rtype_NumOut(*rtype) int

badlinkname_rtype_Out function #

go:linkname badlinkname_rtype_Out reflect.(*rtype).Out

func badlinkname_rtype_Out(*rtype, int) Type

badlinkname_rtype_PkgPath function #

go:linkname badlinkname_rtype_PkgPath reflect.(*rtype).PkgPath

func badlinkname_rtype_PkgPath(*rtype) string

badlinkname_rtype_Size function #

go:linkname badlinkname_rtype_Size reflect.(*rtype).Size

func badlinkname_rtype_Size(*rtype) uintptr

badlinkname_rtype_String function #

go:linkname badlinkname_rtype_String reflect.(*rtype).String

func badlinkname_rtype_String(*rtype) string

badlinkname_rtype_ptrTo function #

go:linkname badlinkname_rtype_ptrTo reflect.(*rtype).ptrTo

func badlinkname_rtype_ptrTo(*rtype) *abi.Type

bucketOf function #

func bucketOf(ktyp *abi.Type, etyp *abi.Type) *abi.Type

bytesSlow method #

func (v Value) bytesSlow() []byte

call method #

func (v Value) call(op string, in []Value) []Value

call function #

call calls fn with "stackArgsSize" bytes of stack arguments laid out at stackArgs and register arguments laid out in regArgs. frameSize is the total amount of stack space that will be reserved by call, so this should include enough space to spill register arguments to the stack in case of preemption. After fn returns, call copies stackArgsSize-stackRetOffset result bytes back into stackArgs+stackRetOffset before returning, for any return values passed on the stack. Register-based return values will be found in the same regArgs structure. regArgs must also be prepared with an appropriate ReturnIsPtr bitmap indicating which registers will contain pointer-valued return values. The purpose of this bitmap is to keep pointers visible to the GC between returning from reflectcall and actually using them. If copying result bytes back from the stack, the caller must pass the argument frame type as stackArgsType, so that call can execute appropriate write barriers during the copy. Arguments passed through to call do not escape. The type is used only in a very limited callee of call, the stackArgs are copied, and regArgs is only used in the call frame. go:noescape go:linkname call runtime.reflectcall

func call(stackArgsType *abi.Type, f unsafe.Pointer, stackArgs unsafe.Pointer, stackArgsSize uint32, stackRetOffset uint32, frameSize uint32, regArgs *abi.RegArgs)

callMethod function #

callMethod is the call implementation used by a function returned by makeMethodValue (used by v.Method(i).Interface()). It is a streamlined version of the usual reflect call: the caller has already laid out the argument frame for us, so we don't have to deal with individual Values for each argument. It is in this file so that it can be next to the two similar functions above. The remainder of the makeMethodValue implementation is in makefunc.go. NOTE: This function must be marked as a "wrapper" in the generated code, so that the linker can make it work correctly for panic and recover. The gc compilers know to do that for the name "reflect.callMethod". ctxt is the "closure" generated by makeMethodValue. frame is a pointer to the arguments to that closure on the stack. retValid points to a boolean which should be set when the results section of frame is set. regs contains the argument values passed in registers and will contain the values returned from ctxt.fn in registers.

func callMethod(ctxt *methodValue, frame unsafe.Pointer, retValid *bool, regs *abi.RegArgs)

callReflect function #

callReflect is the call implementation used by a function returned by MakeFunc. In many ways it is the opposite of the method Value.call above. The method above converts a call using Values into a call of a function with a concrete argument frame, while callReflect converts a call of a function with a concrete argument frame into a call using Values. It is in this file so that it can be next to the call method above. The remainder of the MakeFunc implementation is in makefunc.go. NOTE: This function must be marked as a "wrapper" in the generated code, so that the linker can make it work correctly for panic and recover. The gc compilers know to do that for the name "reflect.callReflect". ctxt is the "closure" generated by MakeFunc. frame is a pointer to the arguments to that closure on the stack. retValid points to a boolean which should be set when the results section of frame is set. regs contains the argument values passed in registers and will contain the values returned from ctxt.fn in registers.

func callReflect(ctxt *makeFuncImpl, frame unsafe.Pointer, retValid *bool, regs *abi.RegArgs)

canRangeFunc function #

func canRangeFunc(t *abi.Type) bool

canRangeFunc2 function #

func canRangeFunc2(t *abi.Type) bool

capNonSlice method #

func (v Value) capNonSlice() int

chancap function #

implemented in ../runtime go:noescape

func chancap(ch unsafe.Pointer) int

chanclose function #

go:noescape

func chanclose(ch unsafe.Pointer)

chanlen function #

go:noescape

func chanlen(ch unsafe.Pointer) int

chanrecv function #

go:noescape

func chanrecv(ch unsafe.Pointer, nb bool, val unsafe.Pointer) (selected bool, received bool)

chansend function #

func chansend(ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool

chansend0 function #

go:noescape

func chansend0(ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool

common method #

func (t *interfaceType) common() *abi.Type

common method #

func (t *rtype) common() *abi.Type

contentEscapes function #

Dummy annotation marking that the content of value x escapes (i.e. modeling roughly heap=*x), for use in cases where the reflect code is so clever that the compiler cannot follow.

func contentEscapes(x unsafe.Pointer)

convertOp function #

convertOp returns the function to convert a value of type src to a value of type dst. If the conversion is illegal, convertOp returns nil.

func convertOp(dst *abi.Type, src *abi.Type) (func(Value, Type) Value)

copyVal function #

copyVal returns a Value containing the map key or value at ptr, allocating a new variable as needed.

func copyVal(typ *abi.Type, fl flag, ptr unsafe.Pointer) Value

cvtBytesString function #

convertOp: []byte -> string

func cvtBytesString(v Value, t Type) Value

cvtComplex function #

convertOp: complexXX -> complexXX

func cvtComplex(v Value, t Type) Value

cvtDirect function #

convertOp: direct copy

func cvtDirect(v Value, typ Type) Value

cvtFloat function #

convertOp: floatXX -> floatXX

func cvtFloat(v Value, t Type) Value

cvtFloatInt function #

convertOp: floatXX -> intXX

func cvtFloatInt(v Value, t Type) Value

cvtFloatUint function #

convertOp: floatXX -> uintXX

func cvtFloatUint(v Value, t Type) Value

cvtI2I function #

convertOp: interface -> interface

func cvtI2I(v Value, typ Type) Value

cvtInt function #

convertOp: intXX -> [u]intXX

func cvtInt(v Value, t Type) Value

cvtIntFloat function #

convertOp: intXX -> floatXX

func cvtIntFloat(v Value, t Type) Value

cvtIntString function #

convertOp: intXX -> string

func cvtIntString(v Value, t Type) Value

cvtRunesString function #

convertOp: []rune -> string

func cvtRunesString(v Value, t Type) Value

cvtSliceArray function #

convertOp: []T -> [N]T

func cvtSliceArray(v Value, t Type) Value

cvtSliceArrayPtr function #

convertOp: []T -> *[N]T

func cvtSliceArrayPtr(v Value, t Type) Value

cvtStringBytes function #

convertOp: string -> []byte

func cvtStringBytes(v Value, t Type) Value

cvtStringRunes function #

convertOp: string -> []rune

func cvtStringRunes(v Value, t Type) Value

cvtT2I function #

convertOp: concrete -> interface

func cvtT2I(v Value, typ Type) Value

cvtUint function #

convertOp: uintXX -> [u]intXX

func cvtUint(v Value, t Type) Value

cvtUintFloat function #

convertOp: uintXX -> floatXX

func cvtUintFloat(v Value, t Type) Value

cvtUintString function #

convertOp: uintXX -> string

func cvtUintString(v Value, t Type) Value

deepValueEqual function #

Tests for deep equality using reflected types. The map argument tracks comparisons that have already been seen, which allows short circuiting on recursive types.

func deepValueEqual(v1 Value, v2 Value, visited map[visit]bool) bool

directlyAssignable function #

directlyAssignable reports whether a value x of type V can be directly assigned (using memmove) to a value of type T. https://golang.org/doc/go_spec.html#Assignability Ignoring the interface rules (implemented elsewhere) and the ideal constant rules (no ideal constants at run time).

func directlyAssignable(T *abi.Type, V *abi.Type) bool

dump method #

func (a *abiDesc) dump()

dump method #

func (a *abiSeq) dump()

dumpPtrBitMap function #

func dumpPtrBitMap(b abi.IntArgRegBitmap)

elem function #

func elem(t *abi.Type) *abi.Type

embeddedIfaceMethStub function #

func embeddedIfaceMethStub()

emitGCMask function #

emitGCMask writes the GC mask for [n]typ into out, starting at bit offset base.

func emitGCMask(out []byte, base uintptr, typ *abi.Type, n uintptr)

escapes function #

Dummy annotation marking that the value x escapes, for use in cases where the reflect code is so clever that the compiler cannot follow.

func escapes(x any)

exportedMethods method #

func (t *rtype) exportedMethods() []abi.Method

extendSlice method #

extendSlice extends a slice by n elements. Unlike Value.grow, which modifies the slice in place and does not change the length of the slice in place, extendSlice returns a new slice value with the length incremented by the number of specified elements.

func (v Value) extendSlice(n int) Value

floatFromReg function #

floatFromReg loads a float value from its register representation in r. argSize must be 4 or 8.

func floatFromReg(r *abi.RegArgs, reg int, argSize uintptr, to unsafe.Pointer)

floatToReg function #

floatToReg stores a float value in its register representation in r. argSize must be either 4 or 8.

func floatToReg(r *abi.RegArgs, reg int, argSize uintptr, from unsafe.Pointer)

fnv1 function #

fnv1 incorporates the list of bytes into the hash x using the FNV-1 hash function.

func fnv1(x uint32, list ...byte) uint32

funcLayout function #

funcLayout computes a struct type representing the layout of the stack-assigned function arguments and return values for the function type t. If rcvr != nil, rcvr specifies the type of the receiver. The returned type exists only for GC, so we only fill out GC relevant info. Currently, that's just size and the GC program. We also fill in the name for possible debugging use.

func funcLayout(t *funcType, rcvr *abi.Type) (frametype *abi.Type, framePool *sync.Pool, abid abiDesc)

funcName function #

funcName returns the name of f, for use in error messages.

func funcName(f func([]Value) []Value) string

funcStr function #

funcStr builds a string representation of a funcType.

func funcStr(ft *funcType) string

getStaticuint64s function #

getStaticuint64s returns a pointer to an array of 256 uint64 values, defined in the runtime package in read-only memory. staticuint64s[0] == 0, staticuint64s[1] == 1, and so forth. go:linkname getStaticuint64s runtime.getStaticuint64s

func getStaticuint64s() *[256]uint64

groupAndSlotOf function #

func groupAndSlotOf(ktyp Type, etyp Type) (Type, Type)

grow method #

grow is identical to Grow but does not check for assignability.

func (v Value) grow(n int)

growslice function #

go:noescape

func growslice(t *abi.Type, old unsafeheader.Slice, num int) unsafeheader.Slice

hashMightPanic function #

hashMightPanic reports whether the hash of a map key of type t might panic.

func hashMightPanic(t *abi.Type) bool

haveIdenticalType function #

func haveIdenticalType(T *abi.Type, V *abi.Type, cmpTags bool) bool

haveIdenticalUnderlyingType function #

func haveIdenticalUnderlyingType(T *abi.Type, V *abi.Type, cmpTags bool) bool

ifaceE2I function #

func ifaceE2I(t *abi.Type, src any, dst unsafe.Pointer)

implements function #

implements reports whether the type V implements the interface type T.

func implements(T *abi.Type, V *abi.Type) bool

initFuncTypes function #

func initFuncTypes(n int) Type

initialized method #

func (h *hiter) initialized() bool

intFromReg function #

intFromReg loads an argSize sized integer from reg and places it at to. argSize must be non-zero, fit in a register, and a power-of-two.

func intFromReg(r *abi.RegArgs, reg int, argSize uintptr, to unsafe.Pointer)

intToReg function #

intToReg loads an argSize sized integer and stores it into reg. argSize must be non-zero, fit in a register, and a power-of-two.

func intToReg(r *abi.RegArgs, reg int, argSize uintptr, from unsafe.Pointer)

isLetter function #

isLetter reports whether a given 'rune' is classified as a Letter.

func isLetter(ch rune) bool

isPaddedField function #

isPaddedField reports whether the i'th field of struct type t is followed by padding.

func isPaddedField(t Type, i int) bool

isReflexive function #

isReflexive reports whether the == operation on the type is reflexive. That is, x == x for all values x of type t.

func isReflexive(t *abi.Type) bool

isRegularMemory function #

This must match cmd/compile/internal/compare.IsRegularMemory

func isRegularMemory(t Type) bool

isValidFieldName function #

isValidFieldName checks if a string is a valid (struct) field name or not. According to the language spec, a field name should be an identifier. identifier = letter { letter | unicode_digit } . letter = unicode_letter | "_" .

func isValidFieldName(fieldName string) bool

isZero function #

isZero For all zeros, performance is not as good as return bytealg.Count(b, byte(0)) == len(b)

func isZero(b []byte) bool

kind method #

func (f flag) kind() Kind

lenNonSlice method #

func (v Value) lenNonSlice() int

makeBytes function #

func makeBytes(f flag, v []byte, t Type) Value

makeComplex function #

makeComplex returns a Value of type t equal to v (possibly truncated to complex64), where t is a complex64 or complex128 type.

func makeComplex(f flag, v complex128, t Type) Value

makeFloat function #

makeFloat returns a Value of type t equal to v (possibly truncated to float32), where t is a float32 or float64 type.

func makeFloat(f flag, v float64, t Type) Value

makeFloat32 function #

makeFloat32 returns a Value of type t equal to v, where t is a float32 type.

func makeFloat32(f flag, v float32, t Type) Value

makeFuncStub function #

makeFuncStub is an assembly function that is the code half of the function returned from MakeFunc. It expects a *callReflectFunc as its context register, and its job is to invoke callReflect(ctxt, frame) where ctxt is the context register and frame is a pointer to the first word in the passed-in argument frame.

func makeFuncStub()

makeInt function #

makeInt returns a Value of type t equal to bits (possibly truncated), where t is a signed or unsigned int type.

func makeInt(f flag, bits uint64, t Type) Value

makeMethodValue function #

makeMethodValue converts v from the rcvr+method index representation of a method value to an actual method func value, which is basically the receiver value with a special bit set, into a true func value - a value holding an actual func. The output is semantically equivalent to the input as far as the user of package reflect can tell, but the true func representation can be handled by code like Convert and Interface and Assign.

func makeMethodValue(op string, v Value) Value

makeRunes function #

func makeRunes(f flag, v []rune, t Type) Value

makeString function #

func makeString(f flag, v string, t Type) Value

makechan function #

func makechan(typ *abi.Type, size int) (ch unsafe.Pointer)

makemap function #

func makemap(t *abi.Type, cap int) (m unsafe.Pointer)

mapIterNext function #

Equivalent to runtime.mapIterNext. go:noinline

func mapIterNext(it *maps.Iter)

mapIterStart function #

Equivalent to runtime.mapIterStart. go:noinline

func mapIterStart(t *abi.SwissMapType, m *maps.Map, it *maps.Iter)

mapaccess function #

go:noescape

func mapaccess(t *abi.Type, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer)

mapaccess_faststr function #

go:noescape

func mapaccess_faststr(t *abi.Type, m unsafe.Pointer, key string) (val unsafe.Pointer)

mapassign function #

mapassign should be an internal detail, but widely used packages access it using linkname. Notable members of the hall of shame include: - github.com/modern-go/reflect2 - github.com/goccy/go-json Do not remove or change the type signature. See go.dev/issue/67401. go:linkname mapassign

func mapassign(t *abi.Type, m unsafe.Pointer, key unsafe.Pointer, val unsafe.Pointer)

mapassign0 function #

go:noescape

func mapassign0(t *abi.Type, m unsafe.Pointer, key unsafe.Pointer, val unsafe.Pointer)

mapassign_faststr function #

func mapassign_faststr(t *abi.Type, m unsafe.Pointer, key string, val unsafe.Pointer)

mapassign_faststr0 function #

go:noescape

func mapassign_faststr0(t *abi.Type, m unsafe.Pointer, key string, val unsafe.Pointer)

mapclear function #

func mapclear(t *abi.Type, m unsafe.Pointer)

mapdelete function #

go:noescape

func mapdelete(t *abi.Type, m unsafe.Pointer, key unsafe.Pointer)

mapdelete_faststr function #

go:noescape

func mapdelete_faststr(t *abi.Type, m unsafe.Pointer, key string)

mapiterinit function #

go:noescape

func mapiterinit(t *abi.Type, m unsafe.Pointer, it *hiter)

mapiternext function #

go:noescape

func mapiternext(it *hiter)

maplen function #

go:noescape

func maplen(m unsafe.Pointer) int

memmove function #

memmove copies size bytes to dst from src. No write barriers are used. go:noescape

func memmove(dst unsafe.Pointer, src unsafe.Pointer, size uintptr)

methodReceiver function #

methodReceiver returns information about the receiver described by v. The Value v may or may not have the flagMethod bit set, so the kind cached in v.flag should not be used. The return value rcvrtype gives the method's actual receiver type. The return value t gives the method type signature (without the receiver). The return value fn is a pointer to the method code.

func methodReceiver(op string, v Value, methodIndex int) (rcvrtype *abi.Type, t *funcType, fn unsafe.Pointer)

methodValueCall function #

methodValueCall is an assembly function that is the code half of the function returned from makeMethodValue. It expects a *methodValue as its context register, and its job is to invoke callMethod(ctxt, frame) where ctxt is the context register and frame is a pointer to the first word in the passed-in argument frame.

func methodValueCall()

methodValueCallCodePtr function #

func methodValueCallCodePtr() uintptr

moveMakeFuncArgPtrs function #

moveMakeFuncArgPtrs uses ctxt.regPtrs to copy integer pointer arguments in args.Ints to args.Ptrs where the GC can see them. This is similar to what reflectcallmove does in the runtime, except that happens on the return path, whereas this happens on the call path. nosplit because pointers are being held in uintptr slots in args, so having our stack scanned now could lead to accidentally freeing memory. go:nosplit

func moveMakeFuncArgPtrs(ctxt *makeFuncCtxt, args *abi.RegArgs)

mustBe method #

mustBe panics if f's kind is not expected. Making this a method on flag instead of on Value (and embedding flag in Value) means that we can write the very clear v.mustBe(Bool) and have it compile into v.flag.mustBe(Bool), which will only bother to copy the single important word for the receiver.

func (f flag) mustBe(expected Kind)

mustBeAssignable method #

mustBeAssignable panics if f records that the value is not assignable, which is to say that either it was obtained using an unexported field or it is not addressable.

func (f flag) mustBeAssignable()

mustBeAssignableSlow method #

func (f flag) mustBeAssignableSlow()

mustBeExported method #

mustBeExported panics if f records that the value was obtained using an unexported field.

func (f flag) mustBeExported()

mustBeExportedSlow method #

func (f flag) mustBeExportedSlow()

nameFor function #

func nameFor(t *abi.Type) string

nameOff method #

func (t *rtype) nameOff(off aNameOff) abi.Name

nameOff method #

func (t *interfaceType) nameOff(off aNameOff) abi.Name

nameOffFor function #

func nameOffFor(t *abi.Type, off aNameOff) abi.Name

needKeyUpdate function #

needKeyUpdate reports whether map overwrites require the key to be copied.

func needKeyUpdate(t *abi.Type) bool

newAbiDesc function #

func newAbiDesc(t *funcType, rcvr *abi.Type) abiDesc

newName function #

func newName(n string, tag string, exported bool, embedded bool) abi.Name

overflowFloat32 function #

func overflowFloat32(x float64) bool

packEface function #

packEface converts v to the empty interface.

func packEface(v Value) any

panicNotBool method #

func (v Value) panicNotBool()

panicNotMap method #

Force slow panicking path not inlined, so it won't add to the inlining budget of the caller. TODO: undo when the inliner is no longer bottom-up only. go:noinline

func (f flag) panicNotMap()

panicNotMap method #

Force slow panicking path not inlined, so it won't add to the inlining budget of the caller. TODO: undo when the inliner is no longer bottom-up only. go:noinline

func (f flag) panicNotMap()

pkgPath function #

func pkgPath(n abi.Name) string

pkgPathFor function #

func pkgPathFor(t *abi.Type) string

pointer method #

pointer returns the underlying pointer represented by v. v.Kind() must be Pointer, Map, Chan, Func, or UnsafePointer if v.Kind() == Pointer, the base type must not be not-in-heap.

func (v Value) pointer() unsafe.Pointer

ptrTo method #

func (t *rtype) ptrTo() *abi.Type

ptrTo function #

func ptrTo(t *abi.Type) *abi.Type

rangeNum function #

func rangeNum(num N, t Type) *ast.IndexExpr

recv method #

internal recv, possibly non-blocking (nb). v is known to be a channel.

func (v Value) recv(nb bool) (val Value, ok bool)

regAssign method #

regAssign attempts to reserve argument registers for a value of type t, stored at some offset. It returns whether or not the assignment succeeded, but leaves any changes it made to a.steps behind, so the caller must undo that work by adjusting a.steps if it fails. This method along with the assign* methods represent the complete register-assignment algorithm for the Go ABI.

func (a *abiSeq) regAssign(t *abi.Type, offset uintptr) bool

resolveNameOff function #

resolveNameOff resolves a name offset from a base pointer. The (*rtype).nameOff method is a convenience wrapper for this function. Implemented in the runtime package. go:noescape

func resolveNameOff(ptrInModule unsafe.Pointer, off int32) unsafe.Pointer

resolveReflectName function #

resolveReflectName adds a name to the reflection lookup map in the runtime. It returns a new nameOff that can be used to refer to the pointer.

func resolveReflectName(n abi.Name) aNameOff

resolveReflectText function #

resolveReflectText adds a function pointer to the reflection lookup map in the runtime. It returns a new textOff that can be used to refer to the pointer.

func resolveReflectText(ptr unsafe.Pointer) aTextOff

resolveReflectType function #

resolveReflectType adds a *rtype to the reflection lookup map in the runtime. It returns a new typeOff that can be used to refer to the pointer.

func resolveReflectType(t *abi.Type) aTypeOff

resolveTextOff function #

resolveTextOff resolves a function pointer offset from a base type. The (*rtype).textOff method is a convenience wrapper for this function. Implemented in the runtime package. go:noescape

func resolveTextOff(rtype unsafe.Pointer, off int32) unsafe.Pointer

resolveTypeOff function #

resolveTypeOff resolves an *rtype offset from a base type. The (*rtype).typeOff method is a convenience wrapper for this function. Implemented in the runtime package. go:noescape

func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer

ro method #

func (f flag) ro() flag

rselect function #

rselect runs a select. It returns the index of the chosen case. If the case was a receive, val is filled in with the received value. The conventional OK bool indicates whether the receive corresponds to a sent value. rselect generally doesn't escape the runtimeSelect slice, except that for the send case the value to send needs to escape. We don't have a way to represent that in the function signature. So we handle that with a forced escape in function Select. go:noescape

func rselect([]runtimeSelect) (chosen int, recvOK bool)

rtypeOf function #

rtypeOf directly extracts the *rtype of the provided value.

func rtypeOf(i any) *abi.Type

rtypeOff function #

rtypeOff should be an internal detail, but widely used packages access it using linkname. Notable members of the hall of shame include: - github.com/goccy/go-json Do not remove or change the type signature. See go.dev/issue/67401. go:linkname rtypeOff

func rtypeOff(section unsafe.Pointer, off int32) *abi.Type

runes method #

runes returns v's underlying value. It panics if v's underlying value is not a slice of runes (int32s).

func (v Value) runes() []rune

runtimeStructField function #

runtimeStructField takes a StructField value passed to StructOf and returns both the corresponding internal representation, of type structField, and the pkgpath value to use for this field.

func runtimeStructField(field StructField) (structField, string)

send method #

internal send, possibly non-blocking. v is known to be a channel.

func (v Value) send(x Value, nb bool) (selected bool)

setRunes method #

setRunes sets v's underlying value. It panics if v's underlying value is not a slice of runes (int32s) or if [Value.CanSet] returns false.

func (v Value) setRunes(x []rune)

specialChannelAssignability function #

specialChannelAssignability reports whether a value x of channel type V can be directly assigned (using memmove) to another channel type T. https://golang.org/doc/go_spec.html#Assignability T and V must be both of Chan kind.

func specialChannelAssignability(T *abi.Type, V *abi.Type) bool

stackAssign method #

stackAssign reserves space for one value that is "size" bytes large with alignment "alignment" to the stack. Should not be called directly; use addArg instead.

func (a *abiSeq) stackAssign(size uintptr, alignment uintptr)

stepsForValue method #

stepsForValue returns the ABI instructions for translating the i'th Go argument or return value represented by this abiSeq to the Go ABI.

func (a *abiSeq) stepsForValue(i int) []abiStep

storeRcvr function #

v is a method receiver. Store at p the word which is used to encode that receiver at the start of the argument list. Reflect uses the "interface" calling convention for methods, which always uses one word to record the receiver.

func storeRcvr(v Value, p unsafe.Pointer)

stringFor function #

func stringFor(t *abi.Type) string

stringNonString method #

func (v Value) stringNonString() string

textOff method #

func (t *rtype) textOff(off aTextOff) unsafe.Pointer

textOffFor function #

func textOffFor(t *abi.Type, off aTextOff) unsafe.Pointer

toRType function #

func toRType(t *abi.Type) *rtype

toType function #

toType converts from a *rtype to a Type that can be returned to the client of package reflect. In gc, the only concern is that a nil *rtype must be replaced by a nil Type, but in gccgo this function takes care of ensuring that multiple *rtype for the same type are coalesced into a single Type. toType should be an internal detail, but widely used packages access it using linkname. Notable members of the hall of shame include: - fortio.org/log - github.com/goccy/go-json - github.com/goccy/go-reflect - github.com/sohaha/zlsgo Do not remove or change the type signature. See go.dev/issue/67401. go:linkname toType

func toType(t *abi.Type) Type

typ method #

typ returns the *abi.Type stored in the Value. This method is fast, but it doesn't always return the correct type for the Value. See abiType and Type, which do return the correct type.

func (v Value) typ() *abi.Type

typeOff method #

func (t *rtype) typeOff(off aTypeOff) *abi.Type

typeOff method #

func (t *interfaceType) typeOff(off aTypeOff) *abi.Type

typeOffFor function #

func typeOffFor(t *abi.Type, off aTypeOff) *abi.Type

typeSlow method #

go:noinline

func (v Value) typeSlow() Type

typedarrayclear function #

typedarrayclear zeroes the value at ptr of an array of elemType, only clears len elem. go:noescape

func typedarrayclear(elemType *abi.Type, ptr unsafe.Pointer, len int)

typedmemclr function #

typedmemclr zeros the value at ptr of type t. go:noescape

func typedmemclr(t *abi.Type, ptr unsafe.Pointer)

typedmemclrpartial function #

typedmemclrpartial is like typedmemclr but assumes that dst points off bytes into the value and only clears size bytes. go:noescape

func typedmemclrpartial(t *abi.Type, ptr unsafe.Pointer, off uintptr, size uintptr)

typedmemmove function #

typedmemmove copies a value of type t to dst from src. go:noescape

func typedmemmove(t *abi.Type, dst unsafe.Pointer, src unsafe.Pointer)

typedslicecopy function #

typedslicecopy copies a slice of elemType values from src to dst, returning the number of elements copied. go:noescape

func typedslicecopy(t *abi.Type, dst unsafeheader.Slice, src unsafeheader.Slice) int

typehash function #

go:noescape

func typehash(t *abi.Type, p unsafe.Pointer, h uintptr) uintptr

typeptrdata function #

typeptrdata returns the length in bytes of the prefix of t containing pointer data. Anything after this offset is scalar data. keep in sync with ../cmd/compile/internal/reflectdata/reflect.go

func typeptrdata(t *abi.Type) uintptr

typesByString function #

typesByString returns the subslice of typelinks() whose elements have the given string representation. It may be empty (no known types with that string) or may have multiple elements (multiple types with that string). typesByString should be an internal detail, but widely used packages access it using linkname. Notable members of the hall of shame include: - github.com/aristanetworks/goarista - fortio.org/log Do not remove or change the type signature. See go.dev/issue/67401. go:linkname typesByString

func typesByString(s string) []*abi.Type

typesMustMatch function #

func typesMustMatch(what string, t1 Type, t2 Type)

uncommon method #

func (t *rtype) uncommon() *abi.UncommonType

uncommon method #

func (t *interfaceType) uncommon() *abi.UncommonType

unpackEface function #

unpackEface converts the empty interface i to a Value.

func unpackEface(i any) Value

unsafe_New function #

go:noescape

func unsafe_New(*abi.Type) unsafe.Pointer

unsafe_NewArray function #

go:noescape

func unsafe_NewArray(*abi.Type, int) unsafe.Pointer

unsafeslice function #

go:noescape

func unsafeslice(t *abi.Type, ptr unsafe.Pointer, len int)

unusedIfaceIndir function #

ifaceIndir reports whether t is stored indirectly in an interface value. It is no longer used by this package and is here entirely for the linkname uses. go:linkname unusedIfaceIndir reflect.ifaceIndir

func unusedIfaceIndir(t *abi.Type) bool

valueInterface function #

func valueInterface(v Value, safe bool) any

valueMethodName function #

valueMethodName returns the name of the exported calling method on Value.

func valueMethodName() string

verifyNotInHeapPtr function #

func verifyNotInHeapPtr(p uintptr) bool

walk method #

walk walks all the fields in the struct type t, visiting fields in index preorder and appending them to w.fields (this maintains the required ordering). Fields that have been overridden have their Name field cleared.

func (w *visibleFieldsWalker) walk(t Type)

Generated with Arrow