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

题目一需要实现两个goroutine,这里分别命名为A、B,其中A用来产生随机数并将随机数写入channel中,B用来从channel中读取随机数并将随机数打印到标准输出,最后要求B最多在标准输出打印出五个随机数。

实现上述题目需要注意以下几点

  1. Go中goroutine是非阻塞的。

  2. channel初始化为无缓冲时,读写都是阻塞的,通常用for循环来读取channel中的数据,当管道关闭后,for循环退出。

  3. Go中专用select case语法来从管道中读取数据。

案例如下:

package mainimport (  "fmt"  "math/rand"  "sync")func main() {  printChan := make(chan int)  wg := sync.WaitGroup{}  wg.Add(2)  go func() {    defer wg.Done()    for i := 0; i < 5; i++ {      printChan <- rand.Intn(5)    }    close(printChan)  }()  go func() {    defer wg.Done()    for i := range printChan {      fmt.Println(i)    }  }()  wg.Wait()}

输出结果如下:

题目二:实现阻塞读且并发安全的map

题目二描述:Go中map如何实现当key不存在的时候,get操作等待,一直到key存在或超时,此时应保证程序并发安全问题。

需注意以下几点:

  1. Go实现阻塞通常使用channel。

  2. 并发安全就要考虑使用锁机制,也就是给代码块读写锁,这时要注意的是,在代码块执行完毕之后,关闭读写锁。

  3. map每个键值都需要有一个阻塞goroutin的channel,来实现map的阻塞读。

案例如下:

package mainimport (  "sync")type Map struct {  MapChan map[string]*Entry  RMX     *sync.RWMutex}type Entry struct {  Ch      chan struct{}  Value   interface{}  IsExist bool}func (m *Map) Out(key string, val interface{}) {  m.RMX.Lock()  defer m.RMX.Unlock()  item, ok := m.MapChan[key]  if !ok {    m.MapChan[key] = &Entry{      Value:   val,      IsExist: true,    }    return  }  item.Value = val  if !item.IsExist {    if item.Ch != nil {      close(item.Ch)      item.Ch = nil    }  }}

扫码关注公众号,获取更多优质内容。 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

luyaran

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

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

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

打赏作者

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

抵扣说明:

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

余额充值