可以利用channel關(guān)閉goroutine不阻塞特性來實現(xiàn):下面的代碼可以實現(xiàn)你的需求,只是沒有寫key被多次寫入的判斷邏輯。typespinterface{Out(keystring,valinterface{})//存入key/val,如果該key讀取的goroutine掛起,則喚醒。此方法不會阻塞,時刻都可以立即執(zhí)行并返回Rd(keystring,timeouttime.Duration)interface{}//讀取一個key,如果key不存在阻塞,等待key存在或者超時}typeMapstruct{cmap[string]*entryrmx*sync.RWMutex}typeentrystruct{chchanstruct{}valueinterface{}isExistbool}func(m*Map)Out(keystring,valinterface{}){m.rmx.Lock()deferm.rmx.Unlock()ife,ok:=m.c[key];ok{e.value=vale.isExist=trueclose(e.ch)}else{e=&entry{ch:make(chanstruct{}),isExist:true,value:val}m.c[key]=eclose(e.ch)}}func(m*Map)Rd(keystring,timeouttime.Duration)interface{}{m.rmx.Lock()ife,ok:=m.c[key];ok&&e.isExist{m.rmx.Unlock()returne.value}elseif!ok{e=&entry{ch:make(chanstruct{}),isExist:false}m.c[key]=em.rmx.Unlock()fmt.Println("協(xié)程阻塞->",key)select{case<-e.ch:returne.valuecase<-time.After(timeout):fmt.Println("協(xié)程超時->",key)returnnil}}else{m.rmx.Unlock()fmt.Println("協(xié)程阻塞->",key)select{case<-e.ch:returne.valuecase<-time.After(timeout):fmt.Println("協(xié)程超時->",key)returnnil}}}