# package reflect
`import "reflect"`
reflect包實現了運行時反射,允許程序操作任意類型的對象。典型用法是用靜態類型interface{}保存一個值,通過調用TypeOf獲取其動態類型信息,該函數返回一個Type類型值。調用ValueOf函數返回一個Value類型值,該值代表運行時的數據。Zero接受一個Type類型參數并返回一個代表該類型零值的Value類型值。
參見"The Laws of Reflection"獲取go反射的介紹:[http://golang.org/doc/articles/laws_of_reflection.html](http://golang.org/doc/articles/laws_of_reflection.html)
## Index
* [Constants](#pkg-constants)
* [type ValueError](#ValueError)
* [func (e \*ValueError) Error() string](#ValueError.Error)
* [type Kind](#Kind)
* [func (k Kind) String() string](#Kind.String)
* [type StringHeader](#StringHeader)
* [type SliceHeader](#SliceHeader)
* [type StructField](#StructField)
* [type StructTag](#StructTag)
* [func (tag StructTag) Get(key string) string](#StructTag.Get)
* [type ChanDir](#ChanDir)
* [func (d ChanDir) String() string](#ChanDir.String)
* [type SelectDir](#SelectDir)
* [type SelectCase](#SelectCase)
* [func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)](#Select)
* [type Method](#Method)
* [type Type](#Type)
* [func TypeOf(i interface{}) Type](#TypeOf)
* [func PtrTo(t Type) Type](#PtrTo)
* [func SliceOf(t Type) Type](#SliceOf)
* [func MapOf(key, elem Type) Type](#MapOf)
* [func ChanOf(dir ChanDir, t Type) Type](#ChanOf)
* [type Value](#Value)
* [func ValueOf(i interface{}) Value](#ValueOf)
* [func Zero(typ Type) Value](#Zero)
* [func New(typ Type) Value](#New)
* [func NewAt(typ Type, p unsafe.Pointer) Value](#NewAt)
* [func Indirect(v Value) Value](#Indirect)
* [func MakeSlice(typ Type, len, cap int) Value](#MakeSlice)
* [func MakeMap(typ Type) Value](#MakeMap)
* [func MakeChan(typ Type, buffer int) Value](#MakeChan)
* [func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value](#MakeFunc)
* [func Append(s Value, x ...Value) Value](#Append)
* [func AppendSlice(s, t Value) Value](#AppendSlice)
* [func (v Value) IsValid() bool](#Value.IsValid)
* [func (v Value) IsNil() bool](#Value.IsNil)
* [func (v Value) Kind() Kind](#Value.Kind)
* [func (v Value) Type() Type](#Value.Type)
* [func (v Value) Convert(t Type) Value](#Value.Convert)
* [func (v Value) Elem() Value](#Value.Elem)
* [func (v Value) Bool() bool](#Value.Bool)
* [func (v Value) Int() int64](#Value.Int)
* [func (v Value) OverflowInt(x int64) bool](#Value.OverflowInt)
* [func (v Value) Uint() uint64](#Value.Uint)
* [func (v Value) OverflowUint(x uint64) bool](#Value.OverflowUint)
* [func (v Value) Float() float64](#Value.Float)
* [func (v Value) OverflowFloat(x float64) bool](#Value.OverflowFloat)
* [func (v Value) Complex() complex128](#Value.Complex)
* [func (v Value) OverflowComplex(x complex128) bool](#Value.OverflowComplex)
* [func (v Value) Bytes() []byte](#Value.Bytes)
* [func (v Value) String() string](#Value.String)
* [func (v Value) Pointer() uintptr](#Value.Pointer)
* [func (v Value) InterfaceData() [2]uintptr](#Value.InterfaceData)
* [func (v Value) Slice(i, j int) Value](#Value.Slice)
* [func (v Value) Slice3(i, j, k int) Value](#Value.Slice3)
* [func (v Value) Cap() int](#Value.Cap)
* [func (v Value) Len() int](#Value.Len)
* [func (v Value) Index(i int) Value](#Value.Index)
* [func (v Value) MapIndex(key Value) Value](#Value.MapIndex)
* [func (v Value) MapKeys() []Value](#Value.MapKeys)
* [func (v Value) NumField() int](#Value.NumField)
* [func (v Value) Field(i int) Value](#Value.Field)
* [func (v Value) FieldByIndex(index []int) Value](#Value.FieldByIndex)
* [func (v Value) FieldByName(name string) Value](#Value.FieldByName)
* [func (v Value) FieldByNameFunc(match func(string) bool) Value](#Value.FieldByNameFunc)
* [func (v Value) Recv() (x Value, ok bool)](#Value.Recv)
* [func (v Value) TryRecv() (x Value, ok bool)](#Value.TryRecv)
* [func (v Value) Send(x Value)](#Value.Send)
* [func (v Value) TrySend(x Value) bool](#Value.TrySend)
* [func (v Value) Close()](#Value.Close)
* [func (v Value) Call(in []Value) []Value](#Value.Call)
* [func (v Value) CallSlice(in []Value) []Value](#Value.CallSlice)
* [func (v Value) NumMethod() int](#Value.NumMethod)
* [func (v Value) Method(i int) Value](#Value.Method)
* [func (v Value) MethodByName(name string) Value](#Value.MethodByName)
* [func (v Value) CanAddr() bool](#Value.CanAddr)
* [func (v Value) Addr() Value](#Value.Addr)
* [func (v Value) UnsafeAddr() uintptr](#Value.UnsafeAddr)
* [func (v Value) CanInterface() bool](#Value.CanInterface)
* [func (v Value) Interface() (i interface{})](#Value.Interface)
* [func (v Value) CanSet() bool](#Value.CanSet)
* [func (v Value) SetBool(x bool)](#Value.SetBool)
* [func (v Value) SetInt(x int64)](#Value.SetInt)
* [func (v Value) SetUint(x uint64)](#Value.SetUint)
* [func (v Value) SetFloat(x float64)](#Value.SetFloat)
* [func (v Value) SetComplex(x complex128)](#Value.SetComplex)
* [func (v Value) SetBytes(x []byte)](#Value.SetBytes)
* [func (v Value) SetString(x string)](#Value.SetString)
* [func (v Value) SetPointer(x unsafe.Pointer)](#Value.SetPointer)
* [func (v Value) SetCap(n int)](#Value.SetCap)
* [func (v Value) SetLen(n int)](#Value.SetLen)
* [func (v Value) SetMapIndex(key, val Value)](#Value.SetMapIndex)
* [func (v Value) Set(x Value)](#Value.Set)
* [func Copy(dst, src Value) int](#Copy)
* [func DeepEqual(a1, a2 interface{}) bool](#DeepEqual)
### Examples
* [MakeFunc](#example-MakeFunc)
* [StructTag](#example-StructTag)
## Constants
```
const (
SelectSend // case Chan <- Send
SelectRecv // case <-Chan:
SelectDefault // default
)
```
## type [ValueError](https://github.com/golang/go/blob/master/src/reflect/value.go#L187 "View Source")
```
type ValueError struct {
Method string
Kind Kind
}
```
當一個Value類型值調用它不支持的方法時,將導致ValueError。具體情況參見各個方法。
### func (\*ValueError) [Error](https://github.com/golang/go/blob/master/src/reflect/value.go#L192 "View Source")
```
func (e *ValueError) Error() string
```
## type [Kind](https://github.com/golang/go/blob/master/src/reflect/type.go#L208 "View Source")
```
type Kind uint
```
Kind代表Type類型值表示的具體分類。零值表示非法分類。
```
const (
Invalid Kind = iota
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
Array
Chan
Func
Interface
Map
Ptr
Slice
String
Struct
UnsafePointer
)
```
### func (Kind) [String](https://github.com/golang/go/blob/master/src/reflect/type.go#L406 "View Source")
```
func (k Kind) String() string
```
## type [StringHeader](https://github.com/golang/go/blob/master/src/reflect/value.go#L1914 "View Source")
```
type StringHeader struct {
Data uintptr
Len int
}
```
StringHeader代表一個運行時的字符串。它不保證使用的可移植性、安全性;它的實現在未來的版本里也可能會改變。而且,Data字段也不能保證它指向的數據不會被當成垃圾收集,因此程序必須維護一個獨立的、類型正確的指向底層數據的指針。
## type [SliceHeader](https://github.com/golang/go/blob/master/src/reflect/value.go#L1931 "View Source")
```
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
```
SliceHeader代表一個運行時的切片。它不保證使用的可移植性、安全性;它的實現在未來的版本里也可能會改變。而且,Data字段也不能保證它指向的數據不會被當成垃圾收集,因此程序必須維護一個獨立的、類型正確的指向底層數據的指針。
## type [StructField](https://github.com/golang/go/blob/master/src/reflect/type.go#L734 "View Source")
```
type StructField struct {
// Name是字段的名字。PkgPath是非導出字段的包路徑,對導出字段該字段為""。
// 參見http://golang.org/ref/spec#Uniqueness_of_identifiers
Name string
PkgPath string
Type Type // 字段的類型
Tag StructTag // 字段的標簽
Offset uintptr // 字段在結構體中的字節偏移量
Index []int // 用于Type.FieldByIndex時的索引切片
Anonymous bool // 是否匿名字段
}
```
StructField類型描述結構體中的一個字段的信息。
## type [StructTag](https://github.com/golang/go/blob/master/src/reflect/type.go#L757 "View Source")
```
type StructTag string
```
StructTag是結構體字段的標簽。
一般來說,標簽字符串是(可選的)空格分隔的一連串`key:"value"`對。每個鍵都是不包含控制字符、空格、雙引號、冒號的非空字符串。每個值都應被雙引號括起來,使用go字符串字面語法。
Example
```
type S struct {
F string `species:"gopher" color:"blue"`
}
s := S{}
st := reflect.TypeOf(s)
field := st.Field(0)
fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))
```
Output:
```
blue gopher
```
### func (StructTag) [Get](https://github.com/golang/go/blob/master/src/reflect/type.go#L763 "View Source")
```
func (tag StructTag) Get(key string) string
```
Get方法返回標簽字符串中鍵key對應的值。如果標簽中沒有該鍵,會返回""。如果標簽不符合標準格式,Get的返回值是不確定的。
## type [ChanDir](https://github.com/golang/go/blob/master/src/reflect/type.go#L280 "View Source")
```
type ChanDir int
```
ChanDir表示通道類型的方向。
```
const (
RecvDir ChanDir = 1 << iota // <-chan
SendDir // chan<-
BothDir = RecvDir | SendDir // chan
)
```
### func (ChanDir) [String](https://github.com/golang/go/blob/master/src/reflect/type.go#L688 "View Source")
```
func (d ChanDir) String() string
```
## type [SelectDir](https://github.com/golang/go/blob/master/src/reflect/value.go#L2074 "View Source")
```
type SelectDir int
```
SelectDir描述一個SelectCase的通信方向。
## type [SelectCase](https://github.com/golang/go/blob/master/src/reflect/value.go#L2102 "View Source")
```
type SelectCase struct {
Dir SelectDir // case的方向
Chan Value // 使用的通道(收/發)
Send Value // 用于發送的值
}
```
SelectCase描述select操作中的單條case。Case的類型由通信方向Dir決定。
如果Dir是SelectDefault,該條case代表default case。Chan和Send字段必須是Value零值。
如果Dir是SelectSend,該條case代表一個發送操作。Chan字段底層必須是一個chan類型,Send的底層必須是可以直接賦值給該chan類型成員類型的類型。如果Chan是Value零值,則不管Send字段是不是零值,該條case都會被忽略。
如果Dir是SelectRecv,該條case代表一個接收操作。Chan字段底層必須是一個chan類型,而Send必須是一個Value零值。如果Chan是Value零值,該條case會被忽略,但Send字段仍需是Value零值。當該條case被執行時,接收到的值會被Select返回。
## func [Select](https://github.com/golang/go/blob/master/src/reflect/value.go#L2115 "View Source")
```
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
```
Select函數執行cases切片描述的select操作。?類似go的select語句,它會阻塞直到至少一條case可以執行,從可執行的case中(偽)隨機的選擇一條,并執行該條case。它會返回選擇執行的case的索引,以及如果執行的是接收case時,會返回接收到的值,以及一個布爾值說明該值是否對應于通道中某次發送的值(用以區分通道關閉時接收到的零值,此時recvOK會設為false)。
## type [Method](https://github.com/golang/go/blob/master/src/reflect/type.go#L384 "View Source")
```
type Method struct {
// Name是方法名。PkgPath是非導出字段的包路徑,對導出字段該字段為""。
// 結合PkgPath和Name可以從方法集中指定一個方法。
// 參見http://golang.org/ref/spec#Uniqueness_of_identifiers
Name string
PkgPath string
Type Type // 方法類型
Func Value // 方法的值
Index int // 用于Type.Method的索引
}
```
Method代表一個方法。
## type [Type](https://github.com/golang/go/blob/master/src/reflect/type.go#L32 "View Source")
```
type Type interface {
// Kind返回該接口的具體分類
Kind() Kind
// Name返回該類型在自身包內的類型名,如果是未命名類型會返回""
Name() string
// PkgPath返回類型的包路徑,即明確指定包的import路徑,如"encoding/base64"
// 如果類型為內建類型(string, error)或未命名類型(*T, struct{}, []int),會返回""
PkgPath() string
// 返回類型的字符串表示。該字符串可能會使用短包名(如用base64代替"encoding/base64")
// 也不保證每個類型的字符串表示不同。如果要比較兩個類型是否相等,請直接用Type類型比較。
String() string
// 返回要保存一個該類型的值需要多少字節;類似unsafe.Sizeof
Size() uintptr
// 返回當從內存中申請一個該類型值時,會對齊的字節數
Align() int
// 返回當該類型作為結構體的字段時,會對齊的字節數
FieldAlign() int
// 如果該類型實現了u代表的接口,會返回真
Implements(u Type) bool
// 如果該類型的值可以直接賦值給u代表的類型,返回真
AssignableTo(u Type) bool
// 如該類型的值可以轉換為u代表的類型,返回真
ConvertibleTo(u Type) bool
// 返回該類型的字位數。如果該類型的Kind不是Int、Uint、Float或Complex,會panic
Bits() int
// 返回array類型的長度,如非數組類型將panic
Len() int
// 返回該類型的元素類型,如果該類型的Kind不是Array、Chan、Map、Ptr或Slice,會panic
Elem() Type
// 返回map類型的鍵的類型。如非映射類型將panic
Key() Type
// 返回一個channel類型的方向,如非通道類型將會panic
ChanDir() ChanDir
// 返回struct類型的字段數(匿名字段算作一個字段),如非結構體類型將panic
NumField() int
// 返回struct類型的第i個字段的類型,如非結構體或者i不在[0, NumField())內將會panic
Field(i int) StructField
// 返回索引序列指定的嵌套字段的類型,
// 等價于用索引中每個值鏈式調用本方法,如非結構體將會panic
FieldByIndex(index []int) StructField
// 返回該類型名為name的字段(會查找匿名字段及其子字段),
// 布爾值說明是否找到,如非結構體將panic
FieldByName(name string) (StructField, bool)
// 返回該類型第一個字段名滿足函數match的字段,布爾值說明是否找到,如非結構體將會panic
FieldByNameFunc(match func(string) bool) (StructField, bool)
// 如果函數類型的最后一個輸入參數是"..."形式的參數,IsVariadic返回真
// 如果這樣,t.In(t.NumIn() - 1)返回參數的隱式的實際類型(聲明類型的切片)
// 如非函數類型將panic
IsVariadic() bool
// 返回func類型的參數個數,如果不是函數,將會panic
NumIn() int
// 返回func類型的第i個參數的類型,如非函數或者i不在[0, NumIn())內將會panic
In(i int) Type
// 返回func類型的返回值個數,如果不是函數,將會panic
NumOut() int
// 返回func類型的第i個返回值的類型,如非函數或者i不在[0, NumOut())內將會panic
Out(i int) Type
// 返回該類型的方法集中方法的數目
// 匿名字段的方法會被計算;主體類型的方法會屏蔽匿名字段的同名方法;
// 匿名字段導致的歧義方法會濾除
NumMethod() int
// 返回該類型方法集中的第i個方法,i不在[0, NumMethod())范圍內時,將導致panic
// 對非接口類型T或*T,返回值的Type字段和Func字段描述方法的未綁定函數狀態
// 對接口類型,返回值的Type字段描述方法的簽名,Func字段為nil
Method(int) Method
// 根據方法名返回該類型方法集中的方法,使用一個布爾值說明是否發現該方法
// 對非接口類型T或*T,返回值的Type字段和Func字段描述方法的未綁定函數狀態
// 對接口類型,返回值的Type字段描述方法的簽名,Func字段為nil
MethodByName(string) (Method, bool)
// 內含隱藏或非導出方法
}
```
Type類型用來表示一個go類型。
不是所有go類型的Type值都能使用所有方法。請參見每個方法的文檔獲取使用限制。在調用有分類限定的方法時,應先使用Kind方法獲知類型的分類。調用該分類不支持的方法會導致運行時的panic。
### func [TypeOf](https://github.com/golang/go/blob/master/src/reflect/type.go#L1005 "View Source")
```
func TypeOf(i interface{}) Type
```
TypeOf返回接口中保存的值的類型,TypeOf(nil)會返回nil。
### func [PtrTo](https://github.com/golang/go/blob/master/src/reflect/type.go#L1044 "View Source")
```
func PtrTo(t Type) Type
```
PtrTo返回類型t的指針的類型。
### func [SliceOf](https://github.com/golang/go/blob/master/src/reflect/type.go#L1702 "View Source")
```
func SliceOf(t Type) Type
```
SliceOf返回類型t的切片的類型。
### func [MapOf](https://github.com/golang/go/blob/master/src/reflect/type.go#L1507 "View Source")
```
func MapOf(key, elem Type) Type
```
MapOf返回一個鍵類型為key,值類型為elem的映射類型。如果key代表的類型不是合法的映射鍵類型(即它未實現go的==操作符),本函數會panic。
### func [ChanOf](https://github.com/golang/go/blob/master/src/reflect/type.go#L1437 "View Source")
```
func ChanOf(dir ChanDir, t Type) Type
```
ChanOf返回元素類型為t、方向為dir的通道類型。運行時GC強制將通道的元素類型的大小限定為64kb。如果t的尺寸大于或等于該限制,本函數將會panic。
## type [Value](https://github.com/golang/go/blob/master/src/reflect/value.go#L61 "View Source")
```
type Value struct {
// 內含隱藏或非導出字段
}
```
Value為go值提供了反射接口。
不是所有go類型值的Value表示都能使用所有方法。請參見每個方法的文檔獲取使用限制。在調用有分類限定的方法時,應先使用Kind方法獲知該值的分類。調用該分類不支持的方法會導致運行時的panic。
Value類型的零值表示不持有某個值。零值的IsValid方法返回false,其Kind方法返回Invalid,而String方法返回"<invalid Value>",所有其它方法都會panic。絕大多數函數和方法都永遠不返回Value零值。如果某個函數/方法返回了非法的Value,它的文檔必須顯式的說明具體情況。
如果某個go類型值可以安全的用于多線程并發操作,它的Value表示也可以安全的用于并發。
### func [ValueOf](https://github.com/golang/go/blob/master/src/reflect/value.go#L2268 "View Source")
```
func ValueOf(i interface{}) Value
```
ValueOf返回一個初始化為i接口保管的具體值的Value,ValueOf(nil)返回Value零值。
### func [Zero](https://github.com/golang/go/blob/master/src/reflect/value.go#L2288 "View Source")
```
func Zero(typ Type) Value
```
Zero返回一個持有類型typ的零值的Value。注意持有零值的Value和Value零值是兩回事。Value零值表示不持有任何值。例如Zero(TypeOf(42))返回一個Kind為Int、值為0的Value。Zero的返回值不能設置也不會尋址。
### func [New](https://github.com/golang/go/blob/master/src/reflect/value.go#L2302 "View Source")
```
func New(typ Type) Value
```
New返回一個Value類型值,該值持有一個指向類型為typ的新申請的零值的指針,返回值的Type為PtrTo(typ)。
### func [NewAt](https://github.com/golang/go/blob/master/src/reflect/value.go#L2313 "View Source")
```
func NewAt(typ Type, p unsafe.Pointer) Value
```
NewAt返回一個Value類型值,該值持有一個指向類型為typ、地址為p的值的指針。
### func [Indirect](https://github.com/golang/go/blob/master/src/reflect/value.go#L2259 "View Source")
```
func Indirect(v Value) Value
```
返回持有v持有的指針指向的值的Value。如果v持有nil指針,會返回Value零值;如果v不持有指針,會返回v。
### func [MakeSlice](https://github.com/golang/go/blob/master/src/reflect/value.go#L2214 "View Source")
```
func MakeSlice(typ Type, len, cap int) Value
```
MakeSlice創建一個新申請的元素類型為typ,長度len容量cap的切片類型的Value值。
### func [MakeMap](https://github.com/golang/go/blob/master/src/reflect/value.go#L2248 "View Source")
```
func MakeMap(typ Type) Value
```
MakeMap創建一個特定映射類型的Value值。
### func [MakeChan](https://github.com/golang/go/blob/master/src/reflect/value.go#L2233 "View Source")
```
func MakeChan(typ Type, buffer int) Value
```
MakeChan創建一個元素類型為typ、有buffer個緩存的通道類型的Value值。
### func [MakeFunc](https://github.com/golang/go/blob/master/src/reflect/makefunc.go#L43 "View Source")
```
func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value
```
MakeFunc返回一個具有給定類型、包裝函數fn的函數的Value封裝。當被調用時,該函數會:
```
- 將提供給它的參數轉化為Value切片
- 執行results := fn(args)
- 將results中每一個result依次排列作為返回值
```
函數fn的實現可以假設參數Value切片匹配typ類型指定的參數數目和類型。如果typ表示一個可變參數函數類型,參數切片中最后一個Value本身必須是一個包含所有可變參數的切片。fn返回的結果Value切片也必須匹配typ類型指定的結果數目和類型。
Value.Call方法允許程序員使用Value調用一個有類型約束的函數;反過來,MakeFunc方法允許程序員使用Value實現一個有類型約束的函數。
下例是一個用MakeFunc創建一個生成不同參數類型的swap函數的代碼及其說明。
Example
```
// swap is the implementation passed to MakeFunc.
// It must work in terms of reflect.Values so that it is possible
// to write code without knowing beforehand what the types
// will be.
swap := func(in []reflect.Value) []reflect.Value {
return []reflect.Value{in[1], in[0]}
}
// makeSwap expects fptr to be a pointer to a nil function.
// It sets that pointer to a new function created with MakeFunc.
// When the function is invoked, reflect turns the arguments
// into Values, calls swap, and then turns swap's result slice
// into the values returned by the new function.
makeSwap := func(fptr interface{}) {
// fptr is a pointer to a function.
// Obtain the function value itself (likely nil) as a reflect.Value
// so that we can query its type and then set the value.
fn := reflect.ValueOf(fptr).Elem()
// Make a function of the right type.
v := reflect.MakeFunc(fn.Type(), swap)
// Assign it to the value fn represents.
fn.Set(v)
}
// Make and call a swap function for ints.
var intSwap func(int, int) (int, int)
makeSwap(&intSwap)
fmt.Println(intSwap(0, 1))
// Make and call a swap function for float64s.
var floatSwap func(float64, float64) (float64, float64)
makeSwap(&floatSwap)
fmt.Println(floatSwap(2.72, 3.14))
```
Output:
```
1 0
3.14 2.72
```
### func [Append](https://github.com/golang/go/blob/master/src/reflect/value.go#L1980 "View Source")
```
func Append(s Value, x ...Value) Value
```
向切片類型的Value值s中添加一系列值,x等Value值持有的值必須能直接賦值給s持有的切片的元素類型。
### func [AppendSlice](https://github.com/golang/go/blob/master/src/reflect/value.go#L1991 "View Source")
```
func AppendSlice(s, t Value) Value
```
類似Append函數,但接受一個切片類型的Value值。將切片t的每一個值添加到s。
### func (Value) [IsValid](https://github.com/golang/go/blob/master/src/reflect/value.go#L1148 "View Source")
```
func (v Value) IsValid() bool
```
IsValid返回v是否持有一個值。如果v是Value零值會返回假,此時v除了IsValid、String、Kind之外的方法都會導致panic。絕大多數函數和方法都永遠不返回Value零值。如果某個函數/方法返回了非法的Value,它的文檔必須顯式的說明具體情況。
### func (Value) [IsNil](https://github.com/golang/go/blob/master/src/reflect/value.go#L1123 "View Source")
```
func (v Value) IsNil() bool
```
IsNil報告v持有的值是否為nil。v持有的值的分類必須是通道、函數、接口、映射、指針、切片之一;否則IsNil函數會導致panic。注意IsNil并不總是等價于go語言中值與nil的常規比較。例如:如果v是通過使用某個值為nil的接口調用ValueOf函數創建的,v.IsNil()返回真,但是如果v是Value零值,會panic。
### func (Value) [Kind](https://github.com/golang/go/blob/master/src/reflect/value.go#L1154 "View Source")
```
func (v Value) Kind() Kind
```
Kind返回v持有的值的分類,如果v是Value零值,返回值為Invalid
### func (Value) [Type](https://github.com/golang/go/blob/master/src/reflect/value.go#L1834 "View Source")
```
func (v Value) Type() Type
```
返回v持有的值的類型的Type表示。
### func (Value) [Convert](https://github.com/golang/go/blob/master/src/reflect/value.go#L2355 "View Source")
```
func (v Value) Convert(t Type) Value
```
Convert將v持有的值轉換為類型為t的值,并返回該值的Value封裝。如果go轉換規則不支持這種轉換,會panic。
### func (Value) [Elem](https://github.com/golang/go/blob/master/src/reflect/value.go#L831 "View Source")
```
func (v Value) Elem() Value
```
Elem返回v持有的接口保管的值的Value封裝,或者v持有的指針指向的值的Value封裝。如果v的Kind不是Interface或Ptr會panic;如果v持有的值為nil,會返回Value零值。
### func (Value) [Bool](https://github.com/golang/go/blob/master/src/reflect/value.go#L352 "View Source")
```
func (v Value) Bool() bool
```
返回v持有的布爾值,如果v的Kind不是Bool會panic
### func (Value) [Int](https://github.com/golang/go/blob/master/src/reflect/value.go#L1031 "View Source")
```
func (v Value) Int() int64
```
返回v持有的有符號整數(表示為int64),如果v的Kind不是Int、Int8、Int16、Int32、Int64會panic
### func (Value) [OverflowInt](https://github.com/golang/go/blob/master/src/reflect/value.go#L1361 "View Source")
```
func (v Value) OverflowInt(x int64) bool
```
如果v持有值的類型不能無溢出的表示x,會返回真。如果v的Kind不是Int、Int8、Int16、Int32、Int64會panic
### func (Value) [Uint](https://github.com/golang/go/blob/master/src/reflect/value.go#L1867 "View Source")
```
func (v Value) Uint() uint64
```
返回v持有的無符號整數(表示為uint64),如v的Kind不是Uint、Uintptr、Uint8、Uint16、Uint32、Uint64會panic
### func (Value) [OverflowUint](https://github.com/golang/go/blob/master/src/reflect/value.go#L1374 "View Source")
```
func (v Value) OverflowUint(x uint64) bool
```
如果v持有值的類型不能無溢出的表示x,會返回真。如果v的Kind不是Uint、Uintptr、Uint8、Uint16、Uint32、Uint64會panic
### func (Value) [Float](https://github.com/golang/go/blob/master/src/reflect/value.go#L948 "View Source")
```
func (v Value) Float() float64
```
返回v持有的浮點數(表示為float64),如果v的Kind不是Float32、Float64會panic
### func (Value) [OverflowFloat](https://github.com/golang/go/blob/master/src/reflect/value.go#L1341 "View Source")
```
func (v Value) OverflowFloat(x float64) bool
```
如果v持有值的類型不能無溢出的表示x,會返回真。如果v的Kind不是Float32、Float64會panic
### func (Value) [Complex](https://github.com/golang/go/blob/master/src/reflect/value.go#L812 "View Source")
```
func (v Value) Complex() complex128
```
返回v持有的復數(表示為complex64),如果v的Kind不是Complex64、Complex128會panic
### func (Value) [OverflowComplex](https://github.com/golang/go/blob/master/src/reflect/value.go#L1328 "View Source")
```
func (v Value) OverflowComplex(x complex128) bool
```
如果v持有值的類型不能無溢出的表示x,會返回真。如果v的Kind不是Complex64、Complex128會panic
### func (Value) [Pointer](https://github.com/golang/go/blob/master/src/reflect/value.go#L1399 "View Source")
```
func (v Value) Pointer() uintptr
```
將v持有的值作為一個指針返回。本方法返回值不是unsafe.Pointer類型,以避免程序員不顯式導入unsafe包卻得到unsafe.Pointer類型表示的指針。如果v的Kind不是Chan、Func、Map、Ptr、Slice或UnsafePointer會panic。
如果v的Kind是Func,返回值是底層代碼的指針,但并不足以用于區分不同的函數;只能保證當且僅當v持有函數類型零值nil時,返回值為0。
如果v的Kind是Slice,返回值是指向切片第一個元素的指針。如果持有的切片為nil,返回值為0;如果持有的切片沒有元素但不是nil,返回值不會是0。
### func (Value) [Bytes](https://github.com/golang/go/blob/master/src/reflect/value.go#L362 "View Source")
```
func (v Value) Bytes() []byte
```
返回v持有的[]byte類型值。如果v持有的值的類型不是[]byte會panic。
### func (Value) [String](https://github.com/golang/go/blob/master/src/reflect/value.go#L1800 "View Source")
```
func (v Value) String() string
```
返回v持有的值的字符串表示。因為go的String方法的慣例,Value的String方法比較特別。和其他獲取v持有值的方法不同:v的Kind是String時,返回該字符串;v的Kind不是String時也不會panic而是返回格式為"<T value>"的字符串,其中T是v持有值的類型。
### func (Value) [InterfaceData](https://github.com/golang/go/blob/master/src/reflect/value.go#L1105 "View Source")
```
func (v Value) InterfaceData() [2]uintptr
```
返回v持有的接口類型值的數據。如果v的Kind不是Interface會panic
### func (Value) [Slice](https://github.com/golang/go/blob/master/src/reflect/value.go#L1698 "View Source")
```
func (v Value) Slice(i, j int) Value
```
返回v[i:j](v持有的切片的子切片的Value封裝);如果v的Kind不是Array、Slice或String會panic。如果v是一個不可尋址的數組,或者索引出界,也會panic
### func (Value) [Slice3](https://github.com/golang/go/blob/master/src/reflect/value.go#L1752 "View Source")
```
func (v Value) Slice3(i, j, k int) Value
```
是Slice的3參數版本,返回v[i:j:k]?;如果v的Kind不是Array、Slice或String會panic。如果v是一個不可尋址的數組,或者索引出界,也會panic。
### func (Value) [Cap](https://github.com/golang/go/blob/master/src/reflect/value.go#L788 "View Source")
```
func (v Value) Cap() int
```
返回v持有值的容量,如果v的Kind不是Array、Chan、Slice會panic
### func (Value) [Len](https://github.com/golang/go/blob/master/src/reflect/value.go#L1160 "View Source")
```
func (v Value) Len() int
```
返回v持有值的長度,如果v的Kind不是Array、Chan、Slice、Map、String會panic
### func (Value) [Index](https://github.com/golang/go/blob/master/src/reflect/value.go#L969 "View Source")
```
func (v Value) Index(i int) Value
```
返回v持有值的第i個元素。如果v的Kind不是Array、Chan、Slice、String,或者i出界,會panic
### func (Value) [MapIndex](https://github.com/golang/go/blob/master/src/reflect/value.go#L1184 "View Source")
```
func (v Value) MapIndex(key Value) Value
```
返回v持有值里key持有值為鍵對應的值的Value封裝。如果v的Kind不是Map會panic。如果未找到對應值或者v持有值是nil映射,會返回Value零值。key的持有值必須可以直接賦值給v持有值類型的鍵類型。
### func (Value) [MapKeys](https://github.com/golang/go/blob/master/src/reflect/value.go#L1229 "View Source")
```
func (v Value) MapKeys() []Value
```
返回一個包含v持有值中所有鍵的Value封裝的切片,該切片未排序。如果v的Kind不是Map會panic。如果v持有值是nil,返回空切片(非nil)。
### func (Value) [NumField](https://github.com/golang/go/blob/master/src/reflect/value.go#L1320 "View Source")
```
func (v Value) NumField() int
```
返回v持有的結構體類型值的字段數,如果v的Kind不是Struct會panic
### func (Value) [Field](https://github.com/golang/go/blob/master/src/reflect/value.go#L866 "View Source")
```
func (v Value) Field(i int) Value
```
返回結構體的第i個字段(的Value封裝)。如果v的Kind不是Struct或i出界會panic
### func (Value) [FieldByIndex](https://github.com/golang/go/blob/master/src/reflect/value.go#L907 "View Source")
```
func (v Value) FieldByIndex(index []int) Value
```
返回索引序列指定的嵌套字段的Value表示,等價于用索引中的值鏈式調用本方法,如v的Kind非Struct將會panic
### func (Value) [FieldByName](https://github.com/golang/go/blob/master/src/reflect/value.go#L926 "View Source")
```
func (v Value) FieldByName(name string) Value
```
返回該類型名為name的字段(的Value封裝)(會查找匿名字段及其子字段),如果v的Kind不是Struct會panic;如果未找到會返回Value零值。
### func (Value) [FieldByNameFunc](https://github.com/golang/go/blob/master/src/reflect/value.go#L938 "View Source")
```
func (v Value) FieldByNameFunc(match func(string) bool) Value
```
返回該類型第一個字段名滿足match的字段(的Value封裝)(會查找匿名字段及其子字段),如果v的Kind不是Struct會panic;如果未找到會返回Value零值。
### func (Value) [Recv](https://github.com/golang/go/blob/master/src/reflect/value.go#L1435 "View Source")
```
func (v Value) Recv() (x Value, ok bool)
```
方法從v持有的通道接收并返回一個值(的Value封裝)。如果v的Kind不是Chan會panic。方法會阻塞直到獲取到值。如果返回值x對應于某個發送到v持有的通道的值,ok為真;如果因為通道關閉而返回,x為Value零值而ok為假。
### func (Value) [TryRecv](https://github.com/golang/go/blob/master/src/reflect/value.go#L1817 "View Source")
```
func (v Value) TryRecv() (x Value, ok bool)
```
TryRecv嘗試從v持有的通道接收一個值,但不會阻塞。如果v的Kind不是Chan會panic。如果方法成功接收到一個值,會返回該值(的Value封裝)和true;如果不能無阻塞的接收到值,返回Value零值和false;如果因為通道關閉而返回,返回值x是持有通道元素類型的零值的Value和false。
### func (Value) [Send](https://github.com/golang/go/blob/master/src/reflect/value.go#L1470 "View Source")
```
func (v Value) Send(x Value)
```
方法向v持有的通道發送x持有的值。如果v的Kind不是Chan,或者x的持有值不能直接賦值給v持有通道的元素類型,會panic。
### func (Value) [TrySend](https://github.com/golang/go/blob/master/src/reflect/value.go#L1827 "View Source")
```
func (v Value) TrySend(x Value) bool
```
TrySend嘗試向v持有的通道發送x持有的值,但不會阻塞。如果v的Kind不是Chan會panic。如果成功發送會返回真,否則返回假。x的持有值必須可以直接賦值給v持有通道的元素類型。
### func (Value) [Close](https://github.com/golang/go/blob/master/src/reflect/value.go#L804 "View Source")
```
func (v Value) Close()
```
關閉v持有的通道,如果v的Kind不是Chan會panic
### func (Value) [Call](https://github.com/golang/go/blob/master/src/reflect/value.go#L408 "View Source")
```
func (v Value) Call(in []Value) []Value
```
Call方法使用輸入的參數in調用v持有的函數。例如,如果len(in) == 3,v.Call(in)代表調用v(in[0], in[1], in[2])(其中Value值表示其持有值)。如果v的Kind不是Func會panic。它返回函數所有輸出結果的Value封裝的切片。和go代碼一樣,每一個輸入實參的持有值都必須可以直接賦值給函數對應輸入參數的類型。如果v持有值是可變參數函數,Call方法會自行創建一個代表可變參數的切片,將對應可變參數的值都拷貝到里面。
### func (Value) [CallSlice](https://github.com/golang/go/blob/master/src/reflect/value.go#L421 "View Source")
```
func (v Value) CallSlice(in []Value) []Value
```
CallSlice調用v持有的可變參數函數,會將切片類型的in[len(in)-1](的成員)分配給v的最后的可變參數。例如,如果len(in) == 3,v.Call(in)代表調用v(in[0], in[1], in[2])(其中Value值表示其持有值,可變參數函數的可變參數位置提供一個切片并跟三個點號代表"解切片")。如果v的Kind不是Func或者v的持有值不是可變參數函數,會panic。它返回函數所有輸出結果的Value封裝的切片。和go代碼一樣,每一個輸入實參的持有值都必須可以直接賦值給函數對應輸入參數的類型。
### func (Value) [NumMethod](https://github.com/golang/go/blob/master/src/reflect/value.go#L1289 "View Source")
```
func (v Value) NumMethod() int
```
返回v持有值的方法集的方法數目。
### func (Value) [Method](https://github.com/golang/go/blob/master/src/reflect/value.go#L1272 "View Source")
```
func (v Value) Method(i int) Value
```
返回v持有值類型的第i個方法的已綁定(到v的持有值的)狀態的函數形式的Value封裝。返回值調用Call方法時不應包含接收者;返回值持有的函數總是使用v的持有者作為接收者(即第一個參數)。如果i出界,或者v的持有值是接口類型的零值(nil),會panic。
### func (Value) [MethodByName](https://github.com/golang/go/blob/master/src/reflect/value.go#L1304 "View Source")
```
func (v Value) MethodByName(name string) Value
```
返回v的名為name的方法的已綁定(到v的持有值的)狀態的函數形式的Value封裝。返回值調用Call方法時不應包含接收者;返回值持有的函數總是使用v的持有者作為接收者(即第一個參數)。如果未找到該方法,會返回一個Value零值。
### func (Value) [CanAddr](https://github.com/golang/go/blob/master/src/reflect/value.go#L387 "View Source")
```
func (v Value) CanAddr() bool
```
返回是否可以獲取v持有值的指針。可以獲取指針的值被稱為可尋址的。如果一個值是切片或可尋址數組的元素、可尋址結構體的字段、或從指針解引用得到的,該值即為可尋址的。
### func (Value) [Addr](https://github.com/golang/go/blob/master/src/reflect/value.go#L343 "View Source")
```
func (v Value) Addr() Value
```
函數返回一個持有指向v持有者的指針的Value封裝。如果v.CanAddr()返回假,調用本方法會panic。Addr一般用于獲取結構體字段的指針或者切片的元素(的Value封裝)以便調用需要指針類型接收者的方法。
### func (Value) [UnsafeAddr](https://github.com/golang/go/blob/master/src/reflect/value.go#L1897 "View Source")
```
func (v Value) UnsafeAddr() uintptr
```
返回指向v持有數據的地址的指針(表示為uintptr)以用作高級用途,如果v不可尋址會panic。
### func (Value) [CanInterface](https://github.com/golang/go/blob/master/src/reflect/value.go#L1057 "View Source")
```
func (v Value) CanInterface() bool
```
如果CanInterface返回真,v可以不導致panic的調用Interface方法。
### func (Value) [Interface](https://github.com/golang/go/blob/master/src/reflect/value.go#L1069 "View Source")
```
func (v Value) Interface() (i interface{})
```
本方法返回v當前持有的值(表示為/保管在interface{}類型),等價于:
```
var i interface{} = (v's underlying value)
```
如果v是通過訪問非導出結構體字段獲取的,會導致panic。
### func (Value) [CanSet](https://github.com/golang/go/blob/master/src/reflect/value.go#L396 "View Source")
```
func (v Value) CanSet() bool
```
如果v持有的值可以被修改,CanSet就會返回真。只有一個Value持有值可以被尋址同時又不是來自非導出字段時,它才可以被修改。如果CanSet返回假,調用Set或任何限定類型的設置函數(如SetBool、SetInt64)都會panic。
### func (Value) [SetBool](https://github.com/golang/go/blob/master/src/reflect/value.go#L1518 "View Source")
```
func (v Value) SetBool(x bool)
```
設置v的持有值。如果v的Kind不是Bool或者v.CanSet()返回假,會panic。
### func (Value) [SetInt](https://github.com/golang/go/blob/master/src/reflect/value.go#L1576 "View Source")
```
func (v Value) SetInt(x int64)
```
設置v的持有值。如果v的Kind不是Int、Int8、Int16、Int32、Int64之一或者v.CanSet()返回假,會panic。
### func (Value) [SetUint](https://github.com/golang/go/blob/master/src/reflect/value.go#L1659 "View Source")
```
func (v Value) SetUint(x uint64)
```
設置v的持有值。如果v的Kind不是Uint、Uintptr、Uint8、Uint16、Uint32、Uint64或者v.CanSet()返回假,會panic。
### func (Value) [SetFloat](https://github.com/golang/go/blob/master/src/reflect/value.go#L1562 "View Source")
```
func (v Value) SetFloat(x float64)
```
設置v的持有值。如果v的Kind不是Float32、Float64或者v.CanSet()返回假,會panic。
### func (Value) [SetComplex](https://github.com/golang/go/blob/master/src/reflect/value.go#L1548 "View Source")
```
func (v Value) SetComplex(x complex128)
```
設置v的持有值。如果v的Kind不是Complex64、Complex128或者v.CanSet()返回假,會panic。
### func (Value) [SetBytes](https://github.com/golang/go/blob/master/src/reflect/value.go#L1526 "View Source")
```
func (v Value) SetBytes(x []byte)
```
設置v的持有值。如果v持有值不是[]byte類型或者v.CanSet()返回假,會panic。
### func (Value) [SetString](https://github.com/golang/go/blob/master/src/reflect/value.go#L1689 "View Source")
```
func (v Value) SetString(x string)
```
設置v的持有值。如果v的Kind不是String或者v.CanSet()返回假,會panic。
### func (Value) [SetPointer](https://github.com/golang/go/blob/master/src/reflect/value.go#L1681 "View Source")
```
func (v Value) SetPointer(x unsafe.Pointer)
```
設置v的持有值。如果v的Kind不是UnsafePointer或者v.CanSet()返回假,會panic。
### func (Value) [SetCap](https://github.com/golang/go/blob/master/src/reflect/value.go#L1610 "View Source")
```
func (v Value) SetCap(n int)
```
設定v持有值的容量。如果v的Kind不是Slice或者n出界(小于長度或超出容量),將導致panic
### func (Value) [SetLen](https://github.com/golang/go/blob/master/src/reflect/value.go#L1597 "View Source")
```
func (v Value) SetLen(n int)
```
設定v持有值的長度。如果v的Kind不是Slice或者n出界(小于零或超出容量),將導致panic
### func (Value) [SetMapIndex](https://github.com/golang/go/blob/master/src/reflect/value.go#L1626 "View Source")
```
func (v Value) SetMapIndex(key, val Value)
```
用來給v的映射類型持有值添加/修改鍵值對,如果val是Value零值,則是刪除鍵值對。如果v的Kind不是Map,或者v的持有值是nil,將會panic。key的持有值必須可以直接賦值給v持有值類型的鍵類型。val的持有值必須可以直接賦值給v持有值類型的值類型。
### func (Value) [Set](https://github.com/golang/go/blob/master/src/reflect/value.go#L1499 "View Source")
```
func (v Value) Set(x Value)
```
將v的持有值修改為x的持有值。如果v.CanSet()返回假,會panic。x的持有值必須能直接賦給v持有值的類型。
## func [Copy](https://github.com/golang/go/blob/master/src/reflect/value.go#L2005 "View Source")
```
func Copy(dst, src Value) int
```
將src中的值拷貝到dst,直到src被耗盡或者dst被裝滿,要求這二者都是slice或array,且元素類型相同。
## func [DeepEqual](https://github.com/golang/go/blob/master/src/reflect/deepequal.go#L135 "View Source")
```
func DeepEqual(a1, a2 interface{}) bool
```
用來判斷兩個值是否深度一致:除了類型相同;在可以時(主要是基本類型)會使用==;但還會比較array、slice的成員,map的鍵值對,結構體字段進行深入比對。map的鍵值對,對鍵只使用==,但值會繼續往深層比對。DeepEqual函數可以正確處理循環的類型。函數類型只有都會nil時才相等;空切片不等于nil切片;還會考慮array、slice的長度、map鍵值對數。
## Bugs
[?](https://github.com/golang/go/blob/master/src/reflect/type.go#L192 "View Source")FieldByName及相關的函數會將名稱相同的結構體字段視為相同的字段,即使它們是來自不同包的非導出字段。這導致如果結構體類型t包含多個名為x的字段的話(被不同的包嵌入)t.FieldByName("x")的行為沒有良好的定義。FieldByName可能會返回其中一個名為x的字段,也可能報告說沒有這個字段。細節參見golang.org/issue/4876。
- 庫
- package achive
- package tar
- package zip
- package bufio
- package builtin
- package bytes
- package compress
- package bzip2
- package flate
- package gzip
- package lzw
- package zlib
- package container
- package heap
- package list
- package ring
- package crypto
- package aes
- package cipher
- package des
- package dsa
- package ecdsa
- package elliptic
- package hmac
- package md5
- package rand
- package rc4
- package rsa
- package sha1
- package sha256
- package sha512
- package subtle
- package tls
- package x509
- package pkix
- package database
- package sql
- package driver
- package encoding
- package ascii85
- package asn1
- package base32
- package base64
- package binary
- package csv
- package gob
- package hex
- package json
- package pem
- package xml
- package errors
- package expvar
- package flag
- package fmt
- package go
- package doc
- package format
- package parser
- package printer
- package hash
- package adler32
- package crc32
- package crc64
- package fnv
- package html
- package template
- package image
- package color
- package palette
- package draw
- package gif
- package jpeg
- package png
- package index
- package suffixarray
- package io
- package ioutil
- package log
- package syslog
- package math
- package big
- package cmplx
- package rand
- package mime
- package multipart
- package net
- package http
- package cgi
- package cookiejar
- package fcgi
- package httptest
- package httputil
- package pprof
- package mail
- package rpc
- package jsonrpc
- package smtp
- package textproto
- package url
- package os
- package exec
- package signal
- package user
- package path
- package filepath
- package reflect
- package regexp
- package runtime
- package cgo
- package debug
- package pprof
- package race
- package sort
- package strconv
- package strings
- package sync
- package atomic
- package text
- package scanner
- package tabwriter
- package template
- package time
- package unicode
- package utf16
- package utf8
- package unsafe