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

美女精品视频| a在线观看免费| 国产中文精品久高清在线不| 欧美综合在线视频| 乱子伦一区二区| 三级视频在线看| 免费国产亚洲视频| 久久噜噜噜精品国产亚洲综合| 日韩乱码人妻无码中文字幕久久| 日韩成人综合网站| 精品久久久久久亚洲国产300| 色中色综合成人| 涩涩视频免费看| 精品在线播放免费| 国产福利精品视频| 国产精彩视频在线| 婷婷另类小说| 国产性猛交xxxx免费看久久| 91精品人妻一区二区三区四区| 欧洲一级精品| 亚洲第一福利视频在线| 中文字幕一区二区三区乱码| 欧洲毛片在线| 不卡视频在线观看| 99在线观看视频网站| 中文字幕资源网| 另类av一区二区| 久久久免费av| 欧美人妻一区二区| 91精品国产调教在线观看| 四虎成人av| 国产精品久久久久久亚洲毛片 | 久久久国产免费| 精品91在线| 欧美成人国产va精品日本一级| 色欲AV无码精品一区二区久久 | 亚洲精品中字| 国产美女性感在线观看懂色av| 暴力调教一区二区三区| 97超碰资源| 国产强被迫伦姧在线观看无码| 日本欧美一区二区三区| 日韩免费不卡av| 日韩一级在线视频| 久久国产一二区| 国内成人精品一区| 国产精品99re| 粉嫩av国产一区二区三区| 欧美网站大全在线观看| 日本www高清视频| 精品91久久| 日本高清无吗v一区| 情侣黄网站免费看| 浪潮色综合久久天堂| 色域天天综合网| 日本va中文字幕| 成人精品电影在线| 欧美午夜精品一区二区蜜桃| 91极品视频在线观看| 国产成人免费精品| 欧美区视频在线观看| 国产欧美精品一二三| 日韩精品中文字幕吗一区二区| 欧美一区二区三区视频| 男人的天堂免费| 日本高清精品| 亚洲成色www8888| 亚洲乱码国产乱码精品精大量| 日韩精品福利一区二区三区| 亚洲欧美国产精品久久久久久久| 久久美女免费视频| 99久久婷婷| 欧美高清在线观看| 亚洲伊人成人网| 日韩中文字幕91| 成人精品久久av网站| 亚洲xxx在线| 91蝌蚪porny九色| 亚洲第一导航| 日韩少妇视频| 色哟哟精品一区| www.夜夜爽| 91麻豆精品激情在线观看最新| 亚洲国产精品热久久| 亚洲一区视频在线播放| 中文字幕av亚洲精品一部二部| 久久久欧美一区二区| 国产午夜无码视频在线观看| 国产资源在线一区| 国产日韩欧美亚洲一区| av在线天堂播放| 一区二区三区精品视频| 免费午夜视频在线观看| 精品久久国产一区| 亚洲精品综合精品自拍| 日本在线一级片| 国产一区二区你懂的| 国产日韩在线视频| 人妻一区二区三区四区| 中文字幕一区三区| 欧美一级在线看| 成人污版视频| 亚洲欧美日韩中文在线制服| 青娱乐国产在线| 欧美96一区二区免费视频| 国产超碰91| 高清国产福利在线观看| 亚洲国产日韩a在线播放| 中文字幕国产传媒| 伊人春色之综合网| 欧美激情国产高清| 国产精品视频第一页| 久久久99免费| 国产资源在线视频| 亚洲一区二区三区免费| 色悠悠久久久久| 日韩精品在线观看免费| 国产成人在线视频播放| 影音先锋欧美在线| 久久99久久99精品免观看软件| 精品国产乱码久久久久久图片 | 国产精品一区二区性色av| 天天摸天天干天天操| 亚洲精品大片www| 久久国产这里只有精品| 你微笑时很美电视剧整集高清不卡| 欧美黑人巨大精品一区二区| 国产又粗又长视频| 国产欧美一区二区精品久导航| 99热自拍偷拍| 久久精品福利| 久久免费国产精品1| jizz国产视频| 亚洲精品久久久蜜桃| 久久人人爽av| 日韩www.| 国产精品丝袜高跟| 岛国视频免费在线观看| 欧美性猛交xxxx免费看| 搡老熟女老女人一区二区| 精品不卡视频| 国内精品二区| 97久久人人超碰caoprom| 亚洲成av人影院在线观看| 少妇久久久久久被弄高潮| 国产毛片精品视频| 欧美一级爱爱视频| 88久久精品| 国模吧一区二区| 亚洲色图狠狠干| 色悠悠久久综合| www久久久久久久| 麻豆高清免费国产一区| 成人手机视频在线| 国产亚洲久久| 欧美大片在线影院| 婷婷久久久久久| 高跟丝袜一区二区三区| 91视频免费观看网站| 日韩av电影天堂| 亚洲综合第一| 亚洲精品在线播放| 亚洲3p在线观看| 青青免费在线视频| 欧美日韩在线播放三区四区| 日本一级片免费| 粉嫩aⅴ一区二区三区四区| 国产伦精品一区二区三区四区视频_| 欧美人体视频| 国产精品一二三在线| 国产激情在线观看| 亚洲成人a**站| 日韩在线视频不卡| 成人免费视频在线观看| 亚洲一区二区三区四区av| 男人的天堂成人在线| 亚洲精品乱码久久久久久蜜桃91| 精品一级视频| 91成人精品网站| 思思99re6国产在线播放| 日韩欧美123| 91丝袜一区二区三区| 中文字幕一区二区不卡| 制服丝袜在线第一页| 日韩成人精品在线观看| 男人天堂新网址| 精品中文一区| 97免费高清电视剧观看| 成人福利视频| 欧美日韩ab片| 春暖花开成人亚洲区| 精品国产乱码久久久久久影片| 久久精品五月天| 亚洲国产一区二区三区| 免费看91的网站| 大白屁股一区二区视频| 日本男人操女人| 国内在线观看一区二区三区| 日韩av一区二区三区美女毛片| 亚洲伊人影院| 国产伦精品免费视频| av漫画网站在线观看| 精品国产视频在线| 极品美乳网红视频免费在线观看| 91精品国产91久久综合桃花| 一级黄色av片| 亚洲成av人片在线观看| 午夜激情视频在线播放| 久久亚洲春色中文字幕久久久| 五月六月丁香婷婷| 日韩在线a电影| a√天堂在线观看| 欧美午夜国产| 国产91av视频在线观看| 深夜福利久久| 久久av一区二区三区亚洲| 欧美专区一区| 国产一区二区香蕉| 国产精品久久亚洲不卡| 性色av一区二区三区红粉影视| 黄网站免费在线播放| 中文字幕国产日韩| 日韩精品视频无播放器在线看| 日韩欧美国产精品| 91国产精品一区| 欧美色综合影院| 亚洲av无码不卡| 欧美性xxxx在线播放| 国产稀缺真实呦乱在线| 亚洲激情av在线| 唐朝av高清盛宴| 亚洲女同ⅹxx女同tv| 永久免费观看片现看| 国产亚洲精品福利| 一区二区黄色片| 国产视频一区二区在线| 国产精品无码午夜福利| 97精品久久久午夜一区二区三区| 亚洲av成人片无码| 成人av在线播放网站| 91人人澡人人爽| 国产91在线看| 国产a级片视频| 成人av在线电影| 性欧美丰满熟妇xxxx性久久久| 成人听书哪个软件好| 亚洲图片欧美另类| 99久久免费视频.com| 精品影片一区二区入口| www.色综合.com| 最近中文字幕无免费| 99国产欧美另类久久久精品 | 99久久夜色精品国产亚洲| 91精品国产综合久久久久久久| 在线观看中文字幕网站| 欧美精品三级日韩久久| 99热这里只有精品3| 精品国产电影一区二区| 五月激情丁香婷婷| 亚洲午夜精品视频| 97电影在线观看| 久久伊人色综合| 怡红院av在线| 911国产网站尤物在线观看| 天堂在线中文网官网| 国产97在线|亚洲| 91大神在线观看线路一区| 成人黄色大片在线免费观看| 美女久久精品| 久久大香伊蕉在人线观看热2| 国产精品片aa在线观看| 中国人体摄影一区二区三区| 国产综合色产| 国产福利视频在线播放| 久久国产日韩欧美精品| 国产精品19p| 久久婷婷综合激情| 久久福利免费视频| 亚洲电影在线免费观看| 亚洲天堂五月天| 欧美大片拔萝卜| 蝌蚪视频在线播放| 久久综合88中文色鬼| 精品丝袜在线| 国产在线播放91| 精品三级av| 亚洲精品一区二区三| 亚洲网址在线| 国产成人黄色网址| 成人av网站在线观看免费| 谁有免费的黄色网址| 亚洲激情校园春色| 黄色片中文字幕| 日韩三级中文字幕| 国产毛片在线看| 国外视频精品毛片| 日韩城人网站| 欧美日韩精品免费观看| 欧美 亚欧 日韩视频在线 | 91嫩草国产线观看亚洲一区二区 | 熟妇人妻av无码一区二区三区| 国产一级揄自揄精品视频| 啪啪免费视频一区| 国产精品视频一| 日韩在线黄色| 4444亚洲人成无码网在线观看| 日韩精品成人一区二区三区| 制服.丝袜.亚洲.中文.综合懂| 中文在线免费一区三区高中清不卡| 久久精品第一页| 91精品在线观看入口| 黄色在线免费观看大全| 性欧美暴力猛交69hd| 成人黄色图片网站| 免费看污久久久| 亚洲国内精品| 国内精品国产三级国产aⅴ久| 国产欧美在线观看一区| 91porny在线| 精品久久久久久久久久久久包黑料| 久久久久久久久免费视频| 日韩美女免费观看| 亚洲电影男人天堂| 国产高清av在线播放| 国产乱码精品一区二区三区五月婷 | 成人av中文字幕| 欧美精品videos极品| 91.com在线观看| 米奇精品一区二区三区| 国产精品亚洲аv天堂网| 国产一区二区三区站长工具| 国产69精品久久久久999小说| 国产成人在线免费| 久久免费视频精品| 日韩三级高清在线| 性欧美1819sex性高清大胸| 成人激情免费在线| 一区二区免费不卡在线| 91pony九色| 亚洲欧美成人一区二区三区| 91丨九色丨蝌蚪丨对白| 日韩在线观看视频免费| 亚洲国产一区二区久久| 最新中文字幕久久| 国产精品影音先锋| 久久久久亚洲AV成人| 日韩女优视频免费观看| 欧美一卡二卡| 国产区二精品视| 亚洲欧美视频| 成人黄色免费网址| 欧美日韩国产天堂| 激情成人四房播| 99在线看视频| 亚洲精品裸体| 青青草福利视频| 欧美日韩综合在线| 九七久久人人| 99精品国产一区二区| 亚洲人成免费| 特级西西www444人体聚色| 欧美三级乱人伦电影| 成人福利在线观看视频| αv一区二区三区| 99在线精品免费视频九九视| 日本黄色网址大全| 欧美日韩视频在线观看一区二区三区| 欧美日韩在线资源| 99热99热| 六月天综合网| 99成人在线观看| 欧美不卡在线视频| 欧美专区福利免费| 一区二区免费在线观看| 国产大陆精品国产| 国内免费精品视频| 最近免费中文字幕视频2019| 日韩欧美中文在线观看| 黄色免费视频大全| 国产精品久久夜| 成人小说亚洲一区二区三区| 日本精品一区二区三区在线| 91日韩视频| 日韩综合第一页| 欧美日韩电影在线| 久久男人av资源站| 一区二区日本伦理| 99re免费视频精品全部| 在线观看亚洲国产| 57pao精品| 亚洲国产一区二区三区在线播放| 日韩 中文字幕| 91精品国产一区二区三区香蕉| 看黄在线观看| 中文字幕一区二区三区精彩视频 | 久久综合狠狠综合久久综青草 | 色综合久久88色综合天天6| 50度灰在线| 亚洲高清资源综合久久精品| 成人av一区二区三区|