精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一起聊聊 Go Context 的正確使用姿勢(shì)

開發(fā) 后端
在 Go 語言中,Goroutine(協(xié)程),也就是關(guān)鍵字 go 是一個(gè)家喻戶曉的高級(jí)用法。這起的非常妙,說到 Go,就會(huì)想到這一門語言,想到 goroutine 這一關(guān)鍵字,而與之關(guān)聯(lián)最深的就是 context。

[[410737]]

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚了公眾號(hào)。

大家好,我是煎魚。

在 Go 語言中,Goroutine(協(xié)程),也就是關(guān)鍵字 go 是一個(gè)家喻戶曉的高級(jí)用法。這起的非常妙,說到 Go,就會(huì)想到這一門語言,想到 goroutine 這一關(guān)鍵字,而與之關(guān)聯(lián)最深的就是 context。

背景

平時(shí)在 Go 工程中開發(fā)中,幾乎所有服務(wù)端(例如:HTTP Server)的默認(rèn)實(shí)現(xiàn),都在處理請(qǐng)求時(shí)新起 goroutine 進(jìn)行處理。

但一開始存在一個(gè)問題,那就是當(dāng)一個(gè)請(qǐng)求被取消或超時(shí)時(shí),所有在該請(qǐng)求上工作的 goroutines 應(yīng)該迅速退出,以便系統(tǒng)可以回收他們正在使用的任何資源。

當(dāng)年可沒有 context 標(biāo)準(zhǔn)庫。很折騰。因此 Go 官方在 2014 年正式宣發(fā)了 context 標(biāo)準(zhǔn)庫,形成一個(gè)完整的閉環(huán)。

但有了 context 標(biāo)準(zhǔn)庫,Go 愛好者們又奇怪了,前段時(shí)間我就被問到了:“Go context 的正確使用姿勢(shì)是怎么樣的”?

(一張忘記在哪里被問的隱形截圖)

今天這篇文章就由煎魚帶你看看。

Context 用法

在 Go context 用法中,我們常常將其與 select 關(guān)鍵字結(jié)合使用,用于監(jiān)聽其是否結(jié)束、取消等。

代碼如下:

  1. const shortDuration = 1 * time.Millisecond 
  2.  
  3. func main() { 
  4.  ctx, cancel := context.WithTimeout(context.Background(), shortDuration) 
  5.  defer cancel() 
  6.  
  7.  select { 
  8.  case <-time.After(1 * time.Second): 
  9.   fmt.Println("腦子進(jìn)煎魚了"
  10.  case <-ctx.Done(): 
  11.   fmt.Println(ctx.Err()) 
  12.  } 

輸出結(jié)果:

  1. context deadline exceeded 

如果是更進(jìn)一步結(jié)合 goroutine 的話,常見的例子是:

  1. func(ctx context.Context) <-chan int { 
  2.  dst := make(chan int
  3.  n := 1 
  4.  go func() { 
  5.   for { 
  6.    select { 
  7.    case <-ctx.Done(): 
  8.     return 
  9.    case dst <- n: 
  10.     n++ 
  11.    } 
  12.   } 
  13.  }() 
  14.  return dst 

我們平時(shí)工程中會(huì)起很多的 goroutine,這時(shí)候會(huì)在 goroutine 內(nèi)結(jié)合 for+select,針對(duì) context 的事件進(jìn)行處理,達(dá)到跨 goroutine 控制的目的。

正確的使用姿勢(shì)

對(duì)第三方調(diào)用要傳入 context

在 Go 語言中,Context 的默認(rèn)支持已經(jīng)是約定俗稱的規(guī)范了。因此在我們對(duì)第三方有調(diào)用訴求的時(shí)候,要傳入 context:

  1. func main() { 
  2.  req, err := http.NewRequest("GET""https://eddycjy.com/", nil) 
  3.  if err != nil { 
  4.   fmt.Printf("http.NewRequest err: %+v", err) 
  5.   return 
  6.  } 
  7.  
  8.  ctx, cancel := context.WithTimeout(req.Context(), 50*time.Millisecond) 
  9.  defer cancel() 
  10.  
  11.  req = req.WithContext(ctx) 
  12.  resp, err := http.DefaultClient.Do(req) 
  13.  if err != nil { 
  14.   fmt.Printf("http.DefaultClient.Do err: %+v", err) 
  15.   return 
  16.  } 
  17.  defer resp.Body.Close() 

這樣子由于第三方開源庫已經(jīng)實(shí)現(xiàn)了根據(jù) context 的超時(shí)控制,那么當(dāng)你所傳入的時(shí)間到達(dá)時(shí),將會(huì)中斷調(diào)用。

若你發(fā)現(xiàn)第三方開源庫沒支持 context,那建議趕緊跑,換一個(gè)。免得在微服務(wù)體系下出現(xiàn)級(jí)聯(lián)故障,還沒有簡單的手段控制,那就很麻煩了。

不要將上下文存儲(chǔ)在結(jié)構(gòu)類型中

大家會(huì)發(fā)現(xiàn),在 Go 語言中,所有的第三方開源庫,業(yè)務(wù)代碼。清一色的都會(huì)將 context 放在方法的一個(gè)入?yún)?shù),作為首位形參。

例如:

標(biāo)準(zhǔn)要求:每個(gè)方法的第一個(gè)參數(shù)都將 context 作為第一個(gè)參數(shù),并使用 ctx 變量名慣用語。

當(dāng)然,我們也不能一桿子打死所有情況。確實(shí)存在極少數(shù)是把 context 放在結(jié)構(gòu)體中的。基本常見于:

  • 底層基礎(chǔ)庫。
  • DDD 結(jié)構(gòu)。

每個(gè)請(qǐng)求都是獨(dú)立的,context 自然每個(gè)都不一樣,想清楚自己的應(yīng)用使用場景很重要,否則遵循 Go 基本規(guī)范就好。

在真實(shí)案例來看,有的 Leader 會(huì)單純?yōu)榱瞬幌腩l繁傳 context 而設(shè)計(jì)成結(jié)構(gòu)體,結(jié)果導(dǎo)致一線 RD 就得天天 NewXXX,甚至有時(shí)候忘記了,還得背個(gè)小鍋。

函數(shù)調(diào)用鏈必須傳播上下文

我們會(huì)把 context 作為方法首位,本質(zhì)目的是為了傳播 context,自行完整調(diào)用鏈路上的各類控制:

  1. func List(ctx context.Context, db *sqlx.DB) ([]User, error) { 
  2.  ctx, span := trace.StartSpan(ctx, "internal.user.List"
  3.  defer span.End() 
  4.  
  5.  users := []User{} 
  6.  const q = `SELECT * FROM users` 
  7.  
  8.  if err := db.SelectContext(ctx, &users, q); err != nil { 
  9.   return nil, errors.Wrap(err, "selecting users"
  10.  } 
  11.  
  12.  return users, nil 

像在上述例子中,我們會(huì)把所傳入方法的 context 一層層的傳進(jìn)去下一級(jí)方法。這里就是將外部的 context 傳入 List 方法,再傳入 SQL 執(zhí)行的方法,解決了 SQL 執(zhí)行語句的時(shí)間問題。

context 的繼承和派生

在 Go 標(biāo)準(zhǔn)庫 context 中具有以下派生 context 的標(biāo)準(zhǔn)方法:

  1. func WithCancel(parent Context) (ctx Context, cancel CancelFunc) 
  2. func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) 
  3. func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) 

代碼例子如下:

  1. func handle(w http.ResponseWriter, req *http.Request) { 
  2.   // parent context 
  3.  timeout, _ := time.ParseDuration(req.FormValue("timeout")) 
  4.  ctx, cancel := context.WithTimeout(context.Background(), timeout) 
  5.  
  6.   // chidren context 
  7.  newCtx, cancel := context.WithCancel(ctx) 
  8.  defer cancel() 
  9.  // do something... 

一般會(huì)有父級(jí) context 和子級(jí) context 的區(qū)別,我們要保證在程序的行為中上下文對(duì)于多個(gè) goroutine 同時(shí)使用是安全的。并且存在父子級(jí)別關(guān)系,父級(jí) context 關(guān)閉或超時(shí),可以繼而影響到子級(jí) context 的程序。

不傳遞 nil context

很多時(shí)候我們?cè)趧?chuàng)建 context 時(shí),還不知道其具體的作用和下一步用途是什么。

這種時(shí)候大家可能會(huì)直接使用 context.Background 方法:

  1. var ( 
  2.    background = new(emptyCtx) 
  3.    todo       = new(emptyCtx) 
  4.  
  5. func Background() Context { 
  6.    return background 
  7.  
  8. func TODO() Context { 
  9.    return todo 

但在實(shí)際的 context 建議中,我們會(huì)建議使用 context.TODO 方法來創(chuàng)建頂級(jí)的 context,直到弄清楚實(shí)際 Context 的下一步用途,再進(jìn)行變更。

context 僅傳遞必要的值

我們?cè)谑褂?context 作為上下文時(shí),經(jīng)常有信息傳遞的訴求。像是在 gRPC 中就會(huì)有 metadata 的概念,而在 gin 中就會(huì)自己封裝 context 作為參數(shù)管理。

Go 標(biāo)準(zhǔn)庫 context 也有提供相關(guān)的方法:

  1. type Context 
  2.     func WithValue(parent Context, key, val interface{}) Context 

代碼例子如下:

  1. func main() { 
  2.  type favContextKey string 
  3.  f := func(ctx context.Context, k favContextKey) { 
  4.   if v := ctx.Value(k); v != nil { 
  5.    fmt.Println("found value:", v) 
  6.    return 
  7.   } 
  8.   fmt.Println("key not found:", k) 
  9.  } 
  10.  
  11.  k := favContextKey("腦子進(jìn)"
  12.  ctx := context.WithValue(context.Background(), k, "煎魚"
  13.  
  14.  f(ctx, k) 
  15.  f(ctx, favContextKey("小咸魚")) 

輸出結(jié)果:

  1. found value: 煎魚 
  2. key not found: 小咸魚 

在規(guī)范中,我們建議 context 在傳遞時(shí),僅攜帶必要的參數(shù)給予其他的方法,或是 goroutine。甚至在 gRPC 中會(huì)做嚴(yán)格的出、入上下文參數(shù)的控制。

在業(yè)務(wù)場景上,context 傳值適用于傳必要的業(yè)務(wù)核心屬性,例如:租戶號(hào)、小程序ID 等。不要將可選參數(shù)放到 context 中,否則可能會(huì)一團(tuán)糟。

總結(jié)

 

  • 對(duì)第三方調(diào)用要傳入 context,用于控制遠(yuǎn)程調(diào)用。
  • 不要將上下文存儲(chǔ)在結(jié)構(gòu)類型中,盡可能的作為函數(shù)第一位形參傳入。
  • 函數(shù)調(diào)用鏈必須傳播上下文,實(shí)現(xiàn)完整鏈路上的控制。
  • context 的繼承和派生,保證父、子級(jí) context 的聯(lián)動(dòng)。
  • 不傳遞 nil context,不確定的 context 應(yīng)當(dāng)使用 TODO。
  • context 僅傳遞必要的值,不要讓可選參數(shù)揉在一起。

 

責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(guān)推薦

2024-02-26 00:00:00

Go性能工具

2023-03-26 23:47:32

Go內(nèi)存模型

2024-06-27 08:54:22

Go模塊團(tuán)隊(duì)

2024-05-17 08:47:33

數(shù)組切片元素

2021-09-11 19:02:34

Hook使用版本

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2024-02-20 21:34:16

循環(huán)GolangGo

2022-12-07 09:01:14

布局容器VStack?

2021-08-27 07:06:10

IOJava抽象

2023-06-30 08:18:51

敏捷開發(fā)模式

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-09-10 21:42:31

2023-09-21 08:16:56

JDK 21向量計(jì)算計(jì)算

2024-07-18 08:54:49

2022-06-17 08:17:53

配置profile技巧

2021-07-31 11:40:55

Openresty開源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩精品视频久久| 国产精品天天狠天天看| 亚洲在线观看网站| 福利成人导航| 91免费小视频| 国产精品视频网址| 久久久久久久9999| 久久99视频| 91麻豆精品国产自产在线观看一区 | 成年人免费观看视频网站| 丝袜美腿美女被狂躁在线观看| 精品一区二区三区免费毛片爱| 欧美激情一级欧美精品| 欧美做受高潮6| 国产一区二区三区亚洲综合| 91美女视频网站| 国产精品视频一| 日产精品久久久久久久| 欧洲杯足球赛直播| 亚洲精品在线一区二区| 538在线视频观看| a毛片不卡免费看片| 国产精品久久久久婷婷| 国产在线一区二区三区欧美 | 欧美三级三级三级爽爽爽| 久久av高潮av| 在线激情免费视频| 日韩不卡一二三区| 久久99亚洲精品| 亚洲色图日韩精品| 亚洲69av| 亚洲成人av资源网| 黄色aaaaaa| 丁香婷婷久久| 日本精品一级二级| av女优在线播放| caoporn97在线视频| 欧美国产亚洲另类动漫| 久久综合一区| 天天干天天草天天射| 国产精品亚洲第一区在线暖暖韩国 | 91精品国产91热久久久做人人| 青青青在线播放| 午夜视频www| 国产毛片精品视频| 国产欧美久久久久久| 黄色在线视频网址| 99re国产精品| 久久久久久久久亚洲| 成人免费黄色小视频| 日产午夜精品一线二线三线| 亚洲精品自在久久| 久久久久国产精品区片区无码| 日韩av影片| 亚洲高清免费视频| 免费在线黄网站| 怡红院红怡院欧美aⅴ怡春院| 日韩美女视频一区| 欧美少妇一级片| 国内精品不卡| 亚洲女人的天堂| 亚洲av首页在线| 欧美特黄一级视频| 99热精品在线观看| 欧美精品videossex88| 免费无码毛片一区二区app| 欧美激情性爽国产精品17p| 美女视频黄免费的亚洲男人天堂| 国产大学生自拍| 狠狠干成人综合网| 韩国欧美亚洲国产| 欧美一区二区激情视频| 羞羞视频在线观看欧美| 国产精品电影观看| 成人在线观看小视频| 91影院成人| 亚洲第一av在线| 亚洲自拍偷拍精品| 天堂成人娱乐在线视频免费播放网站| 欧美日免费三级在线| www.精品在线| 三妻四妾的电影电视剧在线观看| 欧美性感美女h网站在线观看免费| 欧美日韩精品在线一区二区 | 亚洲奶汁xxxx哺乳期| youjizz久久| 欧美久久综合性欧美| 在线观看免费黄色| 亚洲国产中文字幕在线视频综合| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 在线欧美不卡| 日本精品一区二区三区在线播放视频| 免费在线观看av的网站| 国产综合久久久久久鬼色| 高清视频一区二区三区| 暖暖视频在线免费观看| 综合久久久久久久| 久久成人免费观看| 天天综合在线观看| 亚洲国产精品va在线看黑人动漫| 中文字幕第20页| 欧美日韩99| 国产精品99一区| www久久久com| 中文字幕精品一区二区三区精品| 国产成a人亚洲精v品在线观看| 欧美电影网站| 日韩精品一区二区三区swag| 久久av无码精品人妻系列试探| 你懂的网址国产 欧美| 日韩免费观看网站| 亚洲美女性生活| 国产精品美女久久久久久2018| 2018中文字幕第一页| 毛片在线视频| 国产精品天干天干在观线| www.18av.com| 日韩不卡在线| 亚洲精品wwwww| 午夜剧场免费在线观看| 日韩av在线播放中文字幕| 国产精品青青草| 欧美熟妇另类久久久久久不卡 | 日韩欧美一级在线播放| 91在线无精精品白丝| 亚洲国产高清一区| 成人久久一区二区| av影片在线看| 色拍拍在线精品视频8848| 国产亚洲精品成人a| 日韩高清欧美| 国产精品成av人在线视午夜片| 天堂在线观看视频| 亚洲自拍与偷拍| 色偷偷中文字幕| 午夜片欧美伦| 国产精品日韩av| 国产大片在线免费观看| 色综合久久综合网97色综合| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 一级片手机在线观看| 亚洲深夜激情| 加勒比在线一区二区三区观看| 亚洲91av| 91麻豆精品国产自产在线观看一区| youjizz亚洲女人| 男女性色大片免费观看一区二区| 欧洲一区二区在线| 日韩成人av电影| 亚洲免费成人av电影| 国产小视频在线免费观看| 波多野结衣在线aⅴ中文字幕不卡| 大陆极品少妇内射aaaaaa| 国产精品一区二区三区www| 精品国产欧美一区二区三区成人| 亚洲一级特黄毛片| 国产一区欧美二区| 亚洲国产精品久久久久婷婷老年 | 久久五月情影视| 国产精品丝袜黑色高跟鞋| 中文字幕一区二区在线观看| 一本一道久久a久久综合蜜桃| 欧美国产一级| 亚洲xxx大片| 精精国产xxxx视频在线中文版| 精品国产乱码久久久久久久| 国产精品第56页| 国产日韩一区| 欧美国产一二三区| 亚洲精品555| 日韩午夜在线视频| 国产xxxxxx| 午夜精品福利一区二区三区蜜桃| 亚洲精品女人久久久| 久久激情综合| 午夜精品一区二区三区在线观看| 久久爱.com| 欧美精品免费看| 神马午夜电影一区二区三区在线观看 | 欧美日韩国产另类一区| 特一级黄色录像| 成人免费av在线| 免费黄色特级片| 亚洲v在线看| 国产一区在线免费观看| 国产成人精品亚洲日本在线观看| 日韩一级黄色av| 丁香六月天婷婷| 日本道精品一区二区三区| 日本午夜精品视频| 国产**成人网毛片九色| 欧美丰满熟妇bbbbbb百度| 成人同人动漫免费观看| 不卡视频一区二区| 成人影院入口| 九九精品在线观看| 好男人免费精品视频| 亚洲无线码一区二区三区| 中文字幕一区二区三区人妻不卡| 美女一区二区视频| 国产伦精品一区二区三区四区视频_ | 欧美亚洲一区二区在线| 亚洲国产美女视频| 久久久无码精品亚洲日韩按摩| 中文字幕亚洲欧洲| 中文日韩在线| 法国空姐在线观看免费| 亚欧日韩另类中文欧美| 亚洲一区中文字幕在线观看| 97se综合| 欧美精品www在线观看| 中文字幕在线免费| 亚洲精品国精品久久99热一| 国产精品久久久久久免费| 欧美午夜www高清视频| 亚洲少妇xxx| 久久蜜桃一区二区| 美女搡bbb又爽又猛又黄www| 美女一区二区视频| 国产成人无码av在线播放dvd| 欧美日韩免费| 一本一道久久a久久综合精品| 91精品国产经典在线观看| 久久久久久噜噜噜久久久精品| 888av在线| 精品一区二区亚洲| 可以免费观看的毛片| 7777精品伊人久久久大香线蕉超级流畅| 国产剧情在线视频| 激情亚洲一区二区三区四区| 欧美日韩精品一区二区三区视频播放 | 国产人妖伪娘一区91| 91社区在线| 亚洲国产精品视频在线观看| av网站免费大全| 欧美日韩国产大片| 最新在线中文字幕| 在线一区二区三区四区| 国产无遮挡呻吟娇喘视频| 亚洲欧美韩国综合色| 永久免费看片视频教学| 国产欧美日韩激情| 微拍福利一区二区| 国产日韩欧美制服另类| 欧美一区二区三区成人精品| 成人国产精品免费观看视频| 亚洲女则毛耸耸bbw| 国产馆精品极品| 无套白嫩进入乌克兰美女| 国产综合久久久久久鬼色| 亚洲男人天堂av在线| 久久机这里只有精品| 婷婷免费在线观看| 久久99久久久欧美国产| 欧美激情国内自拍| 国内精品国产成人| 天天操夜夜操很很操| 国产福利一区二区三区视频| 宇都宫紫苑在线播放| 国产精品1区2区3区在线观看| 男生和女生一起差差差视频| 国产福利电影一区二区三区| 久久久无码人妻精品无码| 国产成人8x视频一区二区| 国产精久久久久| 99视频在线精品| 精品人妻互换一区二区三区| 国产农村妇女精品| 超碰人人人人人人人| 有码一区二区三区| 国产在线精品观看| 色菇凉天天综合网| 一本到在线视频| 日韩欧美黄色影院| 污污网站免费在线观看| 亚洲日本aⅴ片在线观看香蕉| 狠狠狠综合7777久夜色撩人| www.亚洲人.com| 成人高潮aa毛片免费| 欧美在线激情网| 国产原创一区| av一区观看| 亚洲+变态+欧美+另类+精品| 亚洲精蜜桃久在线| 欧美欧美天天天天操| 欧美日韩国产精品激情在线播放| 日本美女一区二区三区| 国产成人av免费观看| 91蜜桃网址入口| 一区二区三区在线播放视频| 亚洲综合另类小说| 中文字幕在线播| 91精品国产综合久久久久久久 | 日韩风俗一区 二区| av在线天堂播放| 日韩免费高清av| 日韩电影免费| 欧美精品一区二区三区国产精品| 日本а中文在线天堂| 国产日韩在线看| 激情av综合| 一区二区精品视频| 最新日韩av| 中文字幕第17页| 99久久精品99国产精品| 老女人性生活视频| 久久久三级国产网站| 亚洲av无码一区二区三区在线| 欧美视频在线观看 亚洲欧| 国产精品自产拍| 国产午夜精品全部视频在线播放| 日本无删减在线| 国产精品自产拍在线观看| 日本在线中文字幕一区| 国产欧美自拍视频| 日韩精品1区2区3区| 国产精品久久久久久亚洲色| 中文字幕色av一区二区三区| 日韩欧美不卡视频| 欧美一区二区福利在线| 岛国在线大片| 欧美在线视频免费观看| 一区二区网站| 日韩精品第1页| 久久精品国产99国产精品| 一区二区黄色片| 欧美日韩午夜剧场| 国模人体一区二区| 欧美超级免费视 在线| 青草综合视频| 天堂社区 天堂综合网 天堂资源最新版| 在线日韩视频| 亚洲精品乱码久久久久久9色| 亚洲三级视频在线观看| 在线免费观看视频网站| 亚洲视频综合网| av日韩亚洲| 麻豆亚洲一区| 国产亚洲一级| 精品无码在线视频| 精品国产999| 人妻va精品va欧美va| 欧美国产精品人人做人人爱| 亚洲福利影视| 一道精品一区二区三区| 美洲天堂一区二卡三卡四卡视频 | 中文字幕一区在线观看| 中文天堂在线资源| 亚洲一区999| 国产精品高清乱码在线观看| 免费成人av网站| 日韩精品欧美精品| 国产精品国产三级国产专业不 | 欧美高清一级大片| 97视频一区| 欧美精品在线一区| 美女视频一区免费观看| 波多野吉衣中文字幕| 色婷婷av一区二区三区软件 | 成年人晚上看的视频| 亚洲欧美一区二区三区情侣bbw| 最新欧美色图| 四虎影院一区二区三区| 久草热8精品视频在线观看| 中文字幕资源站| 日韩视频免费直播| 91九色porn在线资源| 欧美日韩三区四区| 免费高清不卡av| 国产探花在线免费观看| 精品国产麻豆免费人成网站| 涩涩av在线| 日韩在线电影一区| 久久99精品久久久久久| 青青操国产视频| 日韩不卡在线观看| 成人在线爆射| 干日本少妇视频| www.视频一区| 国产日韩在线免费观看| 久久视频在线看| 欧美电影在线观看完整版| 国产一级片黄色| 亚洲欧美一区二区三区国产精品| 韩国av免费在线| 国产精品久久久久av免费| 国产精品久久久久久久久久10秀 | 天堂久久av| 亚洲国产精品久久久久婷蜜芽| 欧美激情一区不卡| 午夜久久久久久久久久| 欧美一级大胆视频| 伊人久久大香线蕉av超碰| 女人天堂av手机在线| 国产精品嫩草影院com| 丰满人妻一区二区| 国产精品国语对白| 国内精品99| 国产又粗又黄又猛| 欧美mv和日韩mv的网站|