golang 原始碼分析之context

2021-10-25 10:28:03 字數 2089 閱讀 2163

context

上下文 context.context 是用來設定截止日期、同步訊號,傳遞請求相關值的結構體。

該介面定義了四個需要實現的方法

deadline — 返回 context.context 被取消的時間,也就是完成工作的截止日期;

done — 返回乙個 channel,這個 channel 會在當前工作完成或者上下文被取消之後關閉,多次呼叫 done 方法會返回同乙個 channel;

err — 返回 context.context 結束的原因,它只會在 done 返回的 channel 被關閉時才會返回非空的值;

1 如果 context.context 被取消,會返回 canceled 錯誤;

2 如果 context.context 超時,會返回 deadlineexceeded 錯誤;

value — 從 context.context中獲取鍵對應的值,對於同乙個上下文來說,多次呼叫 value 並傳入相同的 key會返回相同的結果,該方法可以用來傳遞請求特定的資料;

type context inte***ce

err(

)error

value

(key inte***ce

)inte***ce

}

預設ctx(context.background、context.todo)
type emptyctx int

func

(*emptyctx)

deadline()

(deadline time.time, ok bool

)func

(*emptyctx)

done()

<-

chan

struct

func

(*emptyctx)

err(

)error

func

(*emptyctx)

value

(key inte***ce

)inte***ce

context.withcancel
func

withcancel

(parent context)

(ctx context, cancel cancelfunc)

}func

propagatecancel

(parent context, child canceler)

//判斷parent的型別,是不是cancelctx和timerctx

if p, ok :=

parentcancelctx

(parent)

; ok

else)}

p.children[child]

=struct

} p.mu.

unlock()

}else}(

)}}

context.withdeadline 和 context.withtimeout
//withtimeout把傳入的時間轉成準確時間呼叫withdeadline方法

func

withtimeout

(parent context, timeout time.duration)

(context, cancelfunc)

func

withdeadline

(parent context, d time.time)

(context, cancelfunc)

//建立timectx

c :=

&timerctx

propagatecancel

(parent, c)

dur := time.

until

(d)if dur <=0}

c.mu.

lock()

defer c.mu.

unlock()

//建立定時器

if c.err ==

nil)

}return c,

func()

}

golang 原始碼分析之string

stringgo 語言中的字串其實是乙個唯讀的位元組陣列string 對應的結構 type stringheader struct type stringstruct struct 字串拼接 concatstrings runtime concatstrings func concatstrings...

golang初探與命令原始碼分析

前段時間有群友在群裡問乙個go語言的問題 就是有乙個main.go的main函式裡呼叫了另乙個demo.go裡的hello 函式。其中main.go和hello.go同屬於main包。但是在main.go的目錄下執行go run main.go卻報hello函式沒有定義的錯 結構如下 gopath ...

golang初探與命令原始碼分析

前段時間有群友在群裡問乙個go語言的問題 就是有乙個main.go的main函式裡呼叫了另乙個demo.go裡的hello 函式。其中main.go和hello.go同屬於main包。但是在main.go的目錄下執行go run main.go卻報hello函式沒有定義的錯 結構如下 gopath ...