1樓:冒泡
自問自答一下,在標準庫原始碼找到了乙個相對好的做法,是順著DialContext找下去,在src/net/fd_unix.go中的netFD的connect方法實現中
大致做法,例如我們封裝乙個ReadContext:
1 主邏輯協程(呼叫ReadContext的)照常做Read之類的IO操作,另外開個輔助協程來監控ctx.Done()
2 若輔助協程監控到了ctx.Done(),則通過SetDeadline打斷主邏輯阻塞的Read
3 Read返回錯誤後通過檢查ctx.Done()來判斷是被打斷,還是其他錯誤
4 ReadContext返回的時候需要清理掉輔助協程,避免殘留,因此還需要兩個chan,乙個用於在ctx.Done()沒觸發的時候通知輔助協程退出,另乙個用於等待確認輔助協程已退出
當然還需要考慮一些細節問題,比如用defer來保證在panic的時候也能通知到輔助協程退出等
這個做法主要技術點是通過SetDeadline打斷Read和Write,當然Close也可以,但Close有點粗暴(如果Done之後還要繼續用這個conn呢),但是SetDeadline畢竟也是改了conn的狀態的,所以要封裝得更好的話,還是別直接操作conn,在外面再包一層結構比較好,如果考慮到併發訪問可能還要再改進下(比如兩個協程用不同的ctx去對乙個conn做Read,乙個Done了後SetDeadline打斷了兩個呼叫)
2樓:
package
main
import
("context"
"fmt"
"io/ioutil"
"net"
"time"
)func
main
()var
out=
make
(chan
BufData,1
)// a new goroutine
gofunc
(ctx
context
.Context
)out
<-data
return
}defer
conn
.Close
()data
.Buf
,data
.Err
=ioutil
.ReadAll
(conn
)select
}(ctx
)select
// do some thing to data.Buffmt.
Println
(string
(data
.Buf
))case
<-ctx.
Done
():fmt
.Println
(ctx
.Err
())// "context deadline exceeded"
return}}
TypeScript和Golang,各有哪些特色,應該選擇學習哪一門,它們的設計者,到底誰更厲害?
qgymje 簡單來說看你自己是做前端還是後端,兩者如果比較的化只能讓typescript用在node環境上與Go比較,因此你可以將問題簡化為Node與Go的比較 tefx 跟設計者誰厲害有什麼關係。這樣想的話先學C啊,好歹作者身上有圖靈獎啊。話說這兩個語言為什麼會被放在一起比較。前端 script...
請問 golang 和 Python哪個簡單易學一些
金子 其實對於語言來說,我覺得都是通用的,主要是邏輯思想,如果是零基礎建議先從python 下手,因為他立馬就能有應用場景畢竟是指令碼上可以處處發揮,屬於長久積累。 天國的502 為什麼總有人說python簡單 是,python好上手,可是你怎麼讓乙個新手去解決各種版本上的問題?python庫多,但...
如何評價golang的time Format方法一定要用2006 01 02 15 04 05作引數?
Diamond Mine 用血的教訓告訴大家,這個設計真的有點坑。某個需求修改,程式設計師a需要格式化時間,順手去網上抄了個格式化串 2006 01 02 03 04 05 乍一看,也沒啥大問題,code review也通過了。結果一上線,發現hour錯了,應該用 15 04 24小時制 而不是 0...