You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:40:33