UDP服务端
===
~~~
func main() {
// 解析得到UDP地址
addr, e := net.ResolveUDPAddr("udp", ":9001")
err.CheckErr(e)
// 在UDP地址上建立UDP监听,得到连接
conn, e := net.ListenUDP("udp", addr)
err.CheckErr(e)
defer conn.Close()
// 建立缓冲区
buffer := make([]byte, 1024)
for {
//从连接中读取内容,丢入缓冲区
i, udpAddr, e := conn.ReadFromUDP(buffer)
// 第一个是字节长度,第二个是udp的地址
if e != nil {
continue
}
fmt.Printf("来自%v,读到的内容是:%s\n",udpAddr,buffer[:i])
// 向客户端返回消息
conn.WriteToUDP([]byte("hello"),udpAddr)
}
}
~~~
- 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开发风格规范