設(shè)計做網(wǎng)站哪家公司好短期培訓(xùn)班學(xué)什么好
1. context 作用
context包的context的接口,主要是控制協(xié)程執(zhí)行上下文的時間,以及取消程序的執(zhí)行,以及上下文中傳遞數(shù)據(jù)等作用,golang中耗時或者需要協(xié)同的操作都會見到context的身影。
context有幾個常用的方法
1.1 context.Backgroud()
創(chuàng)建一個空白的,頂級的,不會被取消的上下文。
1.2 context.WithTimeout
創(chuàng)建一個有執(zhí)行時間限制的上下文
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
可以通過ctx.Done()方法獲取上下超時的通知。
package mainimport ("context""fmt""time"
)func main() {parentCxt := context.Background()ctx, cancel := context.WithTimeout(parentCxt, time.Second*5)go longTimeTask(ctx)time.Sleep(time.Second * 10)cancel()fmt.Println("task cancel success")
}func longTimeTask(ctx context.Context) {for {//fmt.Println("ok")select {case <-time.After(time.Second * 1):fmt.Println("task compete")case <-ctx.Done():fmt.Println("time out")return}}
}
1.3 context.WitchCancel(parentContext)
獲取一個可以中止的上下文,該方法會返回一個新的context,和cancel函數(shù),調(diào)用cancel函數(shù)后,通過ctx.Done()方法可以獲取到上下文取消的通知
package mainimport ("context""fmt""time"
)func main() {parentCxt := context.Background()ctx, cancel := context.WithCancel(parentCxt)go longTimeTask(ctx)time.Sleep(time.Second * 10)cancel()fmt.Println("task cancel success")
}func longTimeTask(ctx context.Context) {for {//fmt.Println("ok")select {case <-time.After(time.Second * 1):fmt.Println("task compete")case <-ctx.Done():fmt.Println("time out")return}}
}
1.4 context.WithValue()
func WithValue(parent Context, key, val any) Context {
if parent == nil {
panic(“cannot create context from nil parent”)
}
if key == nil {
panic(“nil key”)
}
if !reflectlite.TypeOf(key).Comparable() {
panic(“key is not comparable”)
}
return &valueCtx{parent, key, val}
}
可以在上下文中存貯一些參數(shù),通過上下文隨時獲取。
2.chan 信道
golang的chan和map,切片,接口,函數(shù)一樣是引用類型。
golang更加推薦使用chan去解決并發(fā)的協(xié)作的問題,對chan的讀寫是并發(fā)安全的,當(dāng)然你也可也以使用sync.Mutex等包來控制并發(fā)。