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

為什么要避免在 Go 中使用 ioutil.ReadAll?

開發(fā) 前端
本篇文章從一個問題入手,重點研究了 ioutil.ReadAll 函數(shù)。主要原因是在小數(shù)據(jù)量的情況下,這個函數(shù)并沒有什么問題,但當數(shù)據(jù)量大時,它就變成了一顆定時炸彈。有可能會影響程序的性能,甚至會導致程序崩潰。

ioutil.ReadAll 主要的作用是從一個 io.Reader 中讀取所有數(shù)據(jù),直到結尾。

在 GitHub 上搜索 ioutil.ReadAll,類型選擇 Code,語言選擇 Go,一共得到了 637307 條結果。

這說明 ioutil.ReadAll 還是挺受歡迎的,主要也是用起來確實方便。

但是當遇到大文件時,這個函數(shù)就會暴露出兩個明顯的缺點:

性能問題,文件越大,性能越差。

文件過大的話,可能直接撐爆內(nèi)存,導致程序崩潰。

為什么會這樣呢?這篇文章就通過源碼來分析背后的原因,并試圖給出更好的解決方案。

下面我們正式開始。

ioutil.ReadAll

首先,我們通過一個例子看一下 ioutil.ReadAll 的使用場景。比如說,使用 http.Client 發(fā)送 GET 請求,然后再讀取返回內(nèi)容:

  1. func main() { 
  2.     res, err := http.Get("http://www.google.com/robots.txt"
  3.     if err != nil { 
  4.         log.Fatal(err) 
  5.     } 
  6.  
  7.     robots, err := io.ReadAll(res.Body) 
  8.     res.Body.Close() 
  9.     if err != nil { 
  10.         log.Fatal(err) 
  11.     } 
  12.     fmt.Printf("%s", robots) 

http.Get() 返回的數(shù)據(jù),存儲在 res.Body 中,通過 ioutil.ReadAll 將其讀取出來。

表面上看這段代碼沒有什么問題,但仔細分析卻并非如此。想要探究其背后的原因,就只能靠源碼說話。

ioutil.ReadAll 的源碼如下:

  1. // src/io/ioutil/ioutil.go 
  2.  
  3. func ReadAll(r io.Reader) ([]byte, error) { 
  4.     return io.ReadAll(r) 

Go 1.16 版本開始,直接調(diào)用 io.ReadAll() 函數(shù),下面再看看 io.ReadAll() 的實現(xiàn):

  1. // src/io/io.go 
  2.  
  3. func ReadAll(r Reader) ([]byte, error) { 
  4.     // 創(chuàng)建一個 512 字節(jié)的 buf 
  5.     b := make([]byte, 0, 512) 
  6.     for { 
  7.         if len(b) == cap(b) { 
  8.             // 如果 buf 滿了,則追加一個元素,使其重新分配內(nèi)存 
  9.             b = append(b, 0)[:len(b)] 
  10.         } 
  11.         // 讀取內(nèi)容到 buf 
  12.         n, err := r.Read(b[len(b):cap(b)]) 
  13.         b = b[:len(b)+n] 
  14.         // 遇到結尾或者報錯則返回 
  15.         if err != nil { 
  16.             if err == EOF { 
  17.                 err = nil 
  18.             } 
  19.             return b, err 
  20.         } 
  21.     } 

我給代碼加上了必要的注釋,這段代碼的執(zhí)行主要分三個步驟:

  • 創(chuàng)建一個 512 字節(jié)的 buf;
  • 不斷讀取內(nèi)容到 buf,當 buf 滿的時候,會追加一個元素,促使其重新分配內(nèi)存;
  • 直到結尾或報錯,則返回;

知道了執(zhí)行步驟,但想要分析其性能問題,還需要了解 Go 切片的擴容策略,如下:

  • 如果期望容量大于當前容量的兩倍就會使用期望容量;
  • 如果當前切片的長度小于 1024 就會將容量翻倍;
  • 如果當前切片的長度大于 1024 就會每次增加 25% 的容量,直到新容量大于期望容量;

也就是說,如果待拷貝數(shù)據(jù)的容量小于 512 字節(jié)的話,性能不受影響。但如果超過 512 字節(jié),就會開始切片擴容。數(shù)據(jù)量越大,擴容越頻繁,性能受影響越大。

如果數(shù)據(jù)量足夠大的話,內(nèi)存可能就直接撐爆了,這樣的話影響就大了。

那有更好的替換方案嗎?當然是有的,我們接著往下看。

io.Copy

可以使用 io.Copy 函數(shù)來代替,源碼定義如下:

  1. src/io/io.go 
  2.  
  3. func Copy(dst Writer, src Reader) (written int64, err error) { 
  4.     return copyBuffer(dst, src, nil) 

其功能是直接從 src 讀取數(shù)據(jù),并寫入到 dst。

和 ioutil.ReadAll 最大的不同就是沒有把所有數(shù)據(jù)一次性都取出來,而是不斷讀取,不斷寫入。

具體實現(xiàn) Copy 的邏輯在 copyBuffer 函數(shù)中實現(xiàn):

  1. // src/io/io.go 
  2.  
  3. func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) { 
  4.     // 如果源實現(xiàn)了 WriteTo 方法,則直接調(diào)用 WriteTo 
  5.     if wt, ok := src.(WriterTo); ok { 
  6.         return wt.WriteTo(dst) 
  7.     } 
  8.     // 同樣的,如果目標實現(xiàn)了 ReaderFrom 方法,則直接調(diào)用 ReaderFrom 
  9.     if rt, ok := dst.(ReaderFrom); ok { 
  10.         return rt.ReadFrom(src) 
  11.     } 
  12.     // 如果 buf 為空,則創(chuàng)建 32KB 的 buf 
  13.     if buf == nil { 
  14.         size := 32 * 1024 
  15.         if l, ok := src.(*LimitedReader); ok && int64(size) > l.N { 
  16.             if l.N < 1 { 
  17.                 size = 1 
  18.             } else { 
  19.                 size = int(l.N) 
  20.             } 
  21.         } 
  22.         buf = make([]byte, size
  23.     } 
  24.     // 循環(huán)讀取數(shù)據(jù)并寫入 
  25.     for { 
  26.         nr, er := src.Read(buf) 
  27.         if nr > 0 { 
  28.             nw, ew := dst.Write(buf[0:nr]) 
  29.             if nw < 0 || nr < nw { 
  30.                 nw = 0 
  31.                 if ew == nil { 
  32.                     ew = errInvalidWrite 
  33.                 } 
  34.             } 
  35.             written += int64(nw) 
  36.             if ew != nil { 
  37.                 err = ew 
  38.                 break 
  39.             } 
  40.             if nr != nw { 
  41.                 err = ErrShortWrite 
  42.                 break 
  43.             } 
  44.         } 
  45.         if er != nil { 
  46.             if er != EOF { 
  47.                 err = er 
  48.             } 
  49.             break 
  50.         } 
  51.     } 
  52.     return written, err 

此函數(shù)執(zhí)行步驟如下:

如果源實現(xiàn)了 WriteTo 方法,則直接調(diào)用 WriteTo 方法;

同樣的,如果目標實現(xiàn)了 ReaderFrom 方法,則直接調(diào)用 ReaderFrom 方法;

如果 buf 為空,則創(chuàng)建 32KB 的 buf;

最后就是循環(huán) Read 和 Write;

對比之后就會發(fā)現(xiàn),io.Copy 函數(shù)不會一次性讀取全部數(shù)據(jù),也不會頻繁進行切片擴容,顯然在數(shù)據(jù)量大時是更好的選擇。

ioutil 其他函數(shù)

再看看 ioutil 包的其他函數(shù):

  • func ReadDir(dirname string) ([]os.FileInfo, error)
  • func ReadFile(filename string) ([]byte, error)
  • func WriteFile(filename string, data []byte, perm os.FileMode) error
  • func TempFile(dir, prefix string) (f *os.File, err error)
  • func TempDir(dir, prefix string) (name string, err error)
  • func NopCloser(r io.Reader) io.ReadCloser

下面舉例詳細說明:

ReadDir

  1. // ReadDir 讀取指定目錄中的所有目錄和文件(不包括子目錄)。 
  2. // 返回讀取到的文件信息列表和遇到的錯誤,列表是經(jīng)過排序的。 
  3. func ReadDir(dirname string) ([]os.FileInfo, error) 

舉例:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "io/ioutil" 
  6.  
  7. func main() { 
  8.     dirName := "../" 
  9.     fileInfos, _ := ioutil.ReadDir(dirName) 
  10.     fmt.Println(len(fileInfos)) 
  11.     for i := 0; i < len(fileInfos); i++ { 
  12.         fmt.Printf("%T\n", fileInfos[i]) 
  13.         fmt.Println(i, fileInfos[i].Name(), fileInfos[i].IsDir()) 
  14.  
  15.     } 

ReadFile

  1. // ReadFile 讀取文件中的所有數(shù)據(jù),返回讀取的數(shù)據(jù)和遇到的錯誤 
  2. // 如果讀取成功,則 err 返回 nil,而不是 EOF 
  3. func ReadFile(filename string) ([]byte, error) 

舉例:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "io/ioutil" 
  6.     "os" 
  7.  
  8. func main() { 
  9.     data, err := ioutil.ReadFile("./test.txt"
  10.     if err != nil { 
  11.         fmt.Println("read error"
  12.         os.Exit(1) 
  13.     } 
  14.     fmt.Println(string(data)) 

WriteFile

  1. // WriteFile 向文件中寫入數(shù)據(jù),寫入前會清空文件。 
  2. // 如果文件不存在,則會以指定的權限創(chuàng)建該文件。 
  3. // 返回遇到的錯誤。 
  4. func WriteFile(filename string, data []byte, perm os.FileMode) error 

舉例:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "io/ioutil" 
  6.  
  7. func main() { 
  8.     fileName := "./text.txt" 
  9.     s := "Hello AlwaysBeta" 
  10.     err := ioutil.WriteFile(fileName, []byte(s), 0777) 
  11.     fmt.Println(err) 

TempFile

  1. // TempFile 在 dir 目錄中創(chuàng)建一個以 prefix 為前綴的臨時文件,并將其以讀 
  2. // 寫模式打開。返回創(chuàng)建的文件對象和遇到的錯誤。 
  3. // 如果 dir 為空,則在默認的臨時目錄中創(chuàng)建文件(參見 os.TempDir),多次 
  4. // 調(diào)用會創(chuàng)建不同的臨時文件,調(diào)用者可以通過 f.Name() 獲取文件的完整路徑。 
  5. // 調(diào)用本函數(shù)所創(chuàng)建的臨時文件,應該由調(diào)用者自己刪除。 
  6. func TempFile(dir, prefix string) (f *os.File, err error) 

舉例:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "io/ioutil" 
  6.     "os" 
  7.  
  8. func main() { 
  9.     f, err := ioutil.TempFile("./""Test"
  10.     if err != nil { 
  11.         fmt.Println(err) 
  12.     } 
  13.     defer os.Remove(f.Name()) // 用完刪除 
  14.     fmt.Printf("%s\n", f.Name()) 

TempDir

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "io/ioutil" 
  6.     "os" 
  7.  
  8. func main() { 
  9.     dir, err := ioutil.TempDir("./""Test"
  10.     if err != nil { 
  11.         fmt.Println(err) 
  12.     } 
  13.     defer os.Remove(dir) // 用完刪除 
  14.     fmt.Printf("%s\n", dir) 

NopCloser

  1. // NopCloser 將 r 包裝為一個 ReadCloser 類型,但 Close 方法不做任何事情。 
  2. func NopCloser(r io.Reader) io.ReadCloser 

這個函數(shù)的使用場景是這樣的:

有時候我們需要傳遞一個 io.ReadCloser 的實例,而我們現(xiàn)在有一個 io.Reader 的實例,比如:strings.Reader。

這個時候 NopCloser 就派上用場了。它包裝一個 io.Reader,返回一個 io.ReadCloser,相應的 Close 方法啥也不做,只是返回 nil。

舉例:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "io/ioutil" 
  6.     "reflect" 
  7.     "strings" 
  8.  
  9. func main() { 
  10.     //返回 *strings.Reader 
  11.     reader := strings.NewReader("Hello AlwaysBeta"
  12.     r := ioutil.NopCloser(reader) 
  13.     defer r.Close() 
  14.  
  15.     fmt.Println(reflect.TypeOf(reader)) 
  16.     data, _ := ioutil.ReadAll(reader) 
  17.     fmt.Println(string(data)) 

總結

ioutil 提供了幾個很實用的工具函數(shù),背后實現(xiàn)邏輯也并不復雜。

本篇文章從一個問題入手,重點研究了 ioutil.ReadAll 函數(shù)。主要原因是在小數(shù)據(jù)量的情況下,這個函數(shù)并沒有什么問題,但當數(shù)據(jù)量大時,它就變成了一顆定時炸彈。有可能會影響程序的性能,甚至會導致程序崩潰。

接下來給出對應的解決方案,在數(shù)據(jù)量大的情況下,最好使用 io.Copy 函數(shù)。

文章最后繼續(xù)介紹了 ioutil 的其他幾個函數(shù),并給出了程序示例。相關代碼都會上傳到 GitHub,需要的同學可以自行下載。

好了,本文就到這里吧。關注我,帶你通過問題讀 Go 源碼。

源碼地址:

https://github.com/yongxinz/gopher

 

責任編輯:武曉燕 來源: AlwaysBeta
相關推薦

2022-12-26 00:25:06

2021-04-26 09:33:46

Go Iota語言

2022-06-02 08:48:39

Go枚舉器Iota

2025-01-15 09:06:58

CSSRegEx前端

2023-11-27 19:39:46

Goprotobuf

2022-01-17 16:09:43

Go語言開發(fā)

2024-07-08 00:01:00

GPM模型調(diào)度器

2021-10-13 14:06:46

MySQLUtf8符號

2023-10-28 16:22:21

Go接口

2021-11-29 22:59:34

Go Dockertest集成

2023-01-11 08:06:42

對象賦值項目開發(fā)

2022-06-30 08:03:13

Prisma數(shù)據(jù)庫工具開源

2020-05-25 15:37:47

物聯(lián)網(wǎng)設備密碼物聯(lián)網(wǎng)安全

2013-07-29 14:50:43

API

2020-02-24 09:38:05

PythonGo語言Linux

2020-06-22 07:18:21

Java語言開發(fā)

2024-01-02 10:38:22

Go語言數(shù)組

2016-03-24 09:53:24

swiftguardios

2023-11-30 09:00:00

TypeScript開發(fā)

2019-01-27 14:37:47

數(shù)據(jù)HTTP服務
點贊
收藏

51CTO技術棧公眾號

久久精品一区二区| 欧美久久久久| 欧美久久一二区| 国产一二三四区在线观看| 亚洲国产www| 日韩精品亚洲一区| 九九热这里只有在线精品视 | 国产精选久久| 一本一本久久a久久精品综合麻豆| 亚洲午夜久久久影院伊人| 成人小说亚洲一区二区三区 | 午夜伦欧美伦电影理论片| 日韩欧美亚洲日产国| 国产高清视频免费观看| 久久婷婷一区| 久久久久久久91| 刘亦菲国产毛片bd| 欧美亚洲色图校园春色| 欧美精品久久久久久久久老牛影院| 毛片av在线播放| 91官网在线| 99精品国产一区二区三区不卡| 国产欧美日韩综合精品| 在线精品免费视| 亚洲视频综合| 久久精品久久久久久国产 免费| 亚洲黄色在线网站| 136福利精品导航| 91精品国产综合久久小美女| 五月天婷婷激情视频| 91超碰在线| 一区二区三区四区乱视频| 四虎一区二区| 日韩有码电影| 99精品在线免费| 成人激情av| 国产内射老熟女aaaa∵| 美女免费视频一区二区| 日本亚洲欧洲色| 国产成人精品一区二三区| 欧美午夜视频| 欧美风情在线观看| 国产精品丝袜一区二区| 99国产精品免费视频观看| 伊人久久久久久久久久久| 成人乱码一区二区三区av| 国产精品中文字幕制服诱惑| 精品免费国产一区二区三区四区| 亚洲高清在线不卡| 亚洲高清国产拍精品26u| 欧美性做爰猛烈叫床潮| 成年人在线看片| 韩国成人漫画| 日本道免费精品一区二区三区| 少妇无码av无码专区在线观看| 久久亚洲导航| 亚洲成人av中文| 黄页网站大全在线观看| sm性调教片在线观看| 五月婷婷久久丁香| 欧美日韩在线一| 色在线视频观看| 色综合中文字幕国产| 国产激情在线观看视频| 国产精品亚洲一区二区三区在线观看| 色综合一区二区| 尤蜜粉嫩av国产一区二区三区| 日韩漫画puputoon| 欧美三级资源在线| 一二三级黄色片| 玖玖精品一区| 亚洲福利小视频| 国产精品一区二区入口九绯色| 九九在线高清精品视频| 一色桃子一区二区| 内射一区二区三区| 亚洲特色特黄| 日韩免费观看av| 亚洲视频一区二区三区四区| 国产精品一卡二卡在线观看| 国产精品三区www17con| 国产中文在线视频| 亚洲欧洲www| 青青青国产在线观看| 欧美xxxxxx| 欧美精品少妇一区二区三区| 亚洲欧美日韩色| 国产一区二区三区探花| 久久夜色精品国产欧美乱| 国产精彩视频在线| 三级成人在线视频| 91情侣在线视频| 日本国产在线| 亚洲三级在线免费观看| 91专区在线观看| 日日夜夜亚洲精品| 日韩av在线网页| 国产三级aaa| 国产精品久久久久久久免费软件 | 国产一区二区视频在线看| 亚洲国产成人精品久久久国产成人一区| 中文字幕丰满乱子伦无码专区| 99视频精品视频高清免费| 久久久久女教师免费一区| 波多野结衣二区三区| 国产91精品欧美| 日韩中文一区二区三区| 久久不射影院| 欧美日韩国产天堂| 在线免费观看污视频| 99热国内精品| 国产成人精品久久二区二区91| www.激情五月.com| 国产精品欧美一区喷水| 俄罗斯av网站| 天堂va在线高清一区| 在线精品视频视频中文字幕| 欧美福利视频一区二区| 国产精品2024| 一区二区视频在线播放| 欧美性猛交xxx高清大费中文| 精品免费日韩av| 亚洲综合网在线| 日日夜夜一区二区| 欧美精品免费观看二区| aa视频在线观看| 欧美xxxx在线观看| 成人免费视频网站入口::| 麻豆国产精品视频| 色狠狠久久av五月综合| 在线天堂资源| 日韩高清免费观看| 日韩免费一二三区| 国产成人av福利| 日本一道在线观看| 激情综合婷婷| 久久精品国产清自在天天线| 一级黄色大片免费| 国产精品情趣视频| 亚洲欧美自拍另类日韩| 欧美久久精品一级c片| 国产不卡av在线免费观看| 天堂av在线播放| 精品久久久久久久久久国产| www.555国产精品免费| 欧美激情 亚洲a∨综合| 91精品国自产在线观看 | 欧美一区二区三区艳史| 五月婷婷狠狠干| 亚洲午夜激情av| 亚洲精品国产成人av在线| 国产一区视频在线观看免费| 痴汉一区二区三区| 超碰在线中文字幕| 亚洲国产99精品国自产| 成人免费视频毛片| 久久综合成人精品亚洲另类欧美| 日本成年人网址| 国产一区二区三区日韩精品| 国产精品三级美女白浆呻吟| 在线视频91p| 5858s免费视频成人| 五月天av网站| 懂色av一区二区三区免费观看| 成人网站免费观看入口| 美女网站色精品尤物极品姐弟| 97视频在线看| yourporn在线观看视频| 欧美精品一级二级三级| 久久久国产成人| 99久久精品一区| 超碰在线97免费| 欧美不卡视频| 欧美13一14另类| 日本成人在线网站| 欧美精品精品精品精品免费| 五月婷婷综合久久| 欧美性欧美巨大黑白大战| 91 在线视频| 成人av资源在线观看| 日本精品一区二区三区四区| 久久成人综合| 国产日韩精品久久| 亚洲成av在线| 欧美精品情趣视频| 免费成人av电影| 欧美一级在线观看| 精品人妻一区二区三区潮喷在线 | 国产又大又黑又粗| 亚洲成人一区二区在线观看| 69视频在线观看免费| 国产丶欧美丶日本不卡视频| 噜噜噜久久亚洲精品国产品麻豆| 日韩中文首页| 国产一区二区三区黄| 福利一区二区| 91精品国产91久久久久久不卡| 99免在线观看免费视频高清| 精品国产乱码久久久久久图片 | 超碰中文字幕在线| 综合色中文字幕| 亚洲图片另类小说| 风间由美性色一区二区三区| jizzzz日本| 亚洲一级在线| 成人短视频在线观看免费| 国产成人黄色| 国产青春久久久国产毛片| 亚洲视频自拍| 国产精品成久久久久三级| 欧美卡一卡二| 日韩中文字幕在线播放| 国产中文字幕在线播放| 亚洲电影免费观看高清完整版在线| 中文字幕一区2区3区| 色综合久久综合网97色综合| 印度午夜性春猛xxx交| 欧美激情一二三区| 国产精品无码一区二区三区免费| 国产精品性做久久久久久| www欧美激情| 天堂精品中文字幕在线| 老太脱裤让老头玩ⅹxxxx| 一区二区三区在线| 正在播放91九色| 成人激情免费视频| 欧美一区二区视频17c| 牛牛影视一区二区三区免费看| 99re在线播放| 久久丁香四色| 91中文在线观看| 四虎永久精品在线| 国产精品男女猛烈高潮激情| 日韩电影av| 日本高清视频一区| 欧美成人a交片免费看| 4438全国成人免费| av在线最新| 亚州精品天堂中文字幕| av电影在线免费| 国外成人在线播放| 九色porny丨入口在线| 97香蕉久久超级碰碰高清版| 麻豆免费在线| 97成人精品区在线播放| aaa在线播放视频| 97精品一区二区视频在线观看| 毛片在线导航| 5252色成人免费视频| av高清不卡| 国产精品高潮视频| 国产亚洲精品精品国产亚洲综合| 国产精品爽爽爽爽爽爽在线观看| 久久女人天堂| 成人免费福利在线| 亚洲成av人片在线观看www| 1区1区3区4区产品乱码芒果精品| 欧美影院精品| 精品久久久久久亚洲| 亚洲精品一级二级三级| 日韩高清三级| 99热在线成人| 男人添女人荫蒂免费视频| 亚洲精品精选| 免费男同深夜夜行网站| 久久精品国产网站| 久久久九九九热| www.亚洲色图| 97人妻人人揉人人躁人人| 国产精品对白交换视频| 欧美黑人一级片| 高潮白浆女日韩av免费看| 欧美性猛交xxxx乱大交hd| 欧美三级视频在线播放| 国产乱淫a∨片免费观看| 精品国产乱码久久| 美女毛片在线看| 日韩在线观看免费全集电视剧网站| www国产在线观看| 国语自产在线不卡| 高清电影一区| 2014国产精品| 欧美精品系列| 欧美在线观看视频免费| 校园春色综合网| 色18美女社区| 26uuu亚洲综合色欧美| 国产亚洲精品久久久久久豆腐| 亚洲一区二区在线播放相泽| 尤物视频免费观看| 日韩视频免费观看高清在线视频| 日韩a在线看| 欧美成人中文字幕| 亚洲美女久久精品| 亚洲最大成人在线| 竹菊久久久久久久| 97中文字幕在线| 日本中文一区二区三区| 国产亚洲精品成人a| 国产精品毛片a∨一区二区三区| 国产一级二级三级| 欧美亚洲高清一区二区三区不卡| 黑人操亚洲女人| 日韩中文字幕亚洲| 日韩成人影音| 国产精品美女诱惑| 香蕉精品视频在线观看| 黑鬼大战白妞高潮喷白浆| 国产成人av在线影院| 国产人与禽zoz0性伦| 日韩欧美高清视频| www日本在线| 日韩一级黄色av| 日韩成人高清| 久久99精品久久久水蜜桃| 欧美精品一卡| 亚洲18在线看污www麻豆| 国产亚洲精品aa午夜观看| 精品少妇theporn| 在线综合亚洲欧美在线视频| 成人亚洲性情网站www在线观看| 国内精品久久久久久影视8| 久久av网站| a级网站在线观看| 久久99久久99精品免视看婷婷| 国产三级av在线播放 | 亚洲视频在线观看免费视频| 国产视频精品久久久| 91破解版在线观看| 成人久久18免费网站漫画| 香蕉国产精品| 中文字幕一区二区在线观看视频| 亚洲国产成人在线| 日韩不卡高清视频| 影音先锋日韩有码| 欧美无毛视频| 日韩欧美在线电影| 欧美专区18| av直播在线观看| 色综合色狠狠天天综合色| 欧美成熟毛茸茸| 国产精品91久久| 欧美限制电影| 污网站免费在线| ㊣最新国产の精品bt伙计久久| 怡红院成永久免费人全部视频| 色999日韩欧美国产| 成人精品国产| 国产精品美女在线播放| 国产自产v一区二区三区c| 国产人妻精品一区二区三区不卡| 91精品国产欧美一区二区成人| h视频在线免费观看| 97神马电影| 国产情侣久久| 中文字幕免费高清| 欧美日韩中文精品| 国产在线看片| 国产91aaa| 米奇777在线欧美播放| 国产免费无遮挡吸奶头视频| 欧美日韩综合在线| 黄色精品免费看| 国产精品9999久久久久仙踪林| 亚洲中午字幕| а天堂中文在线资源| 日韩一二三四区| 午夜欧美激情| 伊人av成人| 成人免费视频视频在线观看免费| av大全在线观看| 中文国产亚洲喷潮| 视频亚洲一区二区| 日av中文字幕| 最新欧美精品一区二区三区| 亚洲精品成av人片天堂无码| 欧美在线观看一区二区三区| 不卡一区2区| 在线xxxxx| 在线观看国产一区二区| 最新国产在线拍揄自揄视频| 久久av免费观看| 久久99精品国产麻豆婷婷| 国产无码精品久久久| 中文字幕久热精品在线视频| 精品一区二区三区中文字幕 | 久久激情五月激情| 欧美日韩中文视频| 丝袜美腿精品国产二区| 91麻豆精品国产91久久久久推荐资源| 亚洲色欲综合一区二区三区| 亚洲精品福利视频网站| 日本天堂影院在线视频| 亚洲精品日韩激情在线电影| 久久精品一区| 久久精品视频国产| 日韩网站在线观看| 日韩深夜福利| 亚洲美女高潮久久久| 欧美日韩中文另类|