最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang實現(xiàn)對map的并發(fā)讀寫的方法示例

 更新時間:2019年03月11日 10:13:52   作者:hackssssss  
這篇文章主要介紹了Golang實現(xiàn)對map的并發(fā)讀寫的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在Golang多協(xié)程的情況下使用全局map時,如果不做線程同步,會出現(xiàn)panic的情況。

為了解決這個問題,通常有兩種方式:

  • 第一種是最常見的使用互斥鎖或者讀寫鎖的方法;
  • 第二種是比較符合Golang特色的方法,啟動單個協(xié)程對map進行讀寫,當(dāng)其他協(xié)程需要讀寫map時,通過channel向這個協(xié)程發(fā)送信號即可。

寫了一個模擬程序?qū)ap中的一項進行讀或者寫,后臺一直運行的協(xié)程阻塞的接受讀寫信號,并對map進行操作,但是讀操作的時候沒想好怎么返回這個值。

后來想到用傳引用的方式,定義結(jié)構(gòu)體,第一個參數(shù)是讀寫的標志,第二個參數(shù)是讀成功或者寫成功后的值的channel,定義的channel中傳結(jié)構(gòu)體指針。

ps:以后驗證一下效率。簡單封裝了一下:http://m.fzitv.net/article/157620.htm

package main

import (
 "fmt"
 "strconv"
 "time"
)

type value struct {
 id int
 op int
 ret chan int
}
var dic map[int]int
var ch chan *value

func readAndWrite2Map() {
 for {
 select{
 case flag := <- ch:

  if flag.op > 0 {
  log.Printf("id: %v, op: %v, ret: %v", flag.id, flag.op, flag.op)
  dic[1] = flag.op
  flag.ret <- dic[1]
  } else if flag.op == 0 {
  log.Printf("id: %v, op: %v, ret: %v", flag.id, flag.op, dic[1])
  flag.ret <- dic[1]
  } else {
  return
  }
 }
 }
}


func out(flag, i, val int) {
 if flag == 0 {
 fmt.Println(strconv.Itoa(i) + "th goroutine read the value is ", val)
 } else {
 fmt.Println(strconv.Itoa(i)+"th goroutine write to the map ", val)
 }
}

func main() {
 dic = make(map[int]int)
 ch = make(chan *value)
 dic[1] = -1
 go readAndWrite2Map()
 for i := 0; i <= 5; i++ {
 if (i % 2) == 0 {
  go func(i int) {
   var tmp value
   for {
   tmp.op = 0
   ch <- &tmp
   out(0, i, <-tmp.ret)
   time.Sleep(time.Millisecond)
   }
  }(i)

 } else {
  go func(i int) {
   var tmp value
   for {
   tmp.op = i
   ch <- &tmp
   out(1, i, <-tmp.ret)
   time.Sleep(time.Millisecond)

   }
  }(i)
 }
 }
 time.Sleep(time.Second * 60)
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • go 代碼格式化和風(fēng)格開發(fā)者指南

    go 代碼格式化和風(fēng)格開發(fā)者指南

    這篇文章主要為大家介紹了go 代碼格式化和風(fēng)格開發(fā)者指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • golang 跳出for循環(huán)操作

    golang 跳出for循環(huán)操作

    這篇文章主要介紹了golang 跳出for循環(huán)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang使用信號量熱更新的實現(xiàn)示例

    golang使用信號量熱更新的實現(xiàn)示例

    這篇文章主要介紹了golang使用信號量熱更新的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析

    golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析

    這篇文章主要介紹了golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go?代碼塊作用域變量遮蔽問題解析

    Go?代碼塊作用域變量遮蔽問題解析

    這篇文章主要為大家介紹了Go?代碼塊作用域變量遮蔽問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • GoAdminGroup/go-admin的安裝和運行的教程詳解

    GoAdminGroup/go-admin的安裝和運行的教程詳解

    這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運行的教程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Go每日一庫之zap日志庫的安裝使用指南

    Go每日一庫之zap日志庫的安裝使用指南

    這篇文章主要為大家介紹了Go每日一庫之zap安裝使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang unsafe包中的類型和函數(shù)詳解

    Golang unsafe包中的類型和函數(shù)詳解

    Golang中的unsafe包用于在運行時進行低級別的操作,這些操作通常是不安全的,因為可以打破Golang的類型安全性和內(nèi)存安全性,使用 unsafe包的程序可能會影響可移植性和兼容性,接下來看下unsafe包中的類型和函數(shù)
    2023-08-08
  • Golang實現(xiàn)KV存儲引擎實例探究

    Golang實現(xiàn)KV存儲引擎實例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)KV存儲引擎實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang使用RSA加密和解密的實現(xiàn)示例

    golang使用RSA加密和解密的實現(xiàn)示例

    在Golang中RSA加密和解密是一個常見的操作,本文主要介紹了golang使用RSA加密和解密的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03

最新評論

宣武区| 石柱| 宁化县| 阿克陶县| 云林县| 沐川县| 聂拉木县| 黄山市| 陇南市| 固镇县| 正宁县| 贡觉县| 黄浦区| 荆州市| 拜城县| 乌审旗| 新邵县| 金秀| 杭锦后旗| 罗城| 山西省| 云安县| 米林县| 高邑县| 马山县| 金堂县| 砚山县| 黄陵县| 肥乡县| 镶黄旗| 固安县| 白山市| 建平县| 乌兰浩特市| 迁安市| 安平县| 康乐县| 宜良县| 赫章县| 仁布县| 驻马店市|