阅读golang反射文档
This commit is contained in:
@@ -36,6 +36,13 @@
|
|||||||
- [slow path](#slow-path)
|
- [slow path](#slow-path)
|
||||||
- [Sync.once](#synconce)
|
- [Sync.once](#synconce)
|
||||||
- [use case](#use-case)
|
- [use case](#use-case)
|
||||||
|
- [reflect](#reflect)
|
||||||
|
- [reflect basic](#reflect-basic)
|
||||||
|
- [Type](#type)
|
||||||
|
- [Kind](#kind)
|
||||||
|
- [常用方法](#常用方法)
|
||||||
|
- [NumField](#numfield)
|
||||||
|
- [Field](#field)
|
||||||
- [syntax](#syntax)
|
- [syntax](#syntax)
|
||||||
- [iota](#iota)
|
- [iota](#iota)
|
||||||
|
|
||||||
@@ -805,6 +812,66 @@ func (o *Once) doSlow(f func()) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## reflect
|
||||||
|
### reflect basic
|
||||||
|
go reflection基于`Values, Types, Kinds`,其相关类为`reflect.Value, reflect.Type, reflect.Kind`,获取方式如下:
|
||||||
|
- `reflect.ValueOf(x interface{})`
|
||||||
|
- `refelct.TypeOf(x interface{})`
|
||||||
|
- `Type.kind()`
|
||||||
|
|
||||||
|
#### Type
|
||||||
|
type用于表示go中的类型,通过`reflect.TypeOf(x interface{})`来进行获取
|
||||||
|
```go
|
||||||
|
fmt.Println(reflect.TypeOf(Addr{})) // main.Addr
|
||||||
|
fmt.Println(reflect.TypeOf(&Addr{})) // *main.Addr
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Kind
|
||||||
|
kind用于表示`类型`的数据类型,通过`.Kind`来进行获取:
|
||||||
|
```go
|
||||||
|
fmt.Println(reflect.TypeOf(Addr{}).Kind()) // struct
|
||||||
|
fmt.Println(reflect.TypeOf(&Addr{}).Kind()) // ptr
|
||||||
|
```
|
||||||
|
|
||||||
|
### 常用方法
|
||||||
|
golang反射还提供了其他的一些常用方法。
|
||||||
|
|
||||||
|
#### NumField
|
||||||
|
该方法返回struct中的fields数量,如果类型参数其kind不为`reflect.struct`,那么其会发生`panic`
|
||||||
|
|
||||||
|
```go
|
||||||
|
fmt.Println(reflect.TypeOf(Addr{}).NumField()) // 2
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Field
|
||||||
|
该方法允许通过下标来访问struct中的field。
|
||||||
|
|
||||||
|
```go
|
||||||
|
t := reflect.TypeOf(Addr{})
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
fmt.Println(t.Field(i))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
上述输出为
|
||||||
|
```
|
||||||
|
{FrmIp string 0 [0] false}
|
||||||
|
{DstIp string 16 [1] false}
|
||||||
|
```
|
||||||
|
|
||||||
|
根据反射遍历struct中的field,其示例如下:
|
||||||
|
```go
|
||||||
|
var v interface{} = Addr{FrmIp: "1.2.3.4", DstIp: "7.8.9.10"}
|
||||||
|
m := reflect.TypeOf(v).NumField()
|
||||||
|
for i := 0; i < m; i++ {
|
||||||
|
fn := reflect.TypeOf(v).Field(i).Name
|
||||||
|
fv := reflect.ValueOf(v).Field(i).String()
|
||||||
|
fmt.Println(fn, fv)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## syntax
|
## syntax
|
||||||
### iota
|
### iota
|
||||||
`iota`关键字代表连续的整数变量,`0, 1, 2`,每当`const`关键字出现时,其重置为0
|
`iota`关键字代表连续的整数变量,`0, 1, 2`,每当`const`关键字出现时,其重置为0
|
||||||
|
|||||||
Reference in New Issue
Block a user