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

設計Go API的管道使用原則

開發 前端 后端
管道是并發安全的隊列,用于在Go的輕量級線程(Go協程)之間安全地傳遞消息。總的來講,這些原語是Go語言中最為稱道的特色功能之一。這種消息傳遞范式使得開發者可以以易于理解的語義和控制流來協調管理多線程并發任務,而這勝過使用回調函數或者共享內存。

管道是并發安全的隊列,用于在Go的輕量級線程(Go協程)之間安全地傳遞消息。總的來講,這些原語是Go語言中最為稱道的特色功能之一。這種消息傳遞范式使得開發者可以以易于理解的語義和控制流來協調管理多線程并發任務,而這勝過使用回調函數或者共享內存。

即使管道如此強大,在公有的API中卻不常見。例如,我梳理過Go的標準庫,在145個包中有超過6000個公有的API。在這上千個API中,去重后,只有5個用到了管道。

在公有的API中使用管道時,如何折衷考慮和取舍,缺乏指導。“共有API”,我是指“任何實現者和使用者是不同的兩個人的編程接口”。這篇文章會深入講解,為如何在共有API中使用管道,提供一系列的原則和解釋。一些特例會在本章末尾討論。

原則 #1

API應該聲明管道的方向性。

例子

time.After

  1. func After(d Duration) <-chan Time 

signal.Notify

  1. func Notify(c chan<- os.Signal, sig ...os.Signal) 

盡管并不常用,Go允許指定一個管道的方向性。語言規范這么寫:

可選的<-操作符指定了管道的方向,發送或接收。如果沒有指定方向,那么管道就是雙向的。

關鍵在于API簽名中的方向操作符會被編譯器強制檢查

  1. t := time.After(time.Second)  
  2. t <- time.Now()  // 會編譯失敗(send to receive-only type <-chan Time) 

除了能夠被編譯器強制檢查安全性,方向操作符還能幫助API使用者理解數據的流動方向——只需要看一下類型簽名即可。

原則 #2

向一個管道發送無界數據流的API必須寫文檔解釋清楚在消費者消費不及時時API的行為。

例子

time.NewTicker

  1. // NewTicker returns a new Ticker containing a channel that will send the  
  2. // time with a period specified by the duration argument.  
  3. // It adjusts the intervals or drops ticks to make up for slow receivers.  
  4. // ...  
  5. func NewTicker(d Duration) *Ticker {  
  6.     ...  

signal.Notify

  1. // Notify causes package signal to relay incoming signals to c.  
  2. // ...  
  3. // Package signal will not block sending to c  
  4. // ...  
  5.    
  6. func Notify(c chan<- os.Signal, sig ...os.Signal) { 

ssh.Conn.OpenChannel

  1. // OpenChannel tries to open an channel.  
  2. // ...  
  3. // On success it returns the SSH Channel and a Go channel for  
  4. // incoming, out-of-band requests. The Go channel must be serviced, or  
  5. // the connection will hang.  
  6.    
  7. OpenChannel(name string, data []byte) (Channel, <-chan *Request, error) 

當一個API向一個管道發送無界數據流時,在實現API時面臨的問題是如果向管道發送數據會阻塞怎么辦。阻塞的原因可能是管道已經滿了或者管道是無緩沖的,沒有go協程準備好接收數據。針對不同的場景要選擇合適的行為,但是每個場景必須作出選擇。例如,ssh包選擇了阻塞,并且文檔寫明如果你不接受數據,連接就會被卡住。signal.Notify 和 time.Tick選擇不阻塞,直接丟棄數據。

不足的是,Go本身并沒有從類型或函數簽名角度提供方法指定默認行為。作為API的設計者,你必須在文檔中寫明行為,不然其行為就是不定的。然而,多數情況下我們都是API的使用者而不是設計者,所以我們可以反過來記這個原則,反過來就是一條警告信息:

對于通過一個管道向一個慢速的消費者發送無界數據的API,在沒有通讀API的文檔或者實現源碼之前,你不能確定API的行為。

原則 #3

向一個管道發送有界數據,同時這個管道是作為參數傳遞進來的API,必須用文檔寫明對于慢速消費者的行為。

不好的例子

rpc.Client.Go

  1. func (client *Client) Go(serviceMethod string,  
  2.                          args interface{},  
  3.                          reply interface{},  
  4.                          done chan *Call  
  5.                          ) *Call 

這個原則和第二個原則類似,不同點在于這個原則用于發送有界數據的API。不幸的是,在標準庫中沒有很好的例子。標準庫中唯一的API就是rpc.Client.Go,但它違背了我們的原則。文檔上這么寫:

Go異步的調用這個函數。它會返回代表著調用的Call數據結構。在調用完成時,done管道會通過返回同一個Call對象來觸發。如果done是空的,Go會分配一個新的管道;如果不空,done必須是有緩沖的,不然Go就會崩潰。

Go發送了有界數據(只有1,當遠程調用結束時)。但是注意到,由于管道是被當作參數傳遞到函數中的,所以它仍然存在慢速消費者問題。即使你必須傳一個帶緩沖的管道進來,如果管道已滿,向這個管道發送數據仍然可能會阻塞。文檔并沒有定義這種場景下的行為。需要我們來讀讀源碼了:

src/pkg/net/rpc/client.go

  1. func (call *Call) done() {  
  2.      select {  
  3.      case call.Done <- call:  
  4.      // ok  
  5.      default:  
  6.      // We don't want to block here.  It is the caller's responsibility to make  
  7.          // sure the channel has enough buffer space. See comment in Go().  
  8.          if debugLog {  
  9.              log.Println("rpc: discarding Call reply due to insufficient Done chan capacity")  
  10.          }  
  11.      }  

噢!如果done管道沒有合適的緩沖,RPC的響應可能丟失了。

原則 #4

向一個管道發送無界數據流的API應該接受管道作為參數,而不是返回一個新的管道。

例子

signal.Notify

  1. func Notify(c chan<- os.Signal, sig ...os.Signal) 

ssh.NewClient

  1. func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client 

當我第一次看到signal.Notify這個API時,我很疑惑,“為什么它接收一個管道作為輸入而不是直接返回一個管道給我用?”“使用這個API需要調用方分配一個管道,難道API就不能替我們做么,像下面這樣?”

  1. func Notify(sig ...os.Signal) <-chan os.Signal 

文檔幫助我們理解為什么這不是好的選擇:

signal包向c發送數據時并不會阻塞:調用方必須保證c有足夠的緩沖空間來跟得上潛在的信號速度

signal.Notify接收管道作為參數,因為它把緩沖空間的控制權交給了調用方。這使得調用方可以選擇,在處理一個信號時,可以安全的忽略多少信號,這需要和緩存這些信號的內存開銷作折衷考慮。

緩沖大小的控制在高吞吐系統中尤為重要。設想一個高吞吐的發布訂閱系統的這樣一個接口:

  1. func Subscribe(topic string, msgs chan<- Msg) 

往管道中發送越多的消息,管道同步稱為性能瓶頸的可能性越大。由于API允許調用方創建管道,調用方需要考慮緩沖,進而性能可以由調用方控制。這是一種更靈活的設計。

如果僅僅是控制緩沖的大小,我們可能會爭論如下的API就足夠了:

  1. func Notify(sig ...os.Signal, bufSize int) <-chan os.Signal 

這樣設計,管道作為參數還是必須的,因為這樣允許調用方使用一個管道動態的處理不同類型的信號。這樣設計為調用方提供了更多的程序結構和性能上的靈活性。作為一個假想實驗,讓我們用Subscribe API來構建需求。訂閱newcustomer管道,并對于每一條消息,為消費者訂閱其主題。如果API允許我們傳遞接收管道,我們可以這樣寫:

  1. msgs := make(chan Msg, 128)  
  2.    
  3. Subscribe("newcustomer", msgs)  
  4. for m := range msgs {  
  5.     switch m.Topic {  
  6.     case "newcustomer":  
  7.         Subscribe(msg.Payload, msgs)  
  8.     default:  
  9.         handleCustomerMessage(m)  

但是,如果管道被返回了,調用方不得不為每一個訂閱啟動一個單獨的go協程。這在任何復用場景都會帶來額外的內存和同步開銷:

  1. for m := range Subscribe("newcustomer") {  
  2.     go subCustomer(m.Payload)  
  3. }  
  4.    
  5. func subCustomer(topic string) {  
  6.     for m := range Subscribe(topic) {  
  7.         handleCustomerMessage(m)  
  8.     }  

原則 #5

發送有界數據的API可以通過返回一個合適大小緩沖的管道來達到目的。

例子:

http.CloseNotifier

  1. type CloseNotifier interface {  
  2.         // CloseNotify returns a channel that receives a single value  
  3.         // when the client connection has gone away.  
  4.         CloseNotify() <-chan bool  

time.After

  1. func After(d Duration) <-chan Time 

當API向一個管道發送有界數據時,可以返回一個擁有容納全部數據的緩沖空間的管道。這個要返回的管道的方向性標識保證了調用方必須遵守約定。CloseNotify 和After返回的管道 都利用了這一點。

同時,需要注意到,通過允許調用方傳遞一個管道來接收數據,這些調用可能會更靈活。但需要處理當管道滿了的時候(原則3)。例如,另外一個可選的,更靈活的CloseNotifier:

  1. type CloseNotifier interface {  
  2.         // CloseNotify sends a single value with the ResponseWriter whose  
  3.         // underlying connection has gone away.  
  4.         CloseNotify(chan<- http.ResponseWriter)  

但是這種額外的靈活性帶來的開銷并不值得關注,因為單一的調用方很少會同時等待多個關閉通知。畢竟,關閉通知只有在某個連接上下文內才有效。不同的連接一般都是相互獨立的。

特例

一些API打破了我們的原則,需要仔細分析。

原則 #1 的特例

API需要聲明管的方向性。

例子

rpc.Client.Go

傳過來的done管道沒有方向性標識符:

  1. func (client *Client) Go(serviceMethod string,  
  2.                          args interface{},  
  3.                          reply interface{},  
  4.                          done chan *Call  
  5.                          ) *Call 

直觀上看,這樣做是因為done管道是作為Call結構體的一部分返回的。

  1. type Call struct {  
  2.         // ...  
  3.         Done          chan *Call  // Strobes when call is complete.  

這種靈活性是需要的,這樣允許在你傳nil時分配一個done管道出來。如果堅持原則1,就需要從Call結構中去除done并且聲明兩個函數:

  1. func (c *Client) Go(method string,  
  2.                     args interface{},  
  3.                     reply interface{}  
  4.                     ) (*Call, <-chan *Call)  
  5.    
  6. func (c *Client) GoEx(method string,  
  7.                       args interface{},  
  8.                       reply interface{},  
  9.                       done chan<- *Call  
  10.                       ) *Call 

原則 #4 的特例

向管道發送無界數據流的API需要接收管道作為參數,而不是返回一個新的管道。

例子

go.crypto/ssh

  1. func NewClientConn(c net.Conn, addr string, config *ClientConfig)  
  2.     (Conn, <-chan NewChannel, <-chan *Request, error) 

time.Tick

  1. func Tick(d Duration) <-chan Time 

go.crypto/ssh包幾乎在所有的地方都返回了無界的數據流管道。ssh.NewClientConn只是其中的一個。給調用者更多控制權和靈活性的API應該是這樣:

  1. func NewClientConn(c net.Conn,  
  2.                    addr string,  
  3.                    config *ClientConfig,  
  4.                    channels chan<- NewChannel,  
  5.                    reqs chan<- *Request  
  6.                    ) (Conn, error) 

time.Tick也違反了這個原則,但是易于理解。我們很少會創建非常多的計時器,通常都是獨立的處理不同的計時器。這個例子中緩沖也沒太大意義。

第二部分:那些原本可能使用的管道

這篇文章是一篇長文,所以我準備分成兩部分講。接下來會提很多問題,為什么標準庫中可以使用管的地方卻沒有用管道。例如,http.Serve 返回了一個永不結束的等待被處理的請求流,為什么用了回調函數而不是將這些請求發送到一個處理管道中?第二部分會介紹更多!

原文鏈接: Alan Shreve   翻譯: 伯樂在線 - Codefor

譯文鏈接: http://blog.jobbole.com/73700/

責任編輯:林師授 來源: 伯樂在線
相關推薦

2017-06-19 14:21:01

JavaScriptAPI設計原則

2016-03-29 09:59:11

JavaScriptAPI設計

2022-02-10 23:38:23

API架構設計

2023-09-21 11:20:46

2014-07-02 21:20:56

CA TechnoloAPI

2015-09-23 17:12:18

API設計原則

2024-08-26 15:35:40

2015-09-24 08:52:53

API設計原則

2024-09-19 08:46:46

SPIAPI接口

2025-03-27 00:45:00

2010-10-11 11:25:26

MySQL主鍵

2025-06-03 08:05:00

設計原則開發代碼

2022-09-27 09:21:34

SOLID開閉原則Go

2010-10-19 17:21:35

SQL SERVER主

2024-03-13 15:21:24

APIJava原則

2020-01-08 14:45:38

Kubernetes存儲架構

2013-04-17 10:46:54

面向對象

2012-05-08 10:14:45

設計原則

2014-04-25 10:13:00

Go語言并發模式

2010-01-28 10:01:28

C++的設計原則
點贊
收藏

51CTO技術棧公眾號

欧美无人区码suv| 91麻豆天美传媒在线| 中文字幕一区在线播放| 国产成人精品999在线观看| 在线观看av一区二区| 国产精品88久久久久久妇女| 婷婷伊人综合中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 欧美乱大交xxxxx| 波多野结衣 在线| 一区二区三区在线免费看 | 91色在线porny| 国产男女猛烈无遮挡91| 日韩三级小视频| 久久久久久影院| 亚洲免费电影一区| 亚洲精品一二三四| 日韩成人亚洲| 福利二区91精品bt7086| 伊人网在线免费| 91在线导航| 久久这里只精品最新地址| 亚洲伊人第一页| 自拍偷拍第八页| 久久久噜噜噜| 97人人模人人爽人人喊中文字| 一本一本久久a久久| 亚洲最好看的视频| 欧美va日韩va| 四虎国产精品免费| 亚洲综合资源| 欧美日韩免费不卡视频一区二区三区| 久久精品国产精品亚洲色婷婷| av在线播放国产| 中文字幕中文在线不卡住| 欧美在线一二三区| 你懂的视频在线| 成人av电影在线网| 亚洲自拍av在线| 91精品国产乱码久久久久| 久久香蕉精品| 日产精品久久久一区二区福利| 日韩欧美激情视频| 亚洲精品在线二区| 91精品国产91久久久久久吃药 | 欧美成人国产| 美女性感视频久久久| 欧美性生给视频| 91偷拍一区二区三区精品| 在线电影av不卡网址| 熟女俱乐部一区二区视频在线| 久久香蕉精品香蕉| 亚洲激情在线观看视频免费| 黄色av网址在线观看| 国产精品网址| 亚洲精品电影网站| 国产精品探花一区二区在线观看| 奇米777国产一区国产二区| 亚洲国产成人爱av在线播放| 中文字幕乱码在线| 天堂99x99es久久精品免费| 日韩精品黄色网| 亚洲av无码一区二区三区人| 国产精品三级| 中文字幕免费国产精品| 三级黄色录像视频| 中文在线日韩| 性欧美在线看片a免费观看| 美日韩一二三区| 日一区二区三区| 国产在线高清精品| 精品久久人妻av中文字幕| 丁香婷婷综合激情五月色| 国产一区不卡在线观看| 精品999视频| 国产精品国产a级| 久操手机在线视频| 国产极品在线观看| 色婷婷av一区二区| 天天久久综合网| 美国十次av导航亚洲入口| 亚洲性日韩精品一区二区| 国产又粗又猛又爽又黄的视频小说| 99re6这里只有精品| 久久999免费视频| 国产又黄又猛又粗又爽| 免费人成网站在线观看欧美高清| 91久久偷偷做嫩草影院| 亚洲日本在线播放| 亚洲欧洲精品一区二区三区 | 久久99在线观看| av电影成人| 国产在线电影| 夜夜嗨av一区二区三区四季av| 久久精品国产精品亚洲色婷婷| 久久久久久久性潮| 亚洲国产精品字幕| 日本在线观看网址| 一区二区国产精品| 成人福利免费观看| 婷婷色在线观看| 亚洲六月丁香色婷婷综合久久| 欧美亚洲精品一区二区| 四虎国产精品永久在线国在线| 亚洲国产小视频| 污污的视频在线免费观看| 香蕉久久a毛片| 亚洲自拍偷拍区| 国产精品一区在线看| 亚洲图片欧美色图| 九九九九九九九九| 精品少妇av| 91爱视频在线| 亚洲国产欧美另类| 国产精品久久久久久久久免费樱桃| 91成人在线观看喷潮教学| 欧美日韩破处视频| 亚洲视频自拍偷拍| 天堂在线免费观看视频| 国产91对白在线观看九色| 亚洲砖区区免费| 久久99久久99精品免观看软件| 亚洲精品在线观看网站| 精品亚洲乱码一区二区| 日韩电影在线观看电影| 精品视频一区在线| 欧美videossex| 欧美一级艳片视频免费观看| 成年人免费视频播放| 日本美女一区二区| 欧美日韩三区四区| 九色porny视频在线观看| 日韩午夜激情免费电影| 在线视频这里只有精品| 日韩av电影天堂| 欧美人xxxxx| 亚洲欧美se| 亚洲精品资源美女情侣酒店| 日韩伦人妻无码| 成人av在线播放网站| 美女黄色免费看| 91在线一区| 国产69精品久久久久9| www.久久成人| 亚洲一区二区欧美日韩| 欧美久久久久久久久久久| 欧美久久影院| 99re在线| 3344国产永久在线观看视频| 精品剧情v国产在线观看在线| 久热精品在线观看| 白白色亚洲国产精品| 可以在线看的av网站| 欧美日韩一区二区三区四区不卡| 欧美一级片免费在线| 色综合888| 91福利资源站| 成人免费视频入口| 国产在线视频一区二区三区| 真人做人试看60分钟免费| 亚洲一区二区三区免费| 国外成人免费在线播放| 青青国产在线| 欧美日韩久久不卡| 中文字幕影音先锋| 成av人片一区二区| 国产精品无码专区av在线播放| 红桃成人av在线播放| 国产日本欧美一区二区三区| 国产秀色在线www免费观看| 精品久久人人做人人爽| 久草手机在线视频| 国产精品色哟哟| 无套内谢丰满少妇中文字幕| 亚洲激情影院| 先锋影音网一区| 91麻豆精品激情在线观看最新| 国产91精品视频在线观看| 大胆av不用播放器在线播放| 777奇米四色成人影色区| 亚洲国产精一区二区三区性色| 久久色在线观看| 国产一级免费大片| 国产精品五区| 综合视频在线观看| 蜜桃一区av| 国产伊人精品在线| 免费v片在线观看| 色偷偷av一区二区三区| 亚洲精品一区二区三区新线路 | 亚洲制服欧美另类| 91九色综合久久| 在线天堂中文资源最新版| 日韩中文字幕视频| 亚洲欧美日韩动漫| 91精品在线麻豆| 极品国产91在线网站| 伊人夜夜躁av伊人久久| 日本少妇xxxxx| 成人av影院在线| 亚洲综合123| 日本在线播放一区二区三区| 日韩黄色短视频| 欧美高清视频手机在在线| 国产伦一区二区三区色一情| 狂野欧美性猛交xxxx| 午夜欧美不卡精品aaaaa| 国产在线激情视频| 一个人www欧美| 天天av天天翘| 欧美一区二区免费观在线| 日本中文字幕在线观看视频| 亚洲成人午夜电影| 91精品国产闺蜜国产在线闺蜜| 久久精品人人做人人综合 | 国产va免费精品观看精品视频 | 成人毛片在线精品国产| 欧美人狂配大交3d怪物一区| 精品久久久久久久久久久久久久久久 | 91理论片午午论夜理片久久| 午夜精品成人av| 91高清视频在线免费观看| 伊人在我在线看导航| 日韩亚洲欧美中文在线| 九色视频在线播放| 亚洲黄页网在线观看| 人妻精品一区二区三区| 欧美一区二区免费| va视频在线观看| 欧美日韩国产一级片| 中文字幕 亚洲视频| 在线亚洲高清视频| 中文字幕在线欧美| 欧美日韩一区二区免费视频| 精品无码久久久久| 一区二区三区不卡在线观看| 亚洲天堂网av在线| 中文字幕欧美一| 黄色av片三级三级三级免费看| 国产午夜精品一区二区三区视频 | 色综合网站在线| 日韩精品1区2区| 精品国产电影一区| 久草国产精品视频| 精品电影在线观看| 国产成人在线免费视频| 丁香五六月婷婷久久激情| 日本中文字幕在线免费观看| 动漫精品一区二区| 国产一级一级国产| 欧美在线视频你懂得| 怡春院在线视频| 91精品福利在线一区二区三区| 国产精品嫩草影院桃色| 欧美日韩成人在线一区| 国产美女明星三级做爰| 日韩欧美国产综合| 日韩一区二区三区不卡| 亚洲美女av网站| 不卡在线视频| 久久九九免费视频| 午夜在线激情影院| 2019中文字幕在线| 成人午夜毛片| 96sao精品视频在线观看| 97久久超碰| 欧美一区二区三区四区夜夜大片 | 日韩精品视频中文字幕| 国产精品国产精品| 希岛爱理av免费一区二区| 亚洲电影免费| 欧美jizzhd精品欧美巨大免费| 欧美深夜福利视频| 日本va欧美va瓶| 最好看的中文字幕| 99国产精品国产精品久久| 国产精成人品免费观看| 亚洲人成影院在线观看| 久久中文字幕在线观看| 色8久久精品久久久久久蜜| 国产精品污视频| 亚洲精品国产精品乱码不99按摩| jizzjizz在线观看| 欧美激情xxxxx| 欧美成人app| av色综合网| 成人午夜av| 蜜臀av性久久久久蜜臀av| 亚洲国产专区| 午夜一级免费视频| 不卡av在线免费观看| 久草手机视频在线观看| 五月天亚洲婷婷| 91丨九色丨蝌蚪丨对白| 亚洲精品91美女久久久久久久| 在线观看免费版| 国产91精品久| 一区二区三区自拍视频| 亚洲二区三区四区| 国产精品五区| 精品伦一区二区三区| 亚洲国产高清aⅴ视频| 国产在线成人精品午夜| 欧美日韩视频在线观看一区二区三区 | 日韩精彩视频在线观看| 美女伦理水蜜桃4| 中文字幕一区二区三| www.国产一区二区| 精品久久一区二区三区| 免费在线观看黄色网| 日韩免费精品视频| 精品中国亚洲| 日本福利视频在线观看| 日本人妖一区二区| 青青草视频成人| 亚洲一区二区三区四区在线观看 | 本田岬高潮一区二区三区| 小泽玛利亚一区| 欧美性大战久久| 黄色软件在线观看| 欧美亚洲国产另类| 91精品国产自产精品男人的天堂| 一区二区三区四区在线视频| 日韩电影一区二区三区| www.中文字幕av| 精品福利一区二区| 好吊视频一区二区三区| 欧美大尺度在线观看| 99国内精品久久久久| 亚洲乱码一区二区三区| 三级成人在线视频| 一级肉体全黄裸片| 91久久奴性调教| jyzzz在线观看视频| 国产精品精品久久久| 国产亚洲第一伦理第一区| aaaaaa亚洲| 久久久久久久综合日本| 亚洲大片免费观看| 亚洲欧美色婷婷| 亚州一区二区三区| 午夜视频久久久| 久久99精品国产.久久久久| 我要看一级黄色录像| 欧美精品 日韩| 国产一二三区在线观看| 亚洲在线一区二区| 欧美日韩一区二区国产| 韩国黄色一级片| 亚洲观看高清完整版在线观看| 成人免费视频国产| 4438全国亚洲精品在线观看视频| 免费看av成人| 国产一区二区在线免费播放| 国产精品久久网站| 国产毛片毛片毛片毛片| 免费99精品国产自在在线| 911精品国产| 777米奇影视第四色| 国产亚洲一区二区三区四区 | 国产成+人+日韩+欧美+亚洲| 久久久久久久久久99| 亚洲国产欧美一区二区丝袜黑人 | 精品视频一区在线| 久久久亚洲人| 在线日韩国产网站| 亚洲精品一区二区三区福利| 樱桃视频成人在线观看| 亚洲精品中字| 高清视频一区二区| 欧美亚洲精品天堂| 中文字幕在线观看日韩| 精品久久亚洲| 欧美日韩精品在线一区二区 | 国产一区二区三区观看| 精品深夜av无码一区二区老年| 日韩精品中文字幕久久臀| 久久爱.com| 国产一二三区在线播放| 国产亚洲欧美日韩日本| 国产美女免费视频| 国产91精品久久久久久| 国产精品精品| 草草地址线路①屁屁影院成人| 欧美亚一区二区| av午夜在线观看| 视频一区亚洲| 国产aⅴ综合色| 中日韩av在线| 午夜精品久久久久久久99黑人 | 91 中文字幕| 97在线免费观看视频| 91日韩在线| 色婷婷在线影院| 精品免费99久久| 久久三级毛片| 无遮挡又爽又刺激的视频| 一区二区三区四区在线| аⅴ资源新版在线天堂| 国产精品三区在线|