如何在 golang 中调用函数后更新函数的值

我在一个系统上工作,我必须限制来自特定 IP 的并发连接。建立连接后,将执行一些步骤,然后将其删除,以便可以建立其他连接。下面是我更新特定变量值的代码。

代码链接 - http://tpcg.io/_SQZEEX

package main


import "fmt"



var addresses = make([]string, 0)

func count(rAddr string, slice *[]string) map[string]int {

    dict := make(map[string]int)

    *slice = append(*slice, rAddr)

    for _, a := range *slice {

    dict[a]++


    }

    return dict

}


func listen() int {


    var rAddr string

    rAddr = "1.1.1.2"

    number_of_addresses:=count(rAddr ,&addresses)

    var v int

    for k, v := range number_of_addresses {


    fmt.Println(k, "value is", v)


        if (v > 0) {

            v--

            fmt.Println(k, "decreased value is", v)

        }



    }

    return v

}



func main() {


    listen()

    listen()


}

再次调用该函数时,“v”变量的值不会刷新,输出如下


1.1.1.2 value is 1

1.1.1.2 decreased value is 0

1.1.1.2 value is 2

1.1.1.2 decreased value is 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

我该怎么做才能在每次减少时更新该值。我知道该值已刷新但未发送回计数函数。如何实现


慕码人2483693
浏览 104回答 1
1回答

慕侠2389804

根据我的意见,重构以通过mapie a跟踪 IP 地址map[string]int以跟踪使用情况。一个让你入门的基本实现:// track unique addresses via a map:// - key:   string of the IP address// - value: usage countvar (    usageMap = make(map[string]int) //    l        sync.Mutex             // ensure concurrent access to map is synchronized)func modifyAddr(addr string, delta int) int {    l.Lock()    defer l.Unlock()    usageMap[addr] += delta    return usageMap[addr]}func incAddr(addr string) int { return modifyAddr(addr, 1) }func decAddr(addr string) int { return modifyAddr(addr, -1) }并使用:const maxConcurrentUsage = 20func listen() {    rAddr := "1.1.1.2"    usage := incAddr(rAddr)    defer decAddr(rAddr)    if usage > maxConcurrentUsage {        log.Printf("maximum concurrent usage exceeded (%d) for address: %q", maxConcurrentUsage, rAddr)        return    }    // handler logic goes here}https://go.dev/play/p/Jvx8l4F9OE8
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go