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

將5萬行Java代碼移植到Go學到的經驗

開發 前端
我曾經簽訂了一個把大型的 Java 代碼庫遷移至 Go 的工作合同。這份代碼是 RavenDB 這一 NoSQL JSON 文檔數據庫的 Java 客戶端。包含測試代碼,一共有約 5 萬行。移植的結果是一個 Go 的客戶端。

我曾經簽訂了一個把大型的 Java 代碼庫遷移至 Go 的工作合同。

這份代碼是 RavenDB 這一 NoSQL JSON 文檔數據庫的 Java 客戶端。包含測試代碼,一共有約 5 萬行。

移植的結果是一個 Go 的客戶端。

本文描述了我在這個遷移過程中學到的知識。

[[262987]]

測試,代碼覆蓋率

自動化測試和代碼覆蓋率追蹤,可以讓大型項目獲益匪淺。

我使用 TravisCI 和 AppVeyor 進行測試。Codecov.io 用來檢測代碼覆蓋率。還有許多其他的類似服務。

我同時使用 AppVeyor 和 TravisCI,是因為 Travis 在一年前不再支持 Windows,而 AppVeyor 不支持 Linux。

如果現在讓我重新選擇這些工具,我將只使用 AppVeyor,因為它現在支持 Linux 和 Windows 平臺的測試,而 TravisCI 在被私募股權公司收購并炒掉原始開發團隊后,前景并不明朗。

Codecov 幾乎無法勝任代碼覆蓋率檢測。對于 Go,它將非代碼的行(比如注釋)當做是未執行的代碼。使用這個工具不可能得到 100% 的代碼覆蓋率。Coveralls 看起來也有同樣的問題。

聊勝于無,但這些工具可以讓情況變得更好,尤其是對 Go 程序而言。

Go 的競態檢測非常棒

一部分代碼使用了并發,而并發很容易出錯。

Go 提供了競態檢測器,在編譯時使用 -race 字段可以開啟它。

它會讓程序變慢,但額外的檢查可以探測是否在同時修改同一個內存位置。

我一直開啟 -race 運行測試,通過它的報警,我可以很快地修復那些競爭問題。

構建用于測試的特定工具

大型項目很難通過肉眼檢查驗證正確性。代碼太多,你的大腦很難一次記住。

當測試失敗時,僅從測試失敗的信息中找到原因也是一個挑戰。

數據庫客戶端驅動與 RavenDB 數據庫服務端使用 HTTP 協議連接,傳輸的命令和響應的結果使用 JSON 編碼。

當把 Java 測試代碼移植到 Go 時,如果可以獲取 Java 客戶端與服務端的 HTTP 流量,并與移植到 Go 的代碼生成的 HTTP 流量對比,這個信息將非常有用。

我構建了一些特定的工具,幫我完成這些工作。

為了獲取 Java 客戶端的 HTTP 流量,我使用 Go 構建了一個 logging HTTP 代理,Java 客戶端使用這個代理與服務端交互。

對于 Go 客戶端,我構建了一個可以攔截 HTTP 請求的鉤子。我使用它把流量記錄在文件中。

然后我就可以對比 Java 客戶端與 Go 移植的客戶端生成的 HTTP 流量的區別了。

移植的過程

你不能隨機開始遷移 5 萬行代碼。我確信,如果每一個小步驟之后不進行測試和驗證的話,我都會被整體代碼的復雜性給打敗。

對于 RavenDB 和 Java 代碼庫,我是新手。所以我的***步是深入理解這份 Java 代碼的工作原理。

客戶端的核心是與服務端通過 HTTP 協議交互。我捕獲并研究了流量,編寫最簡單的與服務器交互的 Go 代碼。

當這么做有效果之后,我自信可以復制這些功能。

我的***個里程碑是移植足夠的代碼,可以通過移植最簡單的 Java 測試代碼的測試。

我使用了自底向上和自上到下結合的方法。

自底向上的部分是指,我定位并移植那些用于向服務器發送命令和解析響應的調用鏈底層的代碼。

自上到下的部分是指,我逐步跟蹤要移植的測試代碼,來確定需要移植實現的功能代碼部分。

在成功完成***步移植后,剩下的工作就是一次移植一個測試,同時移植可通過這個測試的所有需要的代碼。

當測試移植并測試通過后,我做了一些讓代碼更加 Go 風格的改進。

我相信這種一步一步漸進的方法,對于完成移植工作是很重要的。

從心理學角度來看,在面對一個長年累月的項目時,設置簡短的中間態里程碑是很重要的。不斷的完成這些里程碑讓我干勁十足。

一直讓代碼保持可編譯、可運行和可通過測試的狀態也很好。當最終要面對那些日積月累的缺陷時,你將很難下手解決。

移植 Java 到 Go 的挑戰

移植的目標是要盡可能與 Java 代碼庫一致,因為移植的代碼需要與 Java 未來的變化保持同步。

有時我吃驚于自己以一行一行的方式移植的代碼量。而移植過程中,最耗費時間的部分是顛倒變量的聲明順序,Java 的聲明順序是 type name ,而 Go 的聲明順序是 name type 。我真心希望有工具可以幫我完成這部分工作。

String vs. string

在 Java 中, String 是一個本質上是引用(指針)的對象。因此,字符串可以為 null 。

在 Go 中 string 是一個值類型。它不可能是 nil ,僅僅為空。

這并不是什么大問題,大多情況下我可以無腦地將 null 替換為 "" 。

Errors vs. exceptions

Java 使用異常來傳遞錯誤。

Go 返回 error 接口的值。

移植不難,但需要修改大量的函數簽名,來支持返回錯誤值并在調用棧上傳播。

泛型

Go (目前)并不支持泛型。

移植泛型的接口是***的挑戰。

下面是 Java 中一個泛型方法的例子:

  1. public <T> T load(Class<T> clazz, String id) { 

調用者:

  1. Foo foo = load(Foo.class, "id"

在 Go 中,我使用兩種策略。

其中之一是使用 interface{} ,它由值和類型組成,與 Java 中的 object 類似。不推薦使用這種方法。雖然有效,但對于這個庫的用戶而言,操作 interface{} 并不恰當。

在一些情況下我可以使用反射,上面的代碼可以移植為:

  1. func Load(result interface{}, id string) error 

我可以使用反射來獲取 result 的類型,再從 JSON 文檔中創建這個類型的值。

調用方的代碼:

  1. var result *Foo 
  2. err := Load(&result, "id"

函數重載

Go 不支持(很大可能永遠不會支持)函數重載。

我不確定我是否找到了正確的方式來移植這種代碼。

在一些情況下,重載用于創建更簡短的幫助函數:

  1. void foo(int a, String b) {} 
  2. void foo(int a) { foo(a, null); } 

有時我會直接丟掉更簡短的幫助函數。

有時我會寫兩個函數:

  1. func foo(a int) {} 
  2. func fooWithB(a int, b string) {} 

當潛在的參數數量很大時,有時我會這么做:

  1. type FooArgs struct { 
  2.     A int 
  3.     B string 
  4. func foo(args *FooArgs) { } 

繼承

Go 并不是面向對象語言,沒有繼承。

簡單情況下的繼承可以使用嵌套的方法移植。

  1. class B : A { } 

有時可以移植為:

  1. type A struct { } 
  2. type B struct { 
  3.     A 

我們把 A 嵌入到 B 中,因此 B 繼承了 A 所有的方法和字段。

這種方法對于虛函數無效。

并沒有好方法移植那些使用虛函數的代碼。

模擬虛函數的一個方式是將結構體和函數指針嵌套。這本質上來說,是重新實現了 Java 免費提供的,作為 object 實現一部分的虛表。

另一種方式是寫一個獨立的函數,通過類型判斷來調度給定類型的正確函數。

接口

Java 和 Go 都有接口,但它們是不一樣的內容,就像蘋果和意大利香腸的區別一樣。

在很少的情況下,我確實會創建 Go 的接口類型來復制 Java 接口。

大多數情況下,我放棄使用接口,而是在 API 中暴露具體的結構體。

依賴包的循環引入

Java 允許包的循環引入。

Go 不允許。

結果就是,我無法在移植中復制 Java 代碼的包結構。

為了簡化,我使用一個包。這種方法不太理想,因為這個包***會變得很臃腫。實際上,這個包臃腫到在 Windows 下 Go 1.10 無法處理單個包內的那么多源文件。幸運的是,Go 1.11 修復了這個問題。

私有(private)、公開(public)、保護(protected)

Go 的設計師們被低估了。他們簡化概念的能力是***的,權限控制就是其中的一個例子。

其他語言傾向于細粒度的權限控制:(每個類的字段和方法)指定最小可能粒度的公開、私有和保護。

結果就是當外部代碼使用這個庫時,這個庫實現的一些功能和這個庫中其他的類有一樣的訪問權限。

Go 簡化了這個概念,只擁有公開和私有,訪問的范圍限制在包的級別。

這更合理一些。

當我想要寫一個庫,比如說,解析 markdown,我不想把內部實現暴漏給這個庫的使用者。但對于我自己隱藏這些內部實現,效果恰恰相反。

Java 開發者注意到這個問題,有時會使用接口作為修復過度暴漏的類的技巧。通過返回一個接口,而不是具體的類,這個類的使用者就無法看到一些可用的公開接口。

并發

簡單來說,Go 的并發是***的,內建的競態檢測器非常有助于解決并發的問題。

我剛才說過,我進行的***個移植是模擬 Java 接口。比如,我實現了 Java CompletableFuture 類的復制。

只有在代碼可以運行后,我才會重新組織代碼,讓代碼更加符合 Go 的風格。

流暢的函數鏈式調用

RavenDB 擁有復雜的查詢能力。Java 客戶端使用鏈式方法構建查詢:

  1. List<ReduceResult> results = session.query(User.class) 
  2.                         .groupBy("name"
  3.                         .selectKey() 
  4.                         .selectCount() 
  5.                         .orderByDescending("count"
  6.                         .ofType(ReduceResult.class) 
  7.                         .toList(); 

鏈式調用僅在通過異常進行錯誤交互的語言中有效。當一個函數額外返回一個錯誤,就沒法向上面那樣進行鏈式調用。

為了在 Go 中復制鏈式調用,我使用了一個“狀態錯誤(stateful error)”的方法:

  1. type Query struct { 
  2.     err error 
  3.  
  4. func (q *Query) WhereEquals(field string, val interface{}) *Query { 
  5.     if q.err != nil { 
  6.         return q 
  7.     } 
  8.     // logic that might set q.err 
  9.     return q 
  10.  
  11. func (q *Query) GroupBy(field string) *Query { 
  12.     if q.err != nil { 
  13.         return q 
  14.     } 
  15.     // logic that might set q.err 
  16.     return q 
  17.  
  18. func (q *Query) Execute(result inteface{}) error { 
  19.     if q.err != nil { 
  20.         return q.err 
  21.     } 
  22.     // do logic 

鏈式調用可以這么寫:

  1. var result *Foo 
  2. err := NewQuery().WhereEquals("Name""Frank").GroupBy("Age").Execute(&result) 

JSON 解析

Java 沒有內建的 JSON 解析函數,客戶端使用 Jackson JSON 庫。

Go 在標準庫中有 JSON 的支持,但它沒有提供足夠多的鉤子函數來展現 JSON 解析的過程。

我并沒有嘗試匹配所有的 Java 功能,因為 Go 內置的 JSON 支持看起來已經足夠靈活。

Go 代碼更短

簡短不是 Java 的屬性,而是寫出符合語言習慣代碼的文化的屬性。

在 Java 中,setter 和 getter 方法很常見。比如,Java 代碼:

  1. class Foo { 
  2.     private int bar; 
  3.  
  4.     public void setBar(int bar) { 
  5.         this.bar = bar; 
  6.     } 
  7.  
  8.     public int getBar() { 
  9.         return this.bar; 
  10.     } 

Go 語言版本如下:

  1. type Foo struct { 
  2.     Bar int 

3 行 vs 11 行。當你有大量的類,類內有很多成員時,這么做可以不斷累加這些類。

大部分其他的代碼***長度基本差不多。

使用 Notion 來組織工作

我是 Notion.so 的重度用戶。用最簡單的話來說,Notion 是一個多級筆記記錄應用。可以把它看做是 Evernote 和 wiki 的結合,是由***軟件設計師精心設計和實現的。

下面是我使用 Notion 組織 Go 移植工作的方式:

將5萬行Java代碼移植到Go學到的經驗

下面是具體的內容:

我有一個沒有在上面展示的帶日歷視圖的頁面,用來記錄在特定時間的工作內容和花費時間的簡短筆記。因為這次合約是按小時收費,所以工作時長的統計是很重要的信息。感謝這些筆記,我知道我在 11 個月里在這次開發上花費了 601 個小時。

客戶喜歡了解進展。我有一個頁面,記錄了每月的工作總結,如下所示:

將5萬行Java代碼移植到Go學到的經驗

這些頁面與客戶共享。

  • 當開始每天的工作時,短期的 todo list 很有用。

[[262988]]

  • 我甚至用 Notion 頁面管理發票,使用“導出為 PDF”功能來生成發票的 PDF 版本。

待招聘的 Go 程序員

你的公司還需要 Go 開發者嗎?你可以雇用我

額外的資源

針對問題,我提供了一些額外的說明:

  1. Hacker News discussion  
  2. /r/golang discussion 

其他資料:

  1. 如果你需要一個 NoSQL,JSON 文檔數據庫,可以試一下 RavenDB。它擁有完備的高級特性。
  2. 如果你使用 Go 編程,可以免費閱讀 Essential Go 這本編程書籍。
  3. 如果你對 Notion 感興趣,我是 Notion ***的高級用戶:
  • 我逆向了 Notion API
  • 我寫了一個 Notion API 的非官方的 Go 庫
  • 本網站的所有內容都是使用 Notion 編寫,并使用我定制化的工具鏈發布。
責任編輯:未麗燕 來源: Go中國
相關推薦

2011-05-03 09:10:12

項目管理程序員

2021-03-02 13:56:24

Linux 5.12代碼驅動

2019-01-03 09:29:15

Linux 系統 數據

2020-08-17 17:10:54

機器學習聚類開發

2009-07-21 08:44:14

微軟Linux內核開源操作系統

2021-05-24 11:05:53

代碼開發Go

2021-05-20 10:00:56

Go代碼Python

2015-09-01 16:26:18

Linux內核

2012-07-23 09:58:50

代碼程序員

2009-07-21 08:51:33

微軟發布Linux設備微軟開源虛擬化

2024-03-13 15:48:43

2009-08-20 16:34:50

Linux源代碼紅帽Linux內核

2018-10-15 09:20:08

代碼軟件工程師

2023-06-28 14:18:06

2020-02-24 16:27:19

開源大數據計算引擎

2017-03-23 14:07:55

代碼程序員

2022-06-25 21:22:30

編程Rust代碼

2019-09-10 09:06:01

MySQL經驗數值黃金鐵律

2019-06-23 15:04:42

MySQL單表數據數值

2018-04-03 09:09:05

點贊
收藏

51CTO技術棧公眾號

波多野结衣精品| 69视频免费在线观看| 香蕉久久久久久| 9人人澡人人爽人人精品| 91精品国产99| 日本性高潮视频| 成人国产一区| 亚洲精品网站在线观看| 懂色一区二区三区av片| 91av在线免费视频| 国产精品亚洲片在线播放| 欧美影院午夜播放| 欧美日韩在线播放一区二区| 一二区在线观看| 欧美精品综合| 亚洲免费成人av电影| 欧美 激情 在线| 国产在线观看网站| 国产精品91一区二区| 国产69精品久久久久9999| 精品无码人妻一区二区免费蜜桃 | 欧美午夜精品在线| 亚洲人成77777| 人妻一区二区三区四区| 日韩有码一区二区三区| 色哟哟入口国产精品| 久久精品一卡二卡| 视频在线日韩| 亚洲综合清纯丝袜自拍| 日产国产精品精品a∨| 国产成人精品无码高潮| 国产精品视区| 久久成人精品视频| 精品无码在线观看| 国产美女撒尿一区二区| 在线观看三级视频欧美| 亚洲精品无码国产| 老司机精品影院| 26uuu色噜噜精品一区二区| 成人有码在线视频| 免费视频网站在线观看入口| 在线看片一区| 欧美成人午夜视频| 日韩一级av毛片| 日韩精品亚洲专区在线观看| 婷婷丁香久久五月婷婷| 青青草原网站在线观看| 欧美高清成人| jvid福利写真一区二区三区| 国产日本欧美一区二区三区在线| 精品美女久久久久| 天天综合一区| 中文欧美日本在线资源| 黄色正能量网站| 99精品国产一区二区三区2021 | 亚洲精品在线三区| 四季av一区二区三区| 欧美精品日日操| 亚洲欧美成人一区二区三区| 亚洲国产精品久久久久婷婷老年| 午夜视频在线免费播放| 成人h动漫精品一区二区| 国产日韩欧美影视| 伊人亚洲综合网| 日本最新不卡在线| 欧美专区第一页| 久久这里只有精品国产| 欧美在线网站| 萌白酱国产一区二区| 男人av资源站| 91精品婷婷色在线观看| 日韩一级黄色av| 久久av红桃一区二区禁漫| 欧美理论在线播放| 中文字幕视频在线免费欧美日韩综合在线看| www.男人天堂| 亚洲尤物av| 国产亚洲欧美日韩一区二区| 瑟瑟视频在线观看| 91蜜桃臀久久一区二区| 538prom精品视频线放| 一级黄色片在线免费观看| 成人噜噜噜噜| 日韩精品一区二区三区中文不卡 | 成人在线免费看片| 亚洲男女一区二区三区| 国产一级大片免费看| 国精一区二区三区| 黄色成人在线播放| 三上悠亚久久精品| 午夜裸体女人视频网站在线观看| 精品久久久久久亚洲国产300| 国产高清免费在线| 免费毛片在线看片免费丝瓜视频 | 久久uomeier| 欧美亚洲动漫制服丝袜| 亚洲一区二区三区观看| 日韩在线视频一区二区三区| 精品美女一区二区| 95视频在线观看| 天天久久夜夜| 色av中文字幕一区| 成人性视频免费看| 欧美久久一级| 日韩av三级在线观看| 国产精品福利电影| 成人动漫视频在线| 亚洲国产欧洲综合997久久| 色呦呦视频在线观看| 精品欧美aⅴ在线网站| 无限资源日本好片| 深夜福利一区二区三区| 亚洲免费伊人电影在线观看av| 三上悠亚ssⅰn939无码播放| 日韩情爱电影在线观看| 久久久在线视频| 少妇又紧又色又爽又刺激视频| 国产精品综合一区二区| 麻豆精品传媒视频| 91视频在线观看| 亚洲一区二区av电影| 污视频免费在线观看网站| 日本成人手机在线| 亚洲欧美中文日韩在线v日本| 亚洲精品久久久久久国| 日韩图片一区| 国产精品久久久精品| 丰满熟女一区二区三区| 国产女同互慰高潮91漫画| 国产乱人伦精品一区二区三区| 精品三区视频| 日韩精品一区二区三区视频| 欧美激情 一区| 国产欧美二区| 4444kk亚洲人成电影在线| 视频在线观看你懂的| 国产亚洲福利社区一区| 999久久欧美人妻一区二区| 久久免费资源| 亚洲欧美日韩直播| 永久久久久久久| 免费观看在线色综合| 欧美日韩最好看的视频| 色爱综合区网| 欧美精品第1页| 欧美xxxxx少妇| 日韩美女一区二区三区在线观看| 国内精品久久久久久久久| 国产农村妇女毛片精品| 国产精品区一区二区三区| 精品中文字幕av| jizz国产精品| 色狠狠久久aa北条麻妃| 中文字幕av第一页| 久久众筹精品私拍模特| 国产h视频在线播放| 99久久人爽人人添人人澡| 欧美成人精品影院| 在线免费观看日韩视频| 国产欧美精品一区二区色综合| 日本久久久精品视频| 亚洲精品456| 51精品国产黑色丝袜高跟鞋| 午夜视频在线免费播放| 黄色成人在线播放| 成年人网站免费看| 国产日韩欧美在线播放不卡| 国产综合欧美在线看| 在线观看男女av免费网址| 色天天综合久久久久综合片| 西西444www无码大胆| 国产精品乱看| 日本一区网站| 看片一区二区| 久久伊人精品天天| 亚洲爱情岛论坛永久| ㊣最新国产の精品bt伙计久久| 潘金莲激情呻吟欲求不满视频| 色97色成人| 国产一区二区在线播放| 免费在线毛片网站| 欧美日韩免费高清一区色橹橹 | 国产精品99| 日日狠狠久久偷偷四色综合免费| 国产精品高清无码| 中文字幕第一区第二区| 小泽玛利亚视频在线观看| 色综合蜜月久久综合网| 亚洲www视频| 91制片在线观看| 日韩成人性视频| 久草视频在线免费| 国产精品色哟哟| 五月天视频在线观看| 成人国产精品一级毛片视频| 91九色国产社区在线观看| 18+激情视频在线| 亚洲国产精品va在线看黑人动漫| a v视频在线观看| 久久久久久久久久看片| 国产精欧美一区二区三区白种人| 欧美日韩1080p| 欧美日韩一区二区三| av一级久久| 欧美在线视频a| 永久免费av在线| 日韩一区二区三区精品视频| 激情五月色婷婷| 国产精品久久久久久久久免费樱桃| 欧美精品 - 色网| 亚洲人人精品| 一区二区精品视频| 美日韩黄色大片| 国产精品18久久久久久首页狼| 婷婷激情在线| 亚洲高清久久网| 97超碰资源站| 欧美日韩午夜视频在线观看| 暗呦丨小u女国产精品| 99re视频这里只有精品| 亚洲欧美一区二区三区不卡| 国产模特精品视频久久久久| 一本色道久久综合亚洲二区三区| 东京久久高清| 成人免费观看网址| 日韩激情电影| 色与欲影视天天看综合网| 国产二区视频在线观看| 亚洲第一精品夜夜躁人人躁 | 色94色欧美sute亚洲13| 久久久久久免费观看| 国产精品丝袜黑色高跟| 在线观看国产网站| 国产一区高清在线| 天堂一区在线观看| 午夜在线观看免费一区| 青青草视频在线视频| 蜜桃tv一区二区三区| 91久久精品国产91久久性色tv| 草莓视频成人appios| 91国产视频在线播放| 2024最新电影在线免费观看| 中文字幕v亚洲ⅴv天堂| 亚洲精品字幕在线| 欧美三区在线观看| 老熟妇仑乱一区二区av| 黄网站色欧美视频| 欧美激情国产精品免费| 国产精品福利在线播放| 性の欲びの女javhd| 国产亚洲一区二区三区| 日韩无码精品一区二区| 国产不卡一区视频| 在线观看日本www| 精品在线播放免费| 一区二区三区入口| 日韩电影在线一区二区三区| 欧美亚洲另类色图| 美女诱惑一区| 久久精品香蕉视频| 亚洲伊人观看| 可以免费观看av毛片| 亚洲在线一区| 粗暴91大变态调教| 视频一区中文字幕国产| 国产免费视频传媒| 日韩二区三区四区| 亚洲天堂2018av| 噜噜噜在线观看免费视频日韩 | 女人又爽又黄免费女仆| 91在线视频观看| 毛茸茸free性熟hd| 国产激情视频一区二区三区欧美 | 狠狠v欧美ⅴ日韩v亚洲v大胸 | 亚洲一区二区三区四区精品| 国产在线不卡一卡二卡三卡四卡| 国产永久免费网站| 国产成人精品三级| 美女流白浆视频| caoporn国产精品| 人妻熟女aⅴ一区二区三区汇编| 国产无人区一区二区三区| 黄色片网站在线播放| 国产亚洲婷婷免费| 欧美性生给视频| 亚洲午夜一区二区| 免费黄色网址在线| 欧美日韩一级大片网址| 99热这里只有精品9| 欧美videofree性高清杂交| 婷婷国产在线| 日韩视频免费中文字幕| 深夜国产在线播放| 日本精品免费观看| 视频欧美精品| 国产精品初高中精品久久| 亚洲国产合集| 中文字幕在线亚洲精品| 国产精品第2页| 伊人影院中文字幕| 欧美一区二区三区视频| 东京干手机福利视频| 日韩国产精品亚洲а∨天堂免| 国产理论电影在线观看| 在线播放日韩精品| 在线中文字幕视频观看| 91av在线影院| 自拍偷拍亚洲| 亚欧日韩另类中文欧美| 国产在线视频欧美一区二区三区| 色婷婷色综合| 亚洲精品乱码久久久久久自慰| 国产精品一区二区久久不卡| 精品国产成人亚洲午夜福利| 亚洲一区二区三区四区五区黄| 亚洲无码久久久久久久| 精品一区二区三区电影| 日韩电影免费观看| 国产在线拍偷自揄拍精品| 国产精品嫩模av在线| 免费看国产曰批40分钟| 国产凹凸在线观看一区二区| 2017亚洲天堂| 欧洲一区二区三区在线| 男女视频在线观看免费| 久久人91精品久久久久久不卡| 警花av一区二区三区| 视频一区二区三| 日韩精品色哟哟| 精品国产av无码| 色综合天天综合网天天狠天天| 日本韩国在线观看| 久久97精品久久久久久久不卡| 久久天天久久| 亚洲美女搞黄| 强制捆绑调教一区二区| 91视频免费在观看| 日本福利一区二区| 久久国产精品高清一区二区三区| 6080yy精品一区二区三区| 天堂久久av| 狠狠噜天天噜日日噜| 国产精品18久久久久| 欧美人妻精品一区二区三区 | 国产中文字幕乱人伦在线观看| 国产激情一区二区三区| 在线免费日韩av| 欧美mv日韩mv国产网站app| 日韩另类在线| 国模精品一区二区三区| 在线视频精品| 中文字幕人妻一区二区| 一本在线高清不卡dvd| 男人的天堂在线免费视频| 国产精品久久久久久久天堂| 成人激情开心网| 国产无遮挡猛进猛出免费软件| 中文字幕在线免费不卡| 国产精品免费无遮挡| 欧美成人亚洲成人| 你懂的在线观看一区二区| 色综合av综合无码综合网站| 国产精品婷婷午夜在线观看| 国产一区二区在线播放视频| 欧美国产日韩一区| 加勒比久久高清| 粉嫩虎白女毛片人体| 国产精品久久久久久久浪潮网站| 国产chinasex对白videos麻豆| 欧美国产在线电影| 亚洲+变态+欧美+另类+精品| 亚洲色图38p| 最新日韩av在线| 人妻一区二区三区| 国产精品成人免费电影| 91精品啪在线观看国产18| 欧美双性人妖o0| 欧美日韩一区高清| 精品精品导航| 日本婷婷久久久久久久久一区二区| 久久精品国产一区二区三区免费看| 久久精品黄色片| 亚洲精品一区av在线播放| 成人久久网站| 免费在线观看视频a| 欧美激情一区在线| 欧美77777| 国产精品一香蕉国产线看观看 | 欧美日韩激情在线一区二区三区| 亚洲成人福利在线| 亚洲成人免费看| 亚洲麻豆精品| 久久日韩精品| 国产一本一道久久香蕉| 欧美日韩一二三四区| 久久精品视频一| 免费观看久久av| 亚洲少妇一区二区三区| 欧美日韩一区三区| 男女羞羞在线观看|