mirror of
https://gitee.com/willfree/tcpserver-client.git
synced 2026-10-04 19:52:23 +08:00
77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
package main
|
|
// 模拟服务器地址列表
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// 服务器地址
|
|
type CanBeUsedAddr struct {
|
|
ip string // 服务器IP地址
|
|
updateTime time.Time // 本地址更新时间
|
|
}
|
|
|
|
func (addr CanBeUsedAddr) getIP() (ip string){
|
|
// 返回一个可用地址
|
|
return addr.ip
|
|
}
|
|
|
|
// 可用服务器地址最小堆:确保可以取出最新加入的可用服务器地址
|
|
type CanBeUsedAddrHeap []CanBeUsedAddr
|
|
|
|
// 实现最小堆的接口:比较大小。时间越晚越小
|
|
func (h *CanBeUsedAddrHeap) Less(i,j int) bool {
|
|
return (*h)[i].updateTime.After((*h)[j].updateTime)
|
|
}
|
|
|
|
// 实现最小堆的接口:获取堆大小。
|
|
func (h *CanBeUsedAddrHeap) Len() int {
|
|
return len(*h)
|
|
}
|
|
|
|
// 实现最小堆的接口:交换两个元素。
|
|
func (h *CanBeUsedAddrHeap) Swap(i,j int) {
|
|
(*h)[i], (*h)[j] = (*h)[j], (*h)[i]
|
|
}
|
|
|
|
// 实现最小堆的接口:推入一个元素(并排序)。
|
|
func (h *CanBeUsedAddrHeap) Push(val interface{}) {
|
|
*h=append(*h,val.(CanBeUsedAddr))
|
|
}
|
|
|
|
// 实现最小堆的接口:弹出一个元素(最小值)。
|
|
func (h *CanBeUsedAddrHeap) Pop() interface{}{
|
|
old:=*h
|
|
*h=old[:len(old)-1]
|
|
return old[len(old)-1]
|
|
}
|
|
|
|
// 判断某地址是否在本堆中:不在返回-1,在返回位置
|
|
func (h *CanBeUsedAddrHeap) IsExistAddr(addr CanBeUsedAddr) int{
|
|
for i := 0; i < len(*h); i++ {
|
|
if (*h)[i].ip==addr.ip {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
func (h *CanBeUsedAddrHeap) IsExistAddrIP(ip string) int{
|
|
for i := 0; i < len(*h); i++ {
|
|
if (*h)[i].ip==ip {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
// 打印所有元素
|
|
func (h *CanBeUsedAddrHeap) PrintSelf() {
|
|
fmt.Println("************************************")
|
|
fmt.Println("len: ",len(*h))
|
|
for i := 0; i < len(*h); i++ {
|
|
fmt.Println("index: "+strconv.Itoa(i)+" , ip: "+(*h)[i].ip+" , time: ",(*h)[i].updateTime)
|
|
}
|
|
fmt.Println("************************************")
|
|
} |