Golang面试题目-程序设计题目(二)

题目一场景:某一高并发web服务器需限制IP的频繁访问,现模拟100个IP同时并发访问该服务器,每个IP需访问1000次。

题目一要求:每个IP三分钟内只能访问一次。

题目一内容:修改以下代码完成上述题目要求,要求能成功输出【success100】。

题目代码如下:

package mainimport (  "fmt"  "time")type Ban struct {
  
    visitIPs map[string]time.Time}func NewBan() *Ban {
  
    return &Ban{
  
      visitIPs: make(map[string]time.Time),  }}func (o *Ban) visit(ip string) bool {
  
    if _, ok := o.visitIPs[ip]; ok {
  
      return true  }  o.visitIPs[ip] = time.Now()  return false}func main() {
  
    success := 0  ban := NewBan()  for i := 0; i < 1000; i++ {
  
      for j := 0; j < 100; j++ {
  
        go func() {
  
          ip := fmt.Sprintf("192.168.1.%d", j)        if !ban.visit(ip) {
  
            success++        }      }()    }  }  fmt.Println("success:", success)}

解析:上述问题主要考察的是并发情况下map的读写问题,上述案例代码中又存在for循环中启动goroutine时变量使用问题以及goroutine执行滞后问题。

我们首先要做的就是保证启动的goroutine能得到正常的参数,然后就是保证map的并发读写,左后保证三分钟之内只能访问一次。

多CPU核心下修改int的值极端情况下会存在不同步的情况,一次需要原子

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值