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

先睹為快,Go2 Error 的掙扎之路

開發(fā) 后端
自從 Go 語言在國內火熱以來,除去泛型,其次最具槽點的就是 Go 對錯誤的處理方式,一句經(jīng)典的 if err != nil 暗號就能認出你是一個 Go 語言愛好者。

 [[356198]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚 。轉載本文請聯(lián)系腦子進煎魚了公眾號。   

大家好,我是煎魚。

自從 Go 語言在國內火熱以來,除去泛型,其次最具槽點的就是 Go 對錯誤的處理方式,一句經(jīng)典的 if err != nil 暗號就能認出你是一個 Go 語言愛好者。

自然,大家對 Go error 的關注度更是高漲,Go team 也是,因此在 Go 2 Draft Designs 中正式提到了 error handling(錯誤處理)的相關草案,希望能夠在未來正式的解決這個問題。

在今天這篇文章中,我們將一同跟蹤 Go2 error,看看他是怎么 “掙扎” 的,能不能破局?

為什么要吐槽 Go1

要吐槽 Go1 error,就得先知道為什么大家到底是在噴 Error 哪里處理的不好。在 Go 語言中,error 其實本質上只是個 Error 的 interface:

  1. type error interface { 
  2.     Error() string 

實際的應用場景如下:

  1. func main() { 
  2.  x, err := foo() 
  3.  if err != nil { 
  4.    // handle error 
  5.  } 

單純的看這個例子似乎沒什么問題,但工程大了后呢?

顯然 if err != nil 的邏輯是會堆積在工程代碼中,Go 代碼里的 if err != nil 甚至會達到工程代碼量的 30% 以上:

  1. func main() { 
  2.  x, err := foo() 
  3.  if err != nil { 
  4.    // handle error 
  5.  } 
  6.  y, err := foo() 
  7.  if err != nil { 
  8.    // handle error 
  9.  } 
  10.  z, err := foo() 
  11.  if err != nil { 
  12.    // handle error 
  13.  } 
  14.  s, err := foo() 
  15.  if err != nil { 
  16.    // handle error 
  17.  } 

暴力的對比一下,就發(fā)現(xiàn)四行函數(shù)調用,十二行錯誤,還要苦練且精通 IDE 的快速折疊功能,還是比較麻煩的。

另外既然是錯誤處理,那肯定不單單是一個 return err 了。在工程實踐中,項目代碼都是層層嵌套的,如果直接寫成:

  1. if err != nil { 
  2.  return err 

在實際工程中肯定是不行。你怎么知道具體是哪里拋出來的錯誤信息,實際出錯時只能瞎猜。大家又想出了 PlanB,那就是加各種描述信息:

  1. if err != nil { 
  2.  logger.Errorf("煎魚報錯 err:%v", err) 
  3.  return err 

雖然看上去人模人樣的,在實際出錯時,也會遇到新的問題,因為你要去查這個錯誤是從哪里拋出來的,沒有調用堆棧,單純幾句錯誤描述是難以定位的。

這時候就會發(fā)展成到處打錯誤日志:

  1. func main() { 
  2.  err := bar() 
  3.  if err != nil { 
  4.   logger.Errorf("bar err:%v", err) 
  5.  } 
  6.  ... 
  7.  
  8. func bar() error { 
  9.  _, err := foo() 
  10.  if err != nil { 
  11.   logger.Errorf("foo err:%v", err) 
  12.   return err 
  13.  } 
  14.  
  15.  return nil 
  16.  
  17. func foo() ([]byte, error) { 
  18.  s, err := json.Marshal("hello world."
  19.  if err != nil { 
  20.   logger.Errorf("json.Marshal err:%v", err) 
  21.   return nil, err 
  22.  } 
  23.  
  24.  return s, nil 

雖然到處打了日志,就會變成錯誤日志非常多,一旦出問題,人肉可能短時間內識別不出來。

最常見的就是到 IDE 上 ctrl + f 搜索是在哪出錯。同時在實際應用中我們會自定義一些錯誤類型,在 Go 則需要各種判斷和處理:

  1. if err := dec.Decode(&val); err != nil { 
  2.     if serr, ok := err.(*json.SyntaxError); ok { 
  3.        ... 
  4.     } 
  5.     return err 

你得判斷不等于 nil,還得對自定義的錯誤類型進行斷言,整體來講比較繁瑣。

匯總來講,Go1 錯誤處理的問題至少有:

  • 在工程實踐中,if err != nil 寫的煩,代碼中一大堆錯誤處理的判斷,占了相當?shù)谋壤粔騼?yōu)雅。
  • 在排查問題時,Go 的 err 并沒有其他堆棧信息,只能自己增加描述信息,層層疊加,打一大堆日志,排查很麻煩。
  • 在驗證和測試錯誤時,要自定義錯誤(各種判斷和斷言)或者被迫用字符串校驗。

Go1.13 的挽尊

在 2019 年 09 月,Go1.13 正式發(fā)布。其中兩個比較大的兩個關注點分別是包依賴管理 Go modules 的轉正,以及錯誤處理 errors 標準庫的改進:

Error wrapping

在本次改進中,errors 標準庫引入了 Wrapping Error 的概念,并增加了 Is/As/Unwarp 三個方法,用于對所返回的錯誤進行二次處理和識別。

同時也是將 Go2 error 預規(guī)劃中沒有破壞 Go1 兼容性的相關功能提前實現(xiàn)了。

簡單來講,Go1.13 后 Go 的 error 就可以嵌套了,并提供了三個配套的方法。例子:

  1. func main() { 
  2.  e := errors.New("腦子進煎魚了"
  3.  w := fmt.Errorf("快抓住:%w", e) 
  4.  fmt.Println(w) 
  5.  fmt.Println(errors.Unwrap(w)) 

輸出結果:

  1. $ go run main.go 
  2. 快抓住:腦子進煎魚了 
  3. 腦子進煎魚了 

在上述代碼中,變量 w 就是一個嵌套一層的 error。最外層是 “快抓住:”,此處調用 %w 意味著 Wrapping Error 的嵌套生成。因此最終輸出了 “快抓住:腦子進煎魚了”。

需要注意的是,Go 并沒有提供 Warp 方法,而是直接擴展了 fmt.Errorf 方法。而下方的輸出由于直接調用了 errors.Unwarp 方法,因此將 “取” 出一層嵌套,最終直接輸出 “腦子進煎魚了”。

對 Wrapping Error 有了基本理解后,我們簡單介紹一下三個配套方法:

  1. func Is(err, target error) bool 
  2. func As(err error, target interface{}) bool 
  3. func Unwrap(err error) error 

errors.Is

方法簽名:

  1. func Is(err, target error) bool 

方法例子:

  1. func main() { 
  2.  if _, err := os.Open("non-existing"); err != nil { 
  3.   if errors.Is(err, os.ErrNotExist) { 
  4.    fmt.Println("file does not exist"
  5.   } else { 
  6.    fmt.Println(err) 
  7.   } 
  8.  } 
  9.  

errors.Is 方法的作用是判斷所傳入的 err 和 target 是否同一類型,如果是則返回 true。

errors.As

方法簽名:

  1. func As(err error, target interface{}) bool 

方法例子:

  1. func main() { 
  2.  if _, err := os.Open("non-existing"); err != nil { 
  3.   var pathError *os.PathError 
  4.   if errors.As(err, &pathError) { 
  5.    fmt.Println("Failed at path:", pathError.Path) 
  6.   } else { 
  7.    fmt.Println(err) 
  8.   } 
  9.  } 
  10.  

errors.As 方法的作用是從 err 錯誤鏈中識別和 target 相同的類型,如果可以賦值,則返回 true。

errors.Unwarp

方法簽名:

  1. func Unwrap(err error) error 

方法例子:

  1. func main() { 
  2.  e := errors.New("腦子進煎魚了"
  3.  w := fmt.Errorf("快抓?。?w", e) 
  4.  fmt.Println(w) 
  5.  fmt.Println(errors.Unwrap(w)) 

該方法的作用是將嵌套的 error 解析出來,若存在多級嵌套則需要調用多次 Unwarp 方法。

民間自救 pkg/errors

Go1 的 error 處理固然存在許多問題,因此在 Go1.13 前,早已有 “民間” 發(fā)現(xiàn)沒有上下文調試信息在實際工程應用中存在嚴重的體感問題。

因此 github.com/pkg/errors 在 2016 年誕生了,該庫也已經(jīng)受到了極大的關注。

官方例子如下:

  1. type stackTracer interface { 
  2.     StackTrace() errors.StackTrace 
  3.  
  4. err, ok := errors.Cause(fn()).(stackTracer) 
  5. if !ok { 
  6.     panic("oops, err does not implement stackTracer"
  7.  
  8. st := err.StackTrace() 
  9. fmt.Printf("%+v", st[0:2]) // top two frames 
  10.  
  11. // Example output
  12. // github.com/pkg/errors_test.fn 
  13. // /home/dfc/src/github.com/pkg/errors/example_test.go:47 
  14. // github.com/pkg/errors_test.Example_stackTrace 
  15. // /home/dfc/src/github.com/pkg/errors/example_test.go:127 

簡單來講,就是對 Go1 error 的上下文處理進行了優(yōu)化和處理,例如類型斷言、調用堆棧等。若有興趣的小伙伴可以自行到 github.com/pkg/errors 進行學習。

另外你可能會發(fā)現(xiàn) Go1.13 新增的 Wrapping Error 體系與 pkg/errors 有些相像。

你并沒有體會錯,Go team 接納了相關的意見,對 Go1 進行了調整,但調用堆棧這塊因綜合原因暫時沒有納入。

Go2 error 要解決什么問題

在前面我們聊了 Go1 error 的許多問題,以及 Go1.13 和 pkg/errors 的自救和融合。你可能會疑惑,那...Go2 error 還有出場的機會嗎?即使 Go1 做了這些事情,Go1 error 還有問題嗎?

并沒有解決,if err != nil 依舊一把梭,目前社區(qū)聲音依然認為 Go 語言的錯誤處理要改進。

Go2 error proposal

在 2018 年 8 月,官方正式公布了 Go 2 Draft Designs,其中包含泛型和錯誤處理機制改進的初步草案:

Go2 Draft Designs

注:Go1.13 正式將一些不破壞 Go1 兼容性的 Error 特性加入到了 main branch,也就是前面提到的 Wrapping Error。

錯誤處理(Error Handling)

第一個要解決的問題就是大量 if err != nil 的問題,針對此提出了 Go2 error handling 的草案設計。

簡單例子:

  1. if err != nil { 
  2.  return err 

優(yōu)化后的方案如下:

  1. func CopyFile(src, dst string) error { 
  2.  handle err { 
  3.   return fmt.Errorf("copy %s %s: %v", src, dst, err) 
  4.  } 
  5.  
  6.  r := check os.Open(src) 
  7.  defer r.Close() 
  8.  
  9.  w := check os.Create(dst) 
  10.  handle err { 
  11.   w.Close() 
  12.   os.Remove(dst) // (only if a check fails) 
  13.  } 
  14.  
  15.  check io.Copy(w, r) 
  16.  check w.Close() 
  17.  return nil 

主函數(shù):

  1. func main() { 
  2.  handle err { 
  3.   log.Fatal(err) 
  4.  } 
  5.  
  6.  hex := check ioutil.ReadAll(os.Stdin) 
  7.  data := check parseHexdump(string(hex)) 
  8.  os.Stdout.Write(data) 

該提案引入了兩種新的語法形式,首先是 check 關鍵字,其可以選中一個表達式 check f(x, y, z) 或 check err,其將會標識這是一個顯式的錯誤檢查。

其次引入了 handle 關鍵字,用于定義錯誤處理程序流轉,逐級上拋,依此類推,直到處理程序執(zhí)行 return 語句,才正式結束。

錯誤值打印(Error Printing)

第二個要解決的問題是錯誤值(Error Values)、錯誤檢查(Error Inspection)的問題,其引申出錯誤值打印(Error Printing)的問題,也可以認為是錯誤格式化的不便利。

官方針對此提出了提出了 Error Values 和 Error Printing 的草案設計。

簡單例子如下:

  1. if err != nil { 
  2.  return fmt.Errorf("write users database: %v", err) 

優(yōu)化后的方案如下:

  1. package errors 
  2.  
  3. type Wrapper interface { 
  4.  Unwrap() error 
  5.  
  6. func Is(err, target error) bool 
  7. func As(type E)(err error) (e E, ok bool) 

該提案增加了錯誤鏈的 Wrapping Error 概念,并同時增加 errors.Is 和 errors.As 的方法,與前面說到的 Go1.13 的改進一致,不再贅述。

需要留意的是,Go1.13 并沒有實現(xiàn) %+v 輸出調用堆棧的需求,因為此舉會破壞 Go1 兼容性和產生一些性能問題,大概會在 Go2 加入。

try-catch 不香嗎

社區(qū)中另外一股聲音就是直指 Go 語言反人類不用 try-catch 的機制,在社區(qū)內也產生了大量的探討,具體可以看看相關的提案 Proposal: A built-in Go error check function, "try"。

目前該提案已被拒絕,具體可參見 go/issues/32437#issuecomment-512035919 和 Why does Go not have exceptions。

總結

在這篇文章中,我們介紹了目前 Go1 Error 的現(xiàn)狀,概括了大家對 Go 語言錯誤處理的常見問題和意見。

同時還介紹了在這幾年間,Go team 針對 Go2、Go1.13 Error 的持續(xù)優(yōu)化和探索。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2009-11-20 09:11:07

Chrome OS谷歌操作系統(tǒng)

2012-09-21 10:49:16

虛擬化

2014-09-01 10:22:29

Ubuntu

2010-10-20 08:53:57

Android 3.0

2019-12-26 12:00:24

ECUG Con 20

2011-03-09 10:45:09

DiscuzX2公測新功能

2009-02-20 08:51:22

.NET框架CLR組件

2015-07-30 10:05:37

Java9JShell

2009-10-28 12:27:36

linux操作系統(tǒng)發(fā)展

2011-04-08 16:14:21

2021-06-17 08:00:00

Windows 10Windows微軟

2013-03-25 09:51:53

Facebook數(shù)據(jù)中心云數(shù)據(jù)中心

2015-05-12 11:49:45

OpenStack K開源特性分析

2011-11-30 08:41:20

NoSQL數(shù)據(jù)庫

2009-03-31 09:04:46

MacChrome瀏覽器

2009-02-12 15:18:59

2015-04-23 10:57:07

Apple WatchAPP

2011-04-01 11:26:21

JDK 7

2010-11-17 11:25:20

高交會郵件安全263企業(yè)郵箱

2021-01-20 09:52:54

Windows 功能系統(tǒng)
點贊
收藏

51CTO技術棧公眾號

天天干天天色天天| 久久久久久久9999| 亚洲成人高清| 亚洲韩国一区二区三区| 欧美另类网站| 国产女同91疯狂高潮互磨| 亚洲黄色高清| 北条麻妃久久精品| 日本三级日本三级日本三级极| 欧美日韩亚洲国产| 亚洲午夜久久久久中文字幕久| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 日本在线视频一区二区| 夜夜夜精品看看| 亚洲v日韩v欧美v综合| 免费观看黄一级视频| 日韩av在线免费观看不卡| 久久99热精品| 成人一级片免费看| 日韩大片在线免费观看| 欧美一卡2卡3卡4卡| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 日韩三级电影视频| 久久久www成人免费无遮挡大片| 91精品国产高清久久久久久91裸体| www五月天com| 黄色精品网站| 久久久精品国产网站| 人妻少妇无码精品视频区| 亚洲天堂中文字幕在线观看| 欧美日韩三级一区二区| 欧美极品欧美精品欧美图片| 国产天堂在线播放视频| 国产精品每日更新| 日产精品一线二线三线芒果| 国产av无码专区亚洲av| 乱一区二区av| 国产精品视频xxxx| 国产精品va无码一区二区三区| 国产综合网站| 欧美激情视频一区| 欧美成人国产精品高潮| 91欧美在线| 最近2019中文字幕在线高清| 成人影视免费观看| 性欧美xxxx免费岛国不卡电影| 精品国产网站在线观看| 秋霞午夜鲁丝一区二区| 国产一区二区三区| 制服丝袜亚洲播放| 日本77777| www欧美在线观看| 欧美巨大另类极品videosbest| 香蕉视频禁止18| 日韩不卡视频在线观看| 欧美日韩中文一区| 五月婷婷六月丁香激情| 欧美三级电影网址| 欧美日本在线播放| 在线一区二区不卡| 久久一级大片| 欧美精品一区二区久久婷婷| 99精品一区二区三区无码吞精| 超碰成人福利| 日韩电影免费在线观看中文字幕| 国产毛片毛片毛片毛片毛片毛片| 台湾佬综合网| 亚洲日本欧美中文幕| 免费视频91蜜桃| 欧美xxxxx视频| 欧美精品制服第一页| 欧美成人aaa片一区国产精品| 亚洲激情黄色| 国产91热爆ts人妖在线| 在线观看中文字幕av| 久久91精品国产91久久小草| 91成人理论电影| 欧美熟妇乱码在线一区| 久久久综合精品| 亚洲欧洲精品一区二区三区波多野1战4 | 国产一区二区在线免费观看| 成人av资源网| 日韩av地址| 中文字幕一区三区| 青青青在线观看视频| 蜜桃视频m3u8在线观看| 在线精品亚洲一区二区不卡| 亚洲精品国产久| 色爱综合av| 色琪琪综合男人的天堂aⅴ视频| 欧美视频www| 亚洲一区黄色| 成人网欧美在线视频| 日韩专区第一页| 中文字幕精品在线不卡| 99热久久这里只有精品| 春暖花开亚洲一区二区三区| 日韩一区二区精品在线观看| 性久久久久久久久久| 国产精品久久观看| 欧美亚洲国产另类| 国产毛片毛片毛片毛片| www.日韩精品| 日本不卡一区二区三区四区| 校园春色亚洲| 欧美一区二区视频在线观看| 免费观看av网站| 欧美jjzz| 国产啪精品视频| 欧美色图另类| 亚洲自拍欧美精品| jizz18女人| 天堂日韩电影| 欧美区二区三区| 一区二区视频免费| 91亚洲男人天堂| 激情五月五月婷婷| 成人免费av电影| 日韩av综合网站| 国产一级免费观看| 国精产品一区一区三区mba桃花 | 欧美日韩四区| 成人网欧美在线视频| h视频网站在线观看| 黑人巨大精品欧美一区免费视频| 台湾佬美性中文| 欧美成人直播| 国产精品丝袜久久久久久高清| 亚洲人妻一区二区| 亚洲国产美国国产综合一区二区| 日本超碰在线观看| 欧美在线免费看视频| 日本一欧美一欧美一亚洲视频| 理论片中文字幕| 一区二区三区在线不卡| 国内精品国产三级国产aⅴ久| 久久一区二区三区电影| 国产精品第一第二| 成人免费黄色网页| 欧洲一区二区av| 欧美 日韩 成人| 日本不卡一区二区三区高清视频| 欧美日产一区二区三区在线观看| 密臀av在线播放| 日韩av在线网| 亚洲天堂一区在线| 久久综合色播五月| 波多野结衣作品集| 精品国产一区二区三区香蕉沈先生| 韩国国内大量揄拍精品视频| 日韩一级在线播放| 精品福利在线看| a级在线观看视频| 乱人伦精品视频在线观看| 欧美日韩国产精品一区二区| 日韩国产激情| 这里只有精品久久| 国产又粗又黄又爽| 一区二区三区中文字幕电影| 国产精品一区二区无码对白| 在线一区免费观看| 日本一区精品| 亚洲综合资源| 色综合久综合久久综合久鬼88| 俄罗斯嫩小性bbwbbw| 午夜欧美视频在线观看| v8888av| 美女视频黄a大片欧美| 椎名由奈jux491在线播放| 欧美特黄不卡| 91成人在线观看国产| 国产日本在线观看| 欧美一区午夜精品| 日韩欧美亚洲一区二区三区| 91女神在线视频| 无限资源日本好片| 国产一区亚洲| 久久青青草原| 国产成人精品一区二区三区在线| 不卡av电影院| 色猫av在线| 欧美亚洲精品一区| 欧美被狂躁喷白浆精品| 久久九九国产精品| 污免费在线观看| 午夜综合激情| 国产日本欧美在线| 九九综合久久| 97久久精品午夜一区二区| 在线观看特色大片免费视频| 日韩中文字幕在线| 日韩在线视频免费| 欧美日韩精品欧美日韩精品一| 九九热国产精品视频| 欧美极品aⅴ影院| 韩国av中国字幕| 日本不卡高清视频| www在线观看免费| 91一区二区| 精品蜜桃传媒| 天堂av一区| 国产精品视频中文字幕91| 好吊日av在线| 久久精品99无色码中文字幕 | 99久久精品免费看| 91网址在线观看精品| 久久婷婷丁香| 农民人伦一区二区三区| 国产精品久久天天影视| 奇米影视首页 狠狠色丁香婷婷久久综合 | 黄色aaa视频| 丁香婷婷综合五月| 精品综合久久久久| 三级久久三级久久| 99精品人妻少妇一区二区| 在线中文字幕第一区| 色噜噜狠狠色综合网| 视频小说一区二区| 肥熟一91porny丨九色丨| 高清一区二区| 成人免费淫片aa视频免费| 天然素人一区二区视频| 欧美在线视频观看| 国产精选在线| 久久久久久久久久国产| av色综合久久天堂av色综合在| 深夜精品寂寞黄网站在线观看| 肉丝一区二区| 日韩高清免费在线| 欧美一级淫片免费视频魅影视频| 日韩一区二区三区av| a级片在线视频| 这里只有精品视频在线观看| 亚洲一级av毛片| 欧美视频一区二区在线观看| 91青青草视频| 欧美午夜在线观看| 亚洲无码精品在线播放| 欧美日韩免费在线视频| 亚洲综合精品在线| 欧美片在线播放| 一级aaaa毛片| 欧美精选午夜久久久乱码6080| 波多野结衣网站| 在线视频欧美精品| 天天综合久久综合| 欧洲色大大久久| 一级黄色大片网站| 欧美精品在线观看播放| 国产三级精品在线观看| 欧美一二三区在线| 日本精品久久久久| 亚洲激情成人网| 免费国产在线视频| 一区二区三区精品99久久| 最新电影电视剧在线观看免费观看| 一区二区三区久久精品| 国产婷婷视频在线| 久久6精品影院| yellow在线观看网址| 日本韩国欧美精品大片卡二| 久久精品女人天堂av免费观看| 国产免费一区二区三区香蕉精| 四虎在线精品| 岛国视频一区免费观看| 欧美色资源站| 三级三级久久三级久久18| 888久久久| 777av视频| 日本午夜精品视频在线观看 | 久久综合国产精品| 中文字幕伦理片| 亚洲精品老司机| 天天插天天操天天干| 欧美三区在线观看| 精品久久人妻av中文字幕| 日韩激情片免费| av黄色在线观看| 欧美激情视频给我| 国模视频一区| wwwxx欧美| 欧美色蜜桃97| 免费看日b视频| 男女精品网站| 精品人妻一区二区乱码| 26uuu精品一区二区三区四区在线| 日韩一区二区三区四区视频| 亚洲一区日韩精品中文字幕| 国产suv精品一区二区33| 日韩欧美高清dvd碟片| 狠狠v欧美ⅴ日韩v亚洲v大胸| 久久不射电影网| 中文av在线全新| 亚洲va电影大全| 成人婷婷网色偷偷亚洲男人的天堂| 青青草综合在线| 日韩电影在线看| 99久久免费看精品国产一区| 国产精品久久看| 国产一区二区99| 日韩欧美一二三四区| av午夜在线| 45www国产精品网站| 日韩精品成人在线观看| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 手机av免费看| 夜夜嗨av一区二区三区四季av| 正在播放木下凛凛xv99| 日韩高清a**址| 黄色羞羞视频在线观看| 91久久久在线| 九九视频免费观看视频精品| 精品视频在线观看一区| 国产福利一区二区三区在线视频| 五月天精品在线| 欧美性猛交xxxx偷拍洗澡| 一本色道久久综合亚洲| 亚洲系列中文字幕| 中文字幕在线高清| 国产一区二区中文字幕免费看| 亚州av乱码久久精品蜜桃| 久久精品99国产| 96av麻豆蜜桃一区二区| 国产在线视频99| 日韩午夜激情av| 国产淫片在线观看| 成人日韩av在线| 天天综合网网欲色| 九九热精品在线播放| 国产精品水嫩水嫩| 日本一区二区三区久久| 亚洲乱码一区av黑人高潮| 国产免费拔擦拔擦8x高清在线人 | 38少妇精品导航| 国产精品xxxav免费视频| 日韩精品久久一区二区| 国产成人精品三级| 超碰在线国产97| 日韩一级成人av| a级影片在线| 99久久伊人精品影院| 国内精品嫩模av私拍在线观看| 国产在线a视频| 一区二区三区成人| 丰满岳乱妇国产精品一区| 欧美激情第6页| 加勒比色老久久爱综合网| 亚洲熟妇无码一区二区三区| av一二三不卡影片| 国产精品自拍99| 国产亚洲欧洲高清一区| 素人啪啪色综合| youjizz.com亚洲| 国产一区二区三区不卡在线观看| 天堂网avav| 精品国产一区二区亚洲人成毛片| av在线理伦电影| 久久久久久亚洲精品不卡4k岛国 | 国产精品91久久久| 成人久久综合| 亚洲在线观看网站| 亚洲永久免费av| 日韩精品福利| 国产精品美女久久| 亚洲九九视频| 在线精品视频播放| 色8久久精品久久久久久蜜| av电影在线观看| 5g影院天天爽成人免费下载| 亚洲区第一页| 极品人妻videosss人妻| 欧美一区二区在线播放| 国产美女高潮在线| 一本一道久久久a久久久精品91| 国产精品一区二区免费不卡| 日韩欧美国产亚洲| 国产亚洲欧洲高清| 一区二区三区四区精品视频| 久久久999视频| 1区2区3区国产精品| 姝姝窝人体www聚色窝| 国产精品黄色av| 欧美aa国产视频| 国产一区二区三区四区五区六区| 538prom精品视频线放| 黄色aa久久| 永久域名在线精品| 91在线一区二区三区| 夜夜嗨aⅴ一区二区三区| 性欧美亚洲xxxx乳在线观看| 日本久久综合| 日韩av手机在线播放| 欧美浪妇xxxx高跟鞋交| 激情国产在线| 伊人狠狠色丁香综合尤物| 91免费版在线| 国产后入清纯学生妹| 国产suv精品一区二区三区88区| 亚洲一区二区三区无吗| 国产精品扒开腿做爽爽|