Go语言中调用函数后如何更新IP连接计数变量值?
问题分析与解决方案
你的核心问题是用全局切片addresses累计所有历史连接记录,导致每次统计的是总连接次数而非当前并发数。你需要的是维护每个IP的当前活跃连接数——连接建立时计数+1,断开时计数-1,而非一直累加历史记录。
修改后的代码
package main import "fmt" // 用map直接维护每个IP的当前并发连接数 var connCounts = make(map[string]int) func listen() int { rAddr := "1.1.1.2" // 连接建立:当前IP计数+1 connCounts[rAddr]++ fmt.Println(rAddr, "value is", connCounts[rAddr]) // 这里可以添加实际的连接处理逻辑 // 连接断开:当前IP计数-1 if connCounts[rAddr] > 0 { connCounts[rAddr]-- fmt.Println(rAddr, "decreased value is", connCounts[rAddr]) } return connCounts[rAddr] } func main() { listen() listen() }
代码说明
- 用全局
map[string]int替代切片,直接存储每个IP的当前活跃连接数,彻底避免累计历史记录的问题。 - 每次调用
listen时,先对目标IP的计数+1(模拟连接建立),处理完成后再-1(模拟连接断开),完全贴合你“连接建立后执行步骤即断开”的业务逻辑。 - 逻辑精简直接,不需要额外的统计函数,状态维护更直观。
输出验证
运行修改后的代码,输出完全符合你的预期:
1.1.1.2 value is 1 1.1.1.2 decreased value is 0 1.1.1.2 value is 1 1.1.1.2 decreased value is 0
生产环境补充:并发安全处理
如果你的系统是多goroutine并发处理连接,需要给map加互斥锁避免竞态问题,代码调整如下:
package main import ( "fmt" "sync" ) var ( connCounts = make(map[string]int) mu sync.Mutex // 互斥锁保证map的并发安全 ) func listen() int { rAddr := "1.1.1.2" mu.Lock() // 连接建立 connCounts[rAddr]++ fmt.Println(rAddr, "value is", connCounts[rAddr]) // 模拟连接处理逻辑 // 连接断开 if connCounts[rAddr] > 0 { connCounts[rAddr]-- fmt.Println(rAddr, "decreased value is", connCounts[rAddr]) } currentCount := connCounts[rAddr] mu.Unlock() return currentCount } func main() { listen() listen() }
内容的提问来源于stack exchange,提问作者Sanjay Kumar
相关产品推荐
相关产品推荐

