精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一本色道久久hezyo无码| 91啪九色porn原创视频在线观看| 中文字幕国产一区二区| 欧美精品一区二区免费| 水蜜桃亚洲精品| 欧美不卡视频在线观看| 高清一区二区| 国产精品女人毛片| 欧美在线亚洲在线| 手机免费看av片| 亚洲精品白浆| 亚洲影视一区| 欧美日韩成人激情| 天天人人精品| www.日韩高清| 综合亚洲视频| 亚洲欧美综合图区| 国产91在线视频观看| 神马午夜在线观看| 极品日韩av| 亚洲成人性视频| 精品成在人线av无码免费看| www.午夜激情| 视频一区二区欧美| 怡红院精品视频| 美女网站免费观看视频| 国产免费av高清在线| 日韩电影在线一区二区三区| 一个人看的www久久| 蜜桃视频无码区在线观看| 大片免费在线看视频| 麻豆91精品视频| 久久视频免费观看| 一区二区三区四区毛片| 成人短视频在线观看| 久久精品人人做人人爽97| 国产福利精品视频| 日本欧美一区二区三区不卡视频| 玖玖精品在线| 亚洲欧洲中文日韩久久av乱码| 91天堂在线视频| 麻豆一区产品精品蜜桃的特点 | 欧美在线免费看视频| 色哟哟一区二区| 欧美一区二区福利| 亚洲一级黄色大片| 亚洲成人一区| 亚洲第一天堂av| 日本成人xxx| av手机免费在线观看| 99re这里只有精品6| 日韩美女视频免费看| 呻吟揉丰满对白91乃国产区| 精品一区二区三区中文字幕视频| 亚洲午夜精品网| 欧美一区视久久| 香蕉人妻av久久久久天天| 老司机精品导航| 人体精品一二三区| 国产美女激情视频| 天天久久综合| 日韩av中文字幕在线| 三级在线视频观看| 日本天码aⅴ片在线电影网站| 中文字幕日韩一区| 国产一区再线| 亚洲一卡二卡在线观看| 日本不卡的三区四区五区| 欧美精品性视频| 国模无码国产精品视频| 亚洲精品456| 欧美一区二区三区视频在线 | 精品久久久久久乱码天堂| 国产精品久免费的黄网站| 99精品99| 久久综合久久八八| 国产女人被狂躁到高潮小说| 欧美成人综合| 一本一道久久a久久精品逆3p| www..com.cn蕾丝视频在线观看免费版 | 国产精品福利在线播放| 国产精品一区二区三区免费| 久久精品国产亚洲av麻豆蜜芽| 激情亚洲网站| 欧美做受高潮1| 中文字幕+乱码+中文| 99pao成人国产永久免费视频| 91精品国产91久久| 91嫩草丨国产丨精品| 蜜桃tv一区二区三区| 欧美成人免费网站| 日本美女视频一区| 亚洲日本在线观看视频| 欧美日韩国产综合新一区| 亚洲欧美一二三| av基地在线| 国产日韩欧美综合一区| 中文字幕日韩一区二区三区| 东凛在线观看| 又紧又大又爽精品一区二区| 亚洲一区尤物| 国产三级在线免费观看| 亚洲精品写真福利| 中文字幕色一区二区| av中文资源在线资源免费观看| 在线观看一区日韩| 国产一级特黄a大片免费| 电影91久久久| 精品无人国产偷自产在线| www.美色吧.com| 国产成人精品免费视| 亚洲欧美日本精品| 色婷婷在线影院| 一道在线中文一区二区三区| 久久躁狠狠躁夜夜爽| 青草视频在线观看免费| 久久se这里有精品| 成人久久一区二区| 一本一道人人妻人人妻αv | 2022国产精品| 国产精品无码在线播放| 激情综合网天天干| 91美女片黄在线观| 日本中文字幕一区二区有码在线| 92国产精品观看| 亚洲av综合色区| 亚洲精品白浆| 欧美日韩视频不卡| 99热一区二区| 中文成人在线| 日韩一区二区三区四区五区六区 | 五月天综合激情| 亚洲精品精选| 欧美综合在线观看| www.97av.com| 亚洲欧美另类在线| 色免费在线视频| 国产欧美亚洲精品a| 午夜精品福利电影| 国产91精品一区| 国产**成人网毛片九色| 久久久一本精品99久久精品| sese一区| 亚洲综合丁香婷婷六月香| 天堂8在线天堂资源bt| 国产欧洲在线| 欧美在线不卡一区| 国产精品二区视频| 午夜精品影视国产一区在线麻豆| 一区二区欧美在线| 国产精品第六页| 国产精品一级黄| 久久精品女人的天堂av| 超碰99在线| 亚洲国产精品99| 亚洲一区欧美在线| aaa亚洲精品| 亚洲国产一区二区三区在线播| av官网在线播放| 色欧美日韩亚洲| 亚洲免费成人在线视频| 91欧美在线| 1769国产精品| 天天爽夜夜爽夜夜爽| 午夜精品久久久久久久99水蜜桃| 青青草av网站| 欧美先锋资源| 成人免费直播live| 成人免费网站在线观看视频| 日韩午夜在线影院| 国产精品7777777| 久久亚洲欧美国产精品乐播 | 999国内精品视频在线| av网站在线看| 亚洲成人久久网| 少妇一级淫片免费放中国 | 亚洲成人第一网站| 国产一区二区精品久久91| 欧美极品一区二区| 欧美1234区| 91精品免费在线观看| 播金莲一级淫片aaaaaaa| 你懂的视频一区二区| 国产精品久久久久久久天堂第1集| 黄页网站大全在线免费观看| 欧美另类一区二区三区| 中文字幕在线看高清电影| 天堂影院一区二区| 亚洲春色在线| 视频二区欧美毛片免费观看| 日韩有码在线播放| 探花国产精品一区二区| 亚洲精品视频观看| 蜜桃精品成人影片| 99综合精品| 神马欧美一区二区| 日韩视频一区二区三区四区| 欧美亚洲激情视频| 色窝窝无码一区二区三区| 一本一本大道香蕉久在线精品 | 无码国产精品高潮久久99| 在线免费观看日韩欧美| 久久黄色免费网站| 日本一区二区视频在线观看| 欧美xxxxx在线视频| 你懂的在线观看一区二区| 欧美久久久精品| 日韩国产亚洲欧美| 亚洲一区二区欧美日韩| 亚洲午夜精品久久久久久高潮| 成人午夜碰碰视频| 欧美国产日韩激情| 欧美独立站高清久久| 麻豆精品视频| 成人欧美一区二区三区的电影| 日韩精品福利网站| 国产毛片久久久久| 一区二区三区在线观看动漫| 永久免费成人代码| 男女男精品视频| 亚洲精品一区二| 欧美wwwwww| 99久久久久国产精品免费| 伊人手机在线| 色悠悠久久88| 国产绿帽一区二区三区| 在线观看视频91| 国产精品免费av一区二区| 综合欧美一区二区三区| 欧美丰满美乳xxⅹ高潮www| 99热99精品| 亚洲婷婷在线观看| 国产成人免费在线视频| 国产原创中文在线观看| 最近国产精品视频| 国产伦精品一区二区三区免| 久久久久毛片免费观看| 国产在线999| 牛牛在线精品视频| 久久这里只有精品99| 日本高清中文字幕在线| 欧美mv日韩mv| 99久久精品国产成人一区二区| 欧美手机在线视频| 嫩草影院一区二区三区| 色噜噜狠狠一区二区三区果冻| 久久黄色精品视频| 舔着乳尖日韩一区| 国产破处视频在线观看| 26uuu国产在线精品一区二区| www.日本高清| 麻豆视频一区二区| 美女网站视频黄色| 精品福利电影| 给我免费播放片在线观看| 欧美一站二站| 夜夜爽www精品| 婷婷综合在线| 黄色a级片免费看| 亚洲一级网站| 久久9精品区-无套内射无码| 91精品啪在线观看国产81旧版 | 精品69视频一区二区三区Q| 伊人网在线免费| 精品动漫3d一区二区三区免费版 | 免费高清成人在线| 中文字幕永久有效| 国产精品中文字幕日韩精品| 在线精品视频播放| 久久中文字幕电影| 欧美福利第一页| 综合欧美一区二区三区| 九九热视频精品| 欧美日韩国产中文字幕| 懂色av中文字幕| 欧美欧美午夜aⅴ在线观看| 99免费在线视频| 91成人免费在线视频| 在线视频你懂得| 日韩精品综合一本久道在线视频| 成人小视频在线播放| 欧美日韩精品一区二区在线播放| 国产美女主播在线观看| 亚洲精品在线免费观看视频| 国产一区二区三区视频免费观看| 欧美视频在线免费看| 久久精品国产亚洲av无码娇色| 亚洲欧洲精品天堂一级| 免费在线观看黄视频| 欧美性jizz18性欧美| 影音先锋国产在线| 欧美成人女星排行榜| 国内精品在线视频| 亚洲精品99999| 亚洲国产精品无码久久| 欧美人伦禁忌dvd放荡欲情| 成人h动漫精品一区二区无码| 亚洲精品日韩久久久| 麻豆传媒免费在线观看| 夜夜嗨av一区二区三区免费区| 黄色成年人视频在线观看| 中文字幕精品在线视频| 国产www.大片在线| 精品中文字幕视频| 日韩视频网站在线观看| 国产成人一区二| 日韩在线网址| 色视频一区二区三区| 国自产拍偷拍福利精品免费一| 欧美一级爱爱视频| 欧美日本不卡| 青春草国产视频| 久久se精品一区精品二区| 国产精品无码毛片| 亚洲九九爱视频| 国产又粗又猛又爽又| 亚洲国产精品久久久久秋霞蜜臀| 欧美高清视频| 国产999精品久久久| 九色丨蝌蚪丨成人| 欧美韩国日本精品一区二区三区| 亚洲天堂免费| 欧美伦理片在线观看| 91毛片在线观看| 国产一卡二卡在线| 婷婷国产v国产偷v亚洲高清| 国产日韩欧美中文字幕| 中文字幕视频在线免费欧美日韩综合在线看 | 999一区二区三区| 国内精品免费**视频| 网站永久看片免费| 亚洲色图一区二区| 中国女人一级一次看片| 精品视频在线播放| 国产ktv在线视频| av资源站久久亚洲| 亚洲网色网站| 在线播放黄色av| 不卡av免费在线观看| 少妇久久久久久久久久| 香蕉影视欧美成人| 人妻精品无码一区二区| 亚洲人精选亚洲人成在线| 91白丝在线| 国产另类自拍| 亚洲欧洲一区| 男人网站在线观看| 午夜国产精品一区| 色婷婷中文字幕| 5566日本婷婷色中文字幕97| 任你躁在线精品免费| 91国视频在线| 国产综合色产在线精品| 波多野结衣欲乱| 欧美精品视频www在线观看| 五月天婷婷在线视频| 国产在线播放不卡| 婷婷激情图片久久| 午夜激情视频网| 亚洲一区成人在线| 日韩一区二区三区在线观看视频| 亚洲91av视频| 国产精品三级| 污污网站在线观看视频| 亚洲色图视频免费播放| 亚洲欧美高清视频| 正在播放欧美视频| 精品福利在线| 成年在线观看视频| 91蜜桃网址入口| 在线观看国产精品入口男同| 久久久91精品国产| 巨胸喷奶水www久久久免费动漫| 日本一区二区三区免费看| 蜜臀av国产精品久久久久| 免费在线观看黄色小视频| 91福利精品第一导航| 日韩三级影院| av成人免费观看| 久色成人在线| 日韩成人短视频| 亚洲国产精彩中文乱码av| avav成人| wwwwww欧美| 久久久久久久综合色一本| 日韩精品成人一区| 亚洲免费人成在线视频观看| 久久人人视频| 久久久亚洲国产精品| 国产女人18毛片水真多成人如厕 | 国产精品影视网| 亚洲另类欧美日韩| 久久夜精品香蕉| 色婷婷精品视频| 伊人精品视频在线观看| 日韩欧美在线国产| a毛片在线观看| 欧美区高清在线| 国产老妇另类xxxxx| 无码人妻aⅴ一区二区三区有奶水|