国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Go/Rust/Java/C你真的了解泛型 Generic 嘛?

共 15661字,需瀏覽 32分鐘

 ·

2021-08-20 09:09

泛型 Generic Programming[1] 通常指允許程序員在強類型程序設計語言中,編寫代碼時使用一些以后才指定的類型,在實例化時作為參數指明這些類型,即類型參數化

首先我們不是科班討論學術,有些概念比較模糊也正常,本文討論的內容意在給大家提供全局的視野看待泛型 Generic, 大致了解主流語言的實現

泛型會提供哪些便利呢?上面的動圖非常經典,比如 min 函數,如果沒有泛型,需要針對 int, float, string 分別寫出不同的特定實現,代碼非常冗余。本文會討論下為什么 go 需要泛型以及 go2 泛型的 proposal[2]

CPP 模板

#include <iostream>
template <class T>
T max(T a,T b){

  T ret = a > b? a : b;
  std::cout<< a << " and " << b <<" max is " << ret << std::endl;
  return ret;
}
int main(){
  max(1,2);  // 整數
  max(1.2,2.3); // 浮點數
  return 0;
}

上面是 cpp 模板實現的 max 泛型函數,傳入 int, float 都可以工作

$ c++ max.cpp  -o max && ./max
1 and 2 max is 2
1.2 and 2.3 max is 2.3

運行結果如上所示,同樣代碼換成 go 肯定就是錯的,本質是模板在編譯期單態(tài)化,針對每個特定類型生成了特定函數

$ nm max | grep -i max
0000000100000f90 T __Z3maxIdET_S0_S0_
0000000100000ef0 T __Z3maxIiET_S0_S0_
$ c++filt __Z3maxIdET_S0_S0_
double max<double>(double, double)
$ c++filt __Z3maxIiET_S0_S0_
int max<int>(int, int)

通過 nm 查看二進制的符號表,生成了兩個函數,簽名分別是 double max<double>(double, double), int max<int>(int, int)

CPP 模板非常強大,但是也有缺點,比如二進制膨脹的厲害,有可能影響到 cpu icache, 業(yè)務代碼無所謂了。另外 T 沒有其它語言的 constraint 或 bounded, 比如要求 T 必須實現某些方法,然后函數內只能調用這些顯示的約束(C++20 會引入 concepts 實現約束)

C 怎么實現

C 嚴格意義上沒有實現,但在 C11 標準中引入了 _Generic 泛型選擇器,閹割版的實現

#include <stdio.h>
// int類型加法
int addI(int a, int b)
{
    printf("%d + %d = %d\n",a,b, a + b );
    return (a + b);
}
// double類型加法
double addF(double a, double b)
{
    printf("%f + %f = %f\n",a,b, a + b );
    return (a + b);
}
void unsupport(int a,int b)
{
    printf("unsupport type\n");
}
#define ADD(a,b) _Generic((a), \
    int:addI(a,b),\
    double:addF(a,b), \
    default:unsupport(a,b))

int main(void)
{
    ADD(1 , 2);
    ADD(1.1,2.2);
    return 0;
}

上面是實現的 ADD 方法,只是調用的時候看起來是泛型了。 這種實現是有缺點的,c 會做很多隱式轉換,即使你傳入字符串,也會編譯成功,并且取得一個值。并沒有在編譯期確保類型 a, b 一致

同時由于 c 不支持函數名重載,還要人工編寫特定實例的函數 addF, addI, 并且二進制的符號表并沒有 ADD. 類比 cpp 是由編譯器替我們完成

在 C11 以前的標準中,很多代碼都是用 void * 實現,問題在于 void 是沒有類型信息的,需要增加特定的函數指針回調,讓我們來看 redis 例子

typedef struct dictType {
    uint64_t (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;


typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx; /* rehashing not in progress if rehashidx == -1 */
    unsigned long iterators; /* number of iterators currently running */
} dict;

上面的代碼來自 redis dict[3], 字典是泛型的,value 可以是任意類型,只要實現了 dictType 定義的函數指針。內核里面也有大量類似實現,非常通用

Rust 實現

Rust 泛型也同樣編譯期單態(tài)化,運行時沒有開銷

fn printer<T: Display>(t: T) {
    println!("{}", t);
}

這里定義函數 printer, 類型 T 必須實現了 Display trait, 這就是所謂的 constraint 或者 bounded

impl <A, D> MyTrait<A, D> for YourType where
    A: TraitB + TraitC,
    D: TraitE + TraitF {
    
}

但假如需要滿足多個約束的時候,在 <> 里寫就很不簡潔,需要使用 where[4] 關鍵字

Rust 很多時候難懂,就是因為疊加了泛型,生命周期,所有權,還有很多的 wrapper, 別說寫了,讀都讀不懂

Java 版本

Java 在 1.5 版本引入了泛型,它的泛型是用類型擦除實現的。Java 的泛型只是在編譯期間用于檢查類型的正確,為了保證與舊版本 JVM 的兼容,類型擦除會刪除泛型的相關信息,導致其在運行時不可用。關于這塊可以參考 大神R大的回答[5], 早就有類似 cpp 實現,只是涉及兼容上的取舍,不得不這么做

編譯器會插入額外的類型轉換指令,與 C 語言和 C++ 在運行前就已經實現或者生成代碼相比,Java 類型的裝箱和拆箱會降低程序的執(zhí)行效率。非 Java 黨就不寫太多了

Go 為什么需要泛型

官方要在 go1.18 引入泛型,那現在我們是怎么用的呢?很多時候就是 copy 代碼,或者用 interface{} 代替

func Max(a , b Comparable) Comparable

比如常見的 Max 函數,傳入參數 a, b 都實現了 Comparable 接口,然后返回最大值。能工作不?能,但是有問題

  1. 丟失了類型信息,原來 cpp/rust 的實現,在函數中操作的都是原始類型,如果用 interface 還需要斷言,這是運行時行為,性能損失很大
  2. 表達力不夠,比如 a, b 不能確保是同一個類型,可能一個是 int, 另外一個是 struct. 如果想傳入的是類型組合呢?

再看一個 interface{} 不能當成泛型的例子

func sort(arr []interface{})

這個排序函數如果傳入 sort([]int{1,2,3}) 或是 sort([]float64{1.032, 3.012}) 都會報錯,原因是什么呢???

在 go 中 []interface{} 類型是 slice 不是 interface{}, go 中對比接口相等時,是判斷 itab 中 type 和 data 需要都一致。換句話說,不允許類型的協變(沒其它語言背景的不必糾結概念,在 Go2 中也不打算支持協變和逆變)

同時社區(qū)還有其它庫輔助,比如 genny[6]betterGO[7], 本質還是上面的動圖

// NOTE: this is how easy it is to define a generic type
type Something generic.Type

// SomethingQueue is a queue of Somethings.
type SomethingQueue struct {
  items []Something
}

func NewSomethingQueue() *SomethingQueue {
  return &SomethingQueue{items: make([]Something, 0)}
}
func (q *SomethingQueue) Push(item Something) {
  q.items = append(q.items, item)
}
func (q *SomethingQueue) Pop() Something {
  item := q.items[0]
  q.items = q.items[1:]
  return item
}

上面定義了一個泛型 type Something generic.Type, 然后用 go generate 生成對應的泛型代碼

cat source.go | genny gen "Something=string"
// StringQueue is a queue of Strings.
type StringQueue struct {
  items []string
}

func NewStringQueue() *StringQueue {
  return &StringQueue{items: make([]string0)}
}
func (q *StringQueue) Push(item string) {
  q.items = append(q.items, item)
}
func (q *StringQueue) Pop() string {
  item := q.items[0]
  q.items = q.items[1:]
  return item
}

最后替換相應的類型,生成對應源碼文件,人肉模板騷不騷^^

Go2 泛型

泛型討論了很久,參見 generic programming facilities[8], Why Generics[9], Next Step[10], 以及官方 proposal[11], 這是最終版,語法上不會再改變。為了運行時性能,go 的實現類似 rust 編譯期單態(tài)化,而且為了兼容 go1 語法也會做一些妥協。如果近期想閱讀源碼的,不如等到明年 go1.18, 因為引入泛型源碼庫變更會很大

1.Multiple type parameters

// Print prints the elements of any slice.
// Print has a type parameter T and has a single (non-type)
// parameter s which is a slice of that type parameter.
func Print[T any](s []T) {
 ......
}

類型參數列表,放到中括號里 [], 其中 T 是類型,any 關鍵字是表示可以傳入任意類型。居然不是業(yè)界通用的尖括號 <> 感覺非常丑... 其中 any 其實就是 interface{} 空接口,寫起來相對方便,而且語意上表達更準確一些

// Print2 has two type parameters and two non-type parameters.
func Print2[T1T2 any](s1 []T1, s2 []T2) { ... }
// Print2Same has one type parameter and two non-type parameters.
func Print2Same[T any](s1 []T, s2 []T) { ... }

Print2 中可以傳入相同或不同的類型,比如 Print2[int, int]Print2[int, string] 都是允許的

但是 Print2Same 的參數 s1, s2 類別必然要相同,編譯期保證。這也就是上面提到 go1 時 interface{} 模擬泛型的問題

2.Constraint

func Stringify[T any](s []T) (ret []string) {
 for _, v := range s {
  ret = append(ret, v.String()) // INVALID
 }
 return ret
}

這個例子是不會編譯成功的,因為 T 是任意類型,并沒有實現 String() 方法。也就是說,泛型函數只允許調用 constraint 約束里顯示指定的方法 這樣的好處是,對于大型項目的構建,不會因為隱式的改動,而改變兼容性

相比于 rust where 語句,go 中增加了類型參數列表和接口的組合,做為約束

package constraints

// Ordered is a type constraint that matches any ordered type.
// An ordered type is one that supports the <, <=, >, and >= operators.
type Ordered interface {
 type intint8int16int32int64,
  uintuint8uint16uint32uint64uintptr,
  float32float64,
  string
}

上面是約束的定義,關鍵字 type 后面跟上允許的類型列表,不知道為啥就是丑。其它語言用到哪個類型,編譯期單態(tài)就好了,go 需要人工枚舉所有可能...

// Smallest returns the smallest element in a slice.
// It panics if the slice is empty.
func Smallest[T constraints.Ordered](s []T) T {
 r := s[0// panics if slice is empty
 for _, v := range s[1:] {
  if v < r {
   r = v
  }
 }
 return r
}

3.泛型類型

上面提到的都是 Generic Func, 另一個使用場景是泛型類型 Generic Type

// Vector is a name for a slice of any element type.
type Vector[T any] []T

上面標準的泛型容器定義,類似其它語言的 Vector

// Push adds a value to the end of a vector.
func (v *Vector[T]) Push(x T) { *v = append(*v, x) }

同樣,泛型類型還可以定義方法

// List is a linked list of values of type T.
type ListNode[T] {xxx}
type List[T] struct {
    head *ListNode[T]
    tail *ListNode[T]
    size int
}


// This type is INVALID.
type P[T1, T2 any] struct {
 F *P[T2, T1] // INVALID; must be [T1, T2]
}

上面是定義的 struct 語法,比較相似。但如果泛型類型,有指向自己的指針,那么注意參數順序也要一樣,P[T1, T2 any] 這樣寫的,那么指針也要 *[T1, T2]. 官方說防止類型實例化的遞歸

4.Comparable types in constraints

Go 不允許重載操作符,這樣好處多多。但同時代表著大于,小于這些只適用于基本類型。但也有例外 ==, != 可以比較 struct, array, interface. 官方在標準庫預定義了約束 comparable 用于比較

// Index returns the index of x in s, or -1 if not found.
func Index[T comparable](s []T, x T) int {
 for i, v := range s {
  // v and x are type T, which has the comparable
  // constraint, so we can use == here.
  if v == x {
   return i
  }
 }
 return -1
}

上面的例子很清晰明了,T 實現了比較接口,就可以用 ==

// ComparableHasher is a type constraint that matches all
// comparable types with a Hash method.
type ComparableHasher interface {
 comparable
 Hash() uintptr
}
// ImpossibleConstraint is a type constraint that no type can satisfy,
// because slice types are not comparable.
type ImpossibleConstraint interface {
 comparable
 type []int
}

用 interface 實現約束,上面的例子是 hasher 接口,下面的接口是永遠不能實現的,很好理解,類型 []int 是不能比較的

5.類型推導 type inference

類型推導很重要,可以省略很多無用代碼,編譯器自動識別類型

func Map[FT any](s []F, f func(F) T) []T { ... }

這是一個 Map 算子函數的簽名,f 匿名函數,將 []F 轉換成 []T 類型 slice

 var s []int
 f := func(i int) int64 { return int64(i) }
 var r []int64
 // Specify both type arguments explicitly.
 r = Map[intint64](s, f)
 // Specify just the first type argument, for F,
 // and let T be inferred.
 r = Map[int](s, f)
 // Don't specify any type arguments, and let both be inferred.
 r = Map(s, f)

最理想只需要調用 r=Map(s, f) 就可以,否則還要寫 r = Map[int, int64](s, f), 能推導的就不要讓人寫

除了上面的,再舉個例子比如 T1, T2 是兩個類型參數,那么 []map[int]bool 可以和以下類型統(tǒng)一 unified 起來

  • []map[int]bool 這個就是類型自身,很好理解
  • T1 當然可以匹配
  • []T1 T1 匹配到 map[int]bool
  • []map[T1]T2 這里 T1 是 int, T2 是 bool

上面只是幾種可能,但同時不能匹配到 int, struct{}, []map[T1]string 這也是顯而易見的。雖然 go2 不支持協變,但是基于類型推導還是比 go1 方便的多

6.type lists 組合

// StringableSignedInteger is a type constraint that matches any
// type that is both 1) defined as a signed integer type;
// 2) has a String method.
type StringableSignedInteger interface {
 type intint8int16int32int64
 String() string
}

約束還可以將 類型列表 與普通的接口函數組合起來。上面的 StringableSignedInteger 要求約束,必須是 type list 里的任一類型,同時實現了 String() string 函數

問題是 int 這些都沒有 string 方法,所以上面約束其實是 impossible 的,只是舉例子說明如何使用

7.未實現部份

官方還列舉了很多 omissions[12] 未實現的點

比如不支持:特化,元編程(cpp 玩爛了),curry 柯立化等等,泛型分享內容大致這些,感興趣直接看官網好了

泛型代價

引入泛型不是沒有代價的,都是取舍,好在 go 語言誕生才十年,沒有很重的歷史包袱

  • Slow Compiler: 這是 c++/rust 泛型
  • Slow Performance: 這是 java/scala 泛型
  • Slow Programmer: 這是 go1

但 go 真的需要泛型嘛?雖然 go 定位是系統(tǒng)語言,用的最多還是偏業(yè)務層,中間件以下還是 c/c++ 的舞臺,哪怕 go 己經有了殺手級應用 docker/k8s

吸引大公司選擇 go 的原因,就是簡單,快速上手,goroutine 用戶態(tài)高并發(fā)。如果 GA 后,會不會導致代碼庫里泛型使用泛濫呢?可以預見,go1.18 出來后,大家要刷新對 go 的認識了,同時對于新手學習區(qū)線也不再簡單

支持泛型也會讓 go 很好的處理數據,要是再搞個分代 GC, 是不是可以造大數據的輪子了^^

小結

引用曹大[13]的一句話:敏捷大師們其實非常雙標,他們給出的方法論也不一定靠譜,反正成功了就是大師方法得當,失敗了就是我們執(zhí)行不力沒有學到精髓。正著說反著說都有道理。

再看看現在的 Go 社區(qū),buzzwords 也很多,如果一個特性大師不想做,那就是 less is more. 如果一個特性大師想做,那就是 orthogonal, 非??陀^

寫文章不容易,如果對大家有所幫助和啟發(fā),請大家?guī)兔c擊在看點贊,分享 三連

關于 泛型 大家有什么看法,歡迎留言一起討論,大牛多留言 ^_^

參考資料

[1]

泛型程序設計: https://zh.wikipedia.org/wiki/%E6%B3%9B%E5%9E%8B%E7%BC%96%E7%A8%8B,

[2]

go2 泛型最終提案: https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md,

[3]

redis disct: https://github.com/redis/redis/blob/unstable/src/dict.h#L61,

[4]

rust where: https://rustwiki.org/zh-CN/rust-by-example/generics/where.html,

[5]

Java 不能實現真正泛型的原因是什么?: https://www.zhihu.com/question/28665443/answer/118148143,

[6]

genny: https://github.com/cheekybits/genny,

[7]

betterGO: https://github.com/PioneerIncubator/betterGo,

[8]

generic programming facilities: https://github.com/golang/go/issues/15292,

[9]

Why Generics: https://blog.golang.org/why-generics#TOC_1.,

[10]

generics-next-step: https://blog.golang.org/generics-next-step,

[11]

泛型 官方 proposal: https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md,

[12]

omissions: https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md#omissions,

[13]

why-do-we-need-generics: https://xargin.com/why-do-we-need-generics/,


瀏覽 103
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 91夜夜夜| 波多野结衣无码AV专区| 欧美亚洲天堂| 91探花视频在线观看| 蜜桃久久精品成人无码AV| 亚洲AV永久无码精品| 嫩草91| 丰满人妻一区二区三区精品高| 北京熟妇搡BBBB搡BBBB电影| 亚洲精品乱码久久久久久蜜桃欧美 | 欧美肏屄| 台湾精品一区二区三区| 超碰a片| 欲撸视频| 无码网址| 久久久久蜜桃| 91在线你懂的| 国产91www| 欧美footjob高跟脚交| 先锋影音av在线| 精品视频无码| 欧美性爱手机在线| 美日韩一区| 免费+无码+精品| 中文字幕色情| 先锋影音在线资源| 亚洲秘无码一区二区三区,| 国产99久久九九精品无码免费| 1000部毛片A片免费视频| 亚洲AV资源在线| AV热热| 激情黄色五月天| 国产高清一区二区| www.天天射| 日韩成人无码免费视频| 国产精品久久久久久久牛牛| 久久综合伊人7777777| 日韩欧美视频一区国产欧美在线| 水蜜桃视频网站| 无码一区二区三区四| 婷婷成人综合| 午夜神马影院| 成人精品一区日本无码网站suv| 97性爱视频| 天天日天天日天天日| 亚洲vs无码秘蜜桃少妇小说| 香蕉福利视频| 国产资源av| 日韩精品91| 特级西西444www精品视频| chinese搡老熟老妇人| 影音先锋三区| 蜜桃人妻| 婷婷视频导航| 免费看特别黄色视频| 亚洲中字幕新| 亚洲一级二级| 欧美一级爱爱| 亚洲黄色影院| 青青草精品| 蜜桃av色偷偷av老熟女| 91亚洲国产AⅤ精品一区二区| 国产精品成人无码专区| 91骚| 人人上人人摸| 乱伦乱码| 九色91PORNY国产| 操逼视频看看| 婷婷乱伦| 91麻豆天美传媒在线| 成人AV电影在线观看| 91av视频在线观看| 日韩免费视频在线观看| 国产午夜无码福利视频| 亚洲AV在线免费观看| 国产午夜在线| 亚洲av电影网| 999免费视频| 亚洲中文婷婷| 国产精品国产精品| 欧美久久视频| 91AV免费观看| 国产AV无码高清| 日本乱伦网| 精品人妻一区二区三区阅读全文| 日韩AV中文字幕在线播放| 骚逼日本| 国产无码操逼视频| 91免费观看网站| 久久久久久久极品内射| 国产一区二区三区四区五区六区七区 | 亚州无码一区| 九九99热| 北条麻妃在线不卡| 国产99久久九九精品无码免费| 色五月AV| 婷婷丁香一区二区三区| 久草性爱| 91精品国产乱码香蕉黄瓜草莓| 影音先锋乱伦| 51AV在线| 丰满人妻一区二区三区免费| 成人网站无码| 91干逼| 中文字幕在线中文| 国产嫩苞又嫩又紧AV在线| 欧美日韩不卡视频| 欧美伊人在线| 狠狠操免费视频| 91天堂在线| 精品蜜桃秘一区二区三区在线播放| 91超碰在线播放| 特黄AAAAAAAA片免费直播| 国产精品码一本A片| 精品亚洲一区二区三区四区五区| 尤物网站在线播放| 在线观看成人18| 成人理伦A级A片在线论坛| 国产毛片一区| 一区二区三区四区在线看| 无码内射在线播放| 国产免费高清| 在线播放无码| 国产午夜精品电影| av无码中文字幕| 无码人妻一区二区三区免费n狂飙| 88AV在线| 男人的天堂黄色| 九九热精品在线视频| 亚洲一级Av无码毛片久久精品| 午夜社区| 黄色成人在线观看| 成人网站在线| 欧美footjob| WWW.豆花视频精品| 国产理论视频在线观看| 无码人妻丰满熟妇啪啪| 欧美黄网站在线观看| 在线观看AV资源| 亚洲淫秽视频| 人妻斩り43歳| 国产免费一级片| 大黄网站在线观看| 午夜成人小电影| 韩国高清无码视频| 中文字幕在线观看亚洲| 久久久久久91香蕉国产| 中文字幕无码人妻| 国产精品久久久精品cos| 久久亚洲免费视频| 色婷婷视频在线播放| 全国最大成人网| 伊人久久久| 久热综合| 免费中文资源在线观看| 青娱乐亚洲精品视频| 国产草逼网站| 影音先锋三区| 亚洲有码中文字幕| 免费av片| 久久精品一区二区三区蜜芽的特点| 人妻无码电影推荐| 色五月婷婷中文字幕| 人人看人人摸人人操| 另类老妇性BBwBBw| 五月丁香激情六月| 亚洲一级一级黄色| 99精品视频网站| 大香蕉免费在线观看| 成年女人免费视频| 精品视频99| 久久五月婷| 亚洲性爱在线| 熟妇人妻久久中文字幕| 日B视频网站| 久久亚洲AV成人无码国产野外| 亚洲青青| 亚洲成人影片在线观看| 亚洲天堂成人网| 特级特黄AAAAAAAA片| 在线免费黄色视频| 国产性精品| 影音先锋久久久久AV综合网成人| 91丝袜在线| xxxxxbbbbb| 亚洲日韩精品在线观看| 天天肏夜夜肏| 91精品一区二区| 精品黄片| 亚洲自拍天堂| 无码人妻AV一区| 国产黄色视频免费看| 欧美激情另类| 国产人人看| 日本二区| 蜜臀99| 熟女人妻在线视频| 91熟女乱伦| www.一区| 成人爱爱视频| 一区二区在线不卡| 日韩色图在线观看| 婷婷五月成人| 99免费小视频| 黄色电影天堂| 成人视频一区二区| 欧美日韩有码视频网址大全| 激情五月天av| 人人草在线观看| 永久免费视频| 激情淫荡少妇| 五月天久久久久久久| 欧美日韩不卡视频| 国产无套视频| 女人卖婬视频播放| 欧美AAAAAAAA| 中文无码日本一级A片人| 久久中文视频| 久久精品视频久久| 久久视频在线| 久久久综合| 国产av福利| 五月天婷婷在线播放视频免费观看| 天堂网色| 色婷婷在线免费视频| 青青青在线视频| 免费观看成人片| 久久夜色精品国产噜噜亚洲AV| 影音先锋资源站| 一区二区三区四区无码| 天天射中文| 在线免费观看无码视频| 91无码电影| 69成人精品视频| 男人的天堂网页| 夜夜爽7777精品国产三级| www三级片| 九九九久久久| 正在播放李彩斐被洋老外| 中文字幕无码综合| 黄色精品网站| 欧美日韩国产一区二区| 亚洲AV无码成人精品区天堂小说| 综综综综合网| 亚洲精品一二三| 久久99热这里只频精品6学生| 亚洲AV成人片色在线观看麻豆| 啪啪视频m3u8| 日韩中文字幕无码中字字幕| 日本激情网| 秋霞精品一区二区三区| 久久精彩免费视频| 欧美一区二区在线视频| 中文字幕在线观看免费| 欧美操大逼| 在线视频99| 婷婷丁香综合| 男女操逼视频网站免费| 翔田千里一区二区三区精品播放 | 99re国产视频| 一区二区色| 操你啦日韩| 国产网站视频| 欧美疯狂做受XXXXX高潮| 日韩av在线免费观看| 亚洲视频99| 国产乱子伦-区二区三区熟睡91 | 狠狠狠久久久| 亚洲天堂在线观看免费视频| 久草久| 香蕉黄色三级片| 天天操超碰| 探花AV| 黄片www| 国产Av资源| 性爱视频免费| 久热中文| 亚洲午夜久久| 亚洲黄片免费在线观看| 国产成人片| 成人免费爱爱视频| 日本无码免费视频| 91色色| 精品人妻一区二区三区蜜桃| 国产精品色视频| 蜜桃在线视频| 国产三级性爱视频| 熟妇人妻中文AV无码| 日韩强操逼网| 一区黄片| 国产xxxx视频| 啪视频网站国产馆| 夜夜骚av.一区二区三区| 一级黄色片免费看| www.777熟女人妻| 国产黄色视频网站在线观看| 69超碰| 中文在线不卡| 午夜99| 亚洲女与黑人正在播放| 天天色粽合合合合合合合| 黄色小视频免费观看| 丁香五月激情中文字幕| 精品一区二区三区四区五区六区| 久久草视频| 日韩欧美一级A片| 成人免费视频一区二区| 黄色A级片| 操比无码| 在线免费观看黄色小视频| 米奇7777狠狠狠狠| 日本一级黄色A片| 伊人网在线视频观看| 精品久久三级片| 亚洲小电影在线| 欧美三级片网站| 波多野结衣视频免费在线观看| 好吊视频一区二区| 黄色电影A片| a三级片| 蜜臀AV在线播放| 色婷婷久久综合久色| 黄色小视频在线| 北岛玲在线视频| 91狠狠爱| 97中文字幕在线| 五月天福利导航| 第四色视频| 水蜜桃视频免费观看| 人人妻人人澡人人爽久久| 91麻豆精品无码| 国产AV毛片| 国产精品久久7777777精品无码| 日韩一区二区在线视频| 中文字幕在线观看a| 成年免费视频| 99大香蕉| 欧美日韩婷婷| 国精产品一区二区三区黑人和中国| 无码任你操| 最近中文字幕在线观看| 18毛片| 99er这里只有精品| 国内精品卡一卡二卡三| 亚洲无码一区二区在线观看| 国产精品女人精品久久久天天| 免费A在线观看| 中文最新天堂8√| 两根茎一起进去好爽A片在线观看| 成人午夜小视频| 99热自拍| 欧美中文在线观看| 午夜无码精品一区二区三区99午| 亚洲AAAAAA| 有免费的欧美操逼视频吗| 亚洲精品中文字幕成人片| 老女人操逼| 91爱在线| 久久内射| 大奶AV| 日本特级黄色毛片| 亚洲人妻在线播放| 永久免费看A人片无码精| 一级操逼毛片| 亚洲国产操逼| 日本在线视频一区二区| 欧美偷拍一区二区| 亚洲成人AV在线播放| 日本在线不卡一区| 国产精品无码成人AV在线播放| 96精品久久久久久久久久| 中文字幕无码A片| 特级西西444www高清| 嫩草国产在线| 久久成人久久| 九九色| 亚洲AV资源在线| 91久久视频| 男人午夜网站| 狠狠干网| 国产做爰XXXⅩ久久久骚妇| 97福利视频| 日本V片| 成人片天天看片欧美一级| 激情五月天导航| 久久久女女女女999久久| 蜜桃视频成人app| 无码中文综合成熟精品AV电影| 91久久国产性奴调教| 日韩精品观看| 波多野结衣无码视频在线观看| 成人做爰黄A片免费| 日韩综合在线| 日皮视频在线免费观看| 国产最新在线视频| 狠狠干干| 91探花秘入囗| 透逼视频| 国产逼逼| 免费超碰在线| 亚洲无码A区| 黄片高清无码| 4虎亚洲人成人网www| 国产丝袜在线视频| 日韩操逼图| 香蕉久久网| 美女91小视频| 天天色AV| 日本麻豆| caopro| jizz亚洲| 国产视频黄| 奇米影视av| 亚洲熟女一区| 亚洲无码。| 欧美性爱在线观看| 91热久久| 国产91小视频| 久久天堂网| 精品无码一区二区三区蜜桃李宗瑞| 天堂无线av无码av| 欧美日韩国产精品成人| WWW亚洲视频| 日韩欧美中文字幕在线观看| 免费网站观看www在线观| 国产一级a毛一级a做免费的视频l| 青青操网站| 国产精品秘精东影业| 亚洲成人精品视频| 好好日视频| 亚洲成人无码视频| 精品孕妇孕交无码专区| 九九伊人大香蕉| 欧美三级视频在线观看| 青青草成人在线观看| 看毛片视频| 日韩福利电影| 日韩高清欧美| 亚洲vs天堂vs成人vs无码| 欧美中文在线观看| 色色五月丁香| 黄色操逼网站?| 人成视频在线免费观看| 无码专区在线播放| 人操人人| 一本色道久久综合狠狠躁的推荐| 69成人精品| 99热在线免费观看| 福利三区| 一区二区三区四区无码在线| 91热| 在线观看免费无码| 久爱无码| 亚洲中文字幕在线观看| 奇米色五月| 操逼短视频| 极品美女扒开粉嫩小泬高潮一| 制服乱伦| 亚洲中文字幕有码| 成人电影aaa| 丁香成人五月天| 天堂网婷婷| 国内成人自拍| 免费日逼| 囯产精品久久久久久久久免费无码| 苍井空中文字幕在线观看| 欧美日韩免费看| 婷婷精品免费久久| 无码高清18| 成人视频网站在线观看| 免费黄片视频在线观看| 五月婷婷综合激情| 2012天天夜夜| 亚洲欧美一区二区三区在线| 黄色不卡| 天天日天天干天天爽| 伊人成人在线观看| 九九亚洲| 黄片视频在线免费看| 日本少妇高清视频| 四虎性爱| 亚洲大片免费看| 最新中文字幕无码| 日韩一级片在线观看| 超碰在线69| 蜜桃视频无码区在线观看| 国产毛片久久久久久国产毛片| 在线免费观看黄| 亚洲AV永久无码成人| 午夜视频免费在线观看| 免费在线观看AV| 国产精品一区二区性色AV| 啊啊啊啊啊在线观看| 午夜成人在线| 一本色道久久无码人妻精品69| 性爱视频亚洲| 影音av| 日韩无码流出| 在线无码视频| 97国产成人| 午夜亚洲AV永久无码精品蜜芽| 日本无码视频在线观看| 无码福利导航| 亚洲无码二区| 欧美在线视频免费观看| 刘玥精品国产一区二区三区| 2019中文字幕mv第三季歌词| 91欧美日韩| 黄片在线免费观看视频| 男人天堂综合网| 人人操人人妻人人| 4虎亚洲人成人网www| 免费看黄色视频| 亚洲精品一区二区三区新线路| 草草草视频| 亚州精品人妻一二三区| h片在线免费观看视频| 中文字幕AV免费观看| 婷婷五月AV| 日韩中文字| 色播婷婷五月天| 免费看毛片网站| 69国产成人精品二区| 猫咪视频大全视频| 亚洲精品中文字幕无码| 日本成人高清视频| 91亚洲日韩| 中文字幕一区二区蜜桃| 一级黄色视频网站| 东北老女人操逼视频| 69自拍视频| 51成人免费| 黄色日逼| 秋霞中文字幕| 色天天干| 日本乱轮视频| 午夜无码鲁丝片午夜精品| 欧美亚洲| 老妇槡BBBB槡BBBB槡| 久草视频在线免费看| 爱爱欧美| 久久肏| 午夜无码AV| 欧洲成人午夜精品无码区久久| 成人在线黄片| 亚洲A网站| 亚洲资源在线| 肏屄视频在线| 十八禁视频在线观看网站.www | 久久精品国产AV一区二区三区| 亚洲成人无码在线| 91精品国产综合久久蜜臀使用方法 | 亚洲天堂无码在线| 精品一二三| 在线观看黄A片免费网站| 在线免费观看av网站| 无套内射在线免费观看| 免费黄色大片| 色图欧美色图| 在线观看的av网站| 中文字幕第23页| 无码国精品一区二区免费蜜桃| 午夜福利干B在线免费小视频| 草视频| 久久婷婷六月综合| 亚洲在线第一页| 国产探花一区二区三区| 久久理论电影| 一区二区三区四区视频| 无码人妻一区二区一牛影视| 色色爱爱| 亚洲精品成人无码AV在线| 国产成人精品久久二区二区91| 欧美性猛交XXXX乱大交| 91性爱视频| www.91自拍| 三级片无码在线观看| 日韩一级片免费观看| 成av人片一区二区三区久久| 五月天堂婷婷| 欧美在线观看一区| 免费在线观看黄色视频网站| 亚洲精品播放| 北条麻妃中文字幕在线观看| 91性爱视频在线观看| 大香蕉久久精品| 国产女同在线观看| 日韩三级AV在线观看| 妹子干综合| 中文字幕熟女人妻| 国产操美女| 午夜激情免费| gogogo日本免费观看高清电视剧的注意 | 性爱精品视频| 日韩综合在线| 欧美一卡二卡三卡| 翔田千里AV在线| 综合国产| 午夜爽爽爽| 亚洲午夜久久久久久久久| 高潮喷水无码| gogogo免费高清在线偷拍 | 成人一级黄色电影| 大香蕉伊人影视| 亚洲性爱工厂| 久草网站| 麻豆国产视频| 狠狠干大香蕉| 国产不卡一区| 97精品在线观看| 黄片中文字幕| av在线天堂网| 日韩精品视频免费| 东北女人毛多又黑A片| 国产精品久久久久久久久久二区三区| 日韩无码成人电影| 国产一区二区三区四区视频| 中文字幕欧美在线| 18岁毛片| 欧美一级网站| 欧美成人精品在线| 日日骚av一区二区三区| 伊人操逼| 欧美性交网| 狠狠操婷婷| 日本熟妇在线| 在线观看中文字幕亚洲| 国产成人视频在线播放| 亚洲夜夜爱| 神马Aⅴ| 日韩三区| 五月丁香综合| 成人福利在线| 成人一级电影| 一区二区三区无码在线观看| 国产毛片基地| 亚洲天堂2025| 伊人综合网站| 亚洲视频免费在线播放| 午夜成人精品| HEYZO少婦AV無碼精品| 91黑人丨人妻丨国产丨| 日韩色情网| 人妻少妇偷人精品久久| av亚洲波多野结衣白嫩水多波| 国产乱子伦一区二区三区视频| www人人操| 精品无码二区| 第四色网站| 99精品视频北条麻妃国产版| 日韩精品一区二区三| 视色视频在线观看| 日本久久久久久久久视频在线观看| 中文字幕乱伦| 亚洲无码在线免费观看| 丁香激情五月天| 东京热综合网| 男女AV| 国产精品无码怀孕软件| 日本色色视频| 亚洲AV免费在线| 亚洲精品蜜桃| 婷婷五月天av| 777久久| 狠狠干在线视频| 色综合久久88色综合天天| 波多野成人无码精品69| 国产免费小视频| 欧美日韩精品久久久免费观看| 美女黄色视频网站| 福利久久| 欧美性爱免费网站| 精品成人电影| 成年人黄色网址| 91人人干| 亚洲黄色大片| 中日韩欧美一级A片免费| 91九色口爆吞精| 视频一区中文字幕| 91AV在线播放| 97精品人妻| 韩国精精品视频| 亚洲在线高清视频| 国产亚洲视频完整在线观看| 思思久久高颜值| 中文字幕观看av| 尤物Av| 人人操人人操人人操人人操人人操| 久久艹艹| 中文字幕69| 青青草视频免费在线观看| 无码精品一区二区免费| 91精品国产乱码久久| 午夜福利无码电影| 成人永久免费视频| 97国产成人| 久久婷婷五月综合伊人| 亚洲免费观看高清完整版| 日本女人牲交视频| 先锋成人AV| www.91国产| 国产XXXXX| 五月婷婷激情网| 激情婷婷五月| 俺也操| 国产777| 一道本一区二区三区免费视频| 周晓琳AV| 西西444WWW无码视频软件| 精品多人P群无码视频| 黄色国产在线| 日本A在线播放| 婷婷高清无码| 国产aa片| 久久九色| av天堂中文字幕| 久久久久网站| 久久久亚洲无码| 国产视频一区二区三区四区| 特黄特色免费大片| 国内自拍青青| 熟妇精品| 草草影院第一页YYCCC| 欧美在线视频网| 制服无码| 刘玥无码| 日韩欧美小视频| 久久综合电影| 亚洲日韩AV在线| 国产精品久久久| 在线免费看AV片| 西西西444www无码视频| 久久成人久久爱| 中文字幕在线永久| 九九热8| 人妻av中文字幕| 四川BBB搡BBB搡多人乱| 九九视频免费在线观看| 99热综合| 激情小视频国产在线播放| 色狠狠干| 日韩高清无码免费观看| 3d啪啪动漫| 日韩无码五月天| 久久午夜影院| www.超碰在线| 91久久国产综合久久| 亚州毛多色色精品| 丁香花在线高清完整版视频| 成年片免费观看网站免费观看,亚洲+欧... | 闷骚艳岳的婬乱生活视频| 亚洲AV无码成人精品区天堂小说 | 无码一区二区北条| 成人免费无码A片免费| 国产一区二区波多野结衣| 国产精品毛片视频| 欧美性性生交XXXXX无码| 人人肏人人摸| 大香伊人| 国产欧美在线综合| 亚洲欧洲视频在线观看| 日批视频免费观看| 国产乱子伦-区二区三区熟睡91| 国产精品福利小视频| 欧美性猛交XXXX乱大交蜜桃 | 一区二区三区电影网| 亚洲美女免费视频| 伊人久久大香线蕉av一区| 欧美日韩国产在线| 午夜色色影院| 躁BBB躁BBB躁BBBBBB日视频| 亚洲无码激情视频| 成人午夜黄片| 婷婷视频在线| 黄色毛片网站| 亚洲日韩中文字幕无码| 欧美午夜电影| 色婷婷在线影院| 插插插视频| 日韩性爱网| 午夜性爽视频男人的天堂| 亚洲无码另类| japanese在线观看| 国产无码中文| 51妺嘿嘿午夜福利| 一欧美日韩免费/看| 99热在线观看精品| 国产中文字幕第一页| 亚洲性爱视频| 成人特级毛片全部免费播放 | 亚洲无码影音先锋| 初学影院WWWBD英语完整版在线观看 | 大香蕉av一区二区三区在线观看| 天天日综合网| 色噜噜人妻av中文字幕| 欧美日韩一二| 欧美一级婬片免费视频黄| 黄色在线欣赏| jizz在线观看免费视频| AV色天堂| 欧美一级网站| 亚洲另类视频| 欧美九九九九| 理论在线视频| 东北老女人操逼视频| 熟女人妻人妻HD| 日韩三级AV在线观看| 7777精品伊人久久7777| 小明看台湾成人永久免费视频网站| 人人搞人人摸| 婷婷视频| 在线观看中文字幕视频| 日中国老太太B| 躁BBB躁BBB躁BBBBB乃| 超碰免费在线观看| AⅤ视频在线观看| 亚洲AV无码乱码国产精品| 欧美国产三级| 国产精品一区二区三| 欧美性久久久久| 日韩毛片一区二区| 一级片成人| 欧美成人性爱网| 老女人操逼网| 国精产品一二三区| 黄片免费视频观看| 日韩一二区| 欧一美一伦一A片| 国产乱伦AV网站| 日韩av毛片| 国产精品美女| 91嫩草久久久久久久| 欧美黄色精品| 久色网站| 久久伊人中文字幕| A片黄色视频| 日韩中文字幕免费| 影音先锋一区二区三区| 午夜神马51| 成年人免费视频在线观看| 日韩精品一区在线观看| 雾水情缘电影港片| 国产午夜成人视频| 色噜噜狠狠一区二区三区牛牛影视 | 91精品人妻少妇无码影院| 极品另类| 国产综合色婷婷精品久久| 91精品久久久久久久久久久久| 欧美色操| 女生自慰在线观看| 密臀91| 一级黄色操逼视频| 久久高清无码视频| 黄色一级在线| 日本V片| 青娱乐毛片| b逼一区| 婷婷色中文网| 亚洲无码一区二区三区| 国产大奶一区二区| 黄色A毛片| 日本高清无码视频| 久久国产精品波多野结衣AV| 青青操原| 国产伦子伦一级A片在线| 2017人人操| 特黄A级毛片| 久久久久久免费毛片精品| 五月天丁香| 国产激情123区| 韩国三级HD中文字幕的背景音乐| 欧美熟妇精品一级A片视色| 无套内射在线免费观看| 青青草原成人视频| 欧美黄色性爱| 国产一级免费| 日韩高清无码免费看| 免费黄色视频网站大全| 日韩精品无码电影| 国产XXXXX| 亚洲无吗在线视频| 国产又爽又黄免费网站在| 国产激情在线播放| 少妇熟女视频一区二区三区| 一级性爽AV毛片| 国产精品操逼视频| 亚洲精品久久久久毛片A级牛奶| 91色秘乱码一区二区| 久久性| 91大屁股| 精品成人一区二区三区| 自拍偷拍网| 大香蕉少妇| 中文字幕一区二区6页| 五月丁香六月久久| www俺来也com| 永久免费一区二区三区| 牛牛无码| 日本国产在线观看| 亚洲无码免费|