利用反射编写灵活的代码
===
### 按名字访问结构体成员
`reflect.ValueOf(*e).FieldByName("name")`
### 按照名称访问结构体方法
`reflect.ValueOf(e).MethodByName("UpdateAge").Call([]reflect.Value{reflect.ValueOf(1)})`
### 重点
~~~
type Employee struct {
EmployeeId string
Name string
Age int
}
func (e *Employee) UpdateAge(val int) {
e.Age = val
}
func TestInvokeByName(t *testing.T) {
e := &Employee{"1", "DollarKiller", 20}
// 按照名字获取成员
//t.Logf("Name:value(%[1]v),Type(%[1]T)",reflect.ValueOf(*e).FieldByName("Name"))
fmt.Println(reflect.ValueOf(*e).FieldByName("Name"))
fmt.Println(reflect.ValueOf(*e).FieldByIndex([]int{2}))
if field, err := reflect.TypeOf(*e).FieldByName("Name");err != true {
t.Fatal(err)
}else{
t.Log(field)
}
reflect.ValueOf(e).MethodByName("UpdateAge").
Call([]reflect.Value{reflect.ValueOf(1)})
// MethodByName("UpdateAge") 参数名称
// Call([]reflect.Value{reflect.ValueOf(1)}) 1这个是参数
t.Log(e)
}
~~~
- Hello World
- UDP
- UDP服务端
- UDP客户端
- UDP广播
- 错误处理
- 编写好的异常处理
- panic和recover
- 并发编程
- Hello Goruntine
- 共享内存并发机制
- RWMutex
- CSP并发机制
- 多路复用和超时控制
- 通道关闭与广播
- Context与任务的取消
- 只运行一次
- 按需任意任务完成
- 所有任务完成
- 补充:range channel注意实现
- 对象池
- sync.Pool临时对象池
- 单元测试
- 表格测试法
- Banchmark
- BDD
- 反射
- 利用反射编写灵活的代码
- Struct Tag
- 万能程序
- 常用架构模式
- Pipe-filter pattern
- Micro Kernel
- 性能分析
- 高性能代码
- sync.MAP分析
- Concurrent Map
- GC友好的代码
- Uber开发风格规范