golang经常使用的功能封装函数

时间处理与字符串操作技巧
本文介绍了如何在Go语言中进行时间戳转换为日期格式、字符串的截取以及生成32位MD5的方法。通过具体函数实现,展示了时间布局设置、错误处理及哈希算法的应用。
//时间戳转换成年月日
func TimeTransDate() string {
   timeLayout := "2006-01-02 15:04:05"
   date_time := time.Unix(time.Now().Unix(), 0).Format(timeLayout)
   return date_time
}

 

//截取字符串 start 起点下标 end 终点下标(不包括)
func Substr(str string, start int, end int) (string,error) {
   rs := []rune(str)
   length := len(rs)

   if start < 0 || start > length {
      return "",errors.New("start is wrong:"+string(start))
   }

   if end < 0 || end > length {
      return "",errors.New("end is wrong:"+string(start))
   }

   return string(rs[start:end]),nil
}

 

// 生成32位MD5
func MD5(text string) string{
   ctx := md5.New()
   ctx.Write([]byte(text))
   return hex.EncodeToString(ctx.Sum(nil))
}
<think>好的,用户让我用Golang的面向对象来封装UDP。首先我得回忆一下Golang的面相对象特性,毕竟它没有类,而是用结构体和方法来实现的。那UDP的话,应该需要封装一个结构体,包含必要的属性,比如UDP连接、地址、缓冲区大小等等。 接下来,我需要考虑如何设计这个结构体。可能的结构体字段包括conn(net.Conn或具体的udp类型)、RemoteAddr(远程地址)、bufferSize(接收数据的缓冲区大小)。然后定义方法,比如NewUDPServer构造函数,用来监听端口;还有Send和Receive方法,处理数据的发送和接收。另外,关闭连接的方法Close也不能少。 然后,构造函数部分。使用net.ListenUDP创建UDP连接,设置结构体的各个字段。可能还需要处理错误,返回实例。这里可能需要区分客户端和服务端,但用户可能主要是想封装服务端,所以构造函数可能以NewUDPServer开始。 Send方法的话,UDP是无连接的,所以发送数据需要指定目标地址。这里可能需要结构体中保存远程地址,或者在Send方法中传入地址。但如果是服务端,通常是在接收到数据后回复,所以可能需要保存客户端的地址。或者在Send方法里允许传入地址参数。 Receive方法需要使用conn.ReadFromUDP来读取数据,并返回数据和客户端地址。这时候结构体可能需要保存客户端的地址,以便后续回复。或者每次接收后返回地址,供Send使用。 然后,用户可能需要一个例子来演示如何使用这个封装好的结构体。比如服务端循环接收数据,然后回显。客户端发送数据并接收响应。需要分别写服务端和客户端的代码示例。 还要考虑错误处理,比如关闭连接后是否返回错误,缓冲区大小设置是否合理等。此外,结构体是否线程安全?比如多个goroutine调用Send或Receive是否需要加锁。不过UDP本身是无连接的,可能不需要,但具体要看使用场景。 测试代码的话,可能需要启动服务端和客户端,发送消息检查是否正常接收。但用户可能需要一个简化的示例,所以代码示例应该尽量简洁,去掉复杂的错误处理,或者至少展示基本的流程。 可能的问题:在面向对象的封装中,如何管理连接的生命周期,比如确保Close被调用。另外,如何处理不同的网络情况,比如超时、重试等,但这些可能属于高级功能,用户可能暂时不需要。 最后,用户的相关问题可能涉及TCP与UDP的区别,Golang处理并发UDP请求的方法,如何设置超时,或者结构体方法的其他用途。需要准备这些问题,确保覆盖常见的疑问点。</think>以下是使用Go语言面向对象方式封装的UDP通信实现,包含服务端和客户端的完整示例: ```go package main import ( "log" "net" ) // UDPConnection 封装UDP连接的结构体 type UDPConnection struct { conn *net.UDPConn bufferSize int } // NewUDPServer 创建UDP服务端 func NewUDPServer(addr string, bufferSize int) (*UDPConnection, error) { udpAddr, err := net.ResolveUDPAddr("udp", addr) if err != nil { return nil, err } conn, err := net.ListenUDP("udp", udpAddr) if err != nil { return nil, err } return &UDPConnection{ conn: conn, bufferSize: bufferSize, }, nil } // NewUDPClient 创建UDP客户端 func NewUDPClient(serverAddr string) (*net.UDPAddr, error) { return net.ResolveUDPAddr("udp", serverAddr) } // Send 发送数据 func (u *UDPConnection) Send(data []byte, addr *net.UDPAddr) (int, error) { return u.conn.WriteToUDP(data, addr) } // Receive 接收数据 func (u *UDPConnection) Receive() ([]byte, *net.UDPAddr, error) { buf := make([]byte, u.bufferSize) n, addr, err := u.conn.ReadFromUDP(buf) return buf[:n], addr, err } // Close 关闭连接 func (u *UDPConnection) Close() error { return u.conn.Close() } func main() { // 服务端示例 go func() { server, err := NewUDPServer(":8888", 1024) if err != nil { log.Fatal(err) } defer server.Close() for { data, addr, err := server.Receive() if err != nil { log.Println("Receive error:", err) continue } log.Printf("Received from %v: %s", addr, string(data)) // 回显数据 _, err = server.Send(data, addr) if err != nil { log.Println("Send error:", err) } } }() // 客户端示例 clientAddr, err := NewUDPClient("127.0.0.1:8888") if err != nil { log.Fatal(err) } conn, err := net.DialUDP("udp", nil, clientAddr) if err != nil { log.Fatal(err) } defer conn.Close() // 发送测试数据 message := []byte("Hello UDP Server!") _, err = conn.Write(message) if err != nil { log.Fatal(err) } // 接收响应 buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { log.Fatal(err) } log.Printf("Received response: %s", string(buffer[:n])) } ``` 代码解释: 1. `UDPConnection` 结构体封装了UDP连接和缓冲区大小 2. `NewUDPServer` 用于创建服务端实例并绑定端口 3. `NewUDPClient` 创建客户端目标地址对象 4. `Send` 方法实现数据发送到指定地址 5. `Receive` 方法持续监听并接收数据 6. `Close` 方法用于关闭连接 7. main函数包含完整的服务端和客户端使用示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值