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

Go泛型缺陷?Go Stream是如何解決Go不支持泛型方法的問題的?

開發 前端
Go-Stream實現了 java8 stream框架常用的操作,包括 過濾(Filter),轉換一對一(Map), 轉換一對多(FlatMap),轉Map(toMap), 聚合(Reduce),數據統計(Statistic), 分組(GroupingBy)已經分組后對各組排序 等功能,基本滿足99%的開發需求。

大家好,我是Coder哥,最近在用Go語言寫項目,也在用泛型解決一些問題,但是也發現了一些問題,今天我們就來聊聊Go語言中泛型函數和泛型方法。

起因是這樣的,作為java開發,發現Go沒有類似于java8 stream一樣的流處理框架,導致有些邏輯一行能實現的卻要寫好多行來解決,剛好Go語言也出了泛型,想著用泛型來寫應該能和stream一個效果,于是就有了Go-Stream 這個項目,在寫Go Stream和用的時候發現了一個關于Golang泛型的一個很有意思的問題,想著拿出來聊一下。咱還是循序漸進的展開分析:

  1. go-stream框架的簡介
  2. 發現問題的過程。
  3. Go泛型為什么不支持泛型方法?
  4. go-stream框架是怎么解決這個問題的。

go-stream簡介

Go-Stream實現了 java8 stream框架常用的操作,包括 過濾(Filter),轉換一對一(Map), 轉換一對多(FlatMap),轉Map(toMap), 聚合(Reduce),數據統計(Statistic), 分組(GroupingBy)已經分組后對各組排序 等功能,基本滿足99%的開發需求。

【Go-Stream】用Go 泛型實現了個 Java-Stream流處理框架

Go-stream代碼地址:https://github.com/todocoder/go-stream

使用可參閱測試類:https://github.com/todocoder/go-stream/blob/master/stream/stream_test.go

require github.com/todocoder/go-stream v1.1.0

圖片圖片

發現問題

科普一下:

方法:是一個代碼塊,由與對象關聯的名稱調用。

函數:函數是按名稱調用的代碼,不需要與對象關聯。

寫完第一版,基本上能實現一堆花里胡哨的鏈式調用,看起來也很絲滑,比如我想對一個切片做一系列操作,最后得出結果,代碼如下:

func TestStream(t *testing.T) {
  items := []TestItem{
      {itemNum: 7, itemValue: "item7"},{itemNum: 6, itemValue: "item6"},
      {itemNum: 1, itemValue: "item1"},{itemNum: 2, itemValue: "item2"},
      {itemNum: 3, itemValue: "item3"},{itemNum: 4, itemValue: "item4"},
      {itemNum: 5, itemValue: "item5"},{itemNum: 5, itemValue: "item5"},
      {itemNum: 5, itemValue: "item5"},{itemNum: 8, itemValue: "item8"},
    }
    res := Of(items...).Filter(func(item TestItem) bool {
      // 過濾掉1的值
      return item.itemNum != 4
    }).Distinct(func(item TestItem) any {
      // 按itemNum 去重
      return item.itemNum
    }).Sorted(func(a, b TestItem) bool {
      // 按itemNum升序排序
      return a.itemNum < b.itemNum
    }).Skip(1).Limit(6).Reverse().ToSlice()
    fmt.Println(res)
}
  1. 使用Filter過濾掉1的值
  2. 通過Distinct對itemNum 去重(在第1步的基礎上,下面同理在上一步的基礎上)
  3. 通過Sorted 按itemNum升序排序
  4. 用Skip 從下標為1的元素開始
  5. 使用Limit截取排在前6位的元素
  6. 使用Reverse 對流中元素進行返轉操作
  7. 使用collect終止操作將最終處理后的數據收集到Slice中

看到上面的流程作為一個多年的Javer感覺如此絲滑堪稱完美,輸出的結果也是原來的類型TestItem。

但是我們用stream處理問題僅僅是因為一些簡單的單一類型的場景么,那肯定不是了,有人說我想通過這個實現一些類型轉換,或者分組,再對各個組的列表按某個字段排列,比如如下的問題:

班級有一組學號{1,2,3,....,12},對應12個人的信息在內存里面存著

type Student struct {
 Num   int
 Score int
 Age   int
 Name  string
}
studentMap := map[int]Student{
  1: {Num: 1, Name: "小明", Score: 3, Age: 26},
  2: {Num: 2, Name: "小紅", Score: 4, Age: 27},
  3: {Num: 3, Name: "小李", Score: 5, Age: 24},
  4: {Num: 4, Name: "老王", Score: 1, Age: 23},
  5: {Num: 5, Name: "小王", Score: 2, Age: 24},
  6: {Num: 6, Name: "小綠", Score: 2, Age: 24},
  7: {Num: 7, Name: "小藍", Score: 3, Age: 29},
  8: {Num: 8, Name: "小橙", Score: 3, Age: 30},
  9: {Num: 9, Name: "小黃", Score: 4, Age: 29},
  10: {Num: 10, Name: "小黑", Score: 5, Age: 15},
  11: {Num: 11, Name: "小紫", Score: 3, Age: 15},
  12: {Num: 12, Name: "小劉", Score: 2, Age: 15},
}

我想把這學號轉換成具體的**Student** 類,然后過濾掉**Score**為 1的,并且再按評分 Score分組,最后對分好后的各組按照Age 降序排列,按最初v1.0.*版本的代碼是這樣的:

// v1.0.* 的代碼這樣實現
res := Of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12).Map(func(n int) any {
  return studentMap[n]
 }).Filter(func(s any) bool {
  // 這里需要強轉
  tempS := s.(Student)
  // 過濾掉1的
  return tempS.Score != 1
 }).Collect(collectors.GroupingBy(func(t any) int {
  return t.(Student).Score
 }, func(t any) any {
  return t
 }, func(t1 []any) {
  sort.Slice(t1, func(i, j int) bool {
   return t1[i].(Student).Age < t1[j].(Student).Age
  })
 }))
 println(res)

上面這個代碼有個問題是 經過Map轉換后會丟失類型需要用 any 接收,在用的時候需要強轉成目標類型,并且最后得到res 的結果是 any類型的,用的時候也需要轉換成目標類型,這樣用起來非常麻煩,但是如果按這樣的流式處理,這個問題不能避免。因為官方明確說明,目前Go語言不支持泛型方法

如果支持泛型方法,按找目前的編譯機制,可能需要修改編譯器而且會比較復雜

為什么Go泛型不好實現泛型方法?

有興趣的可以查看官方說明:https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md#no-parameterized-methods

如果支持泛型方法,考慮下面一個例子,一共有四個package:

package p1
// S 是一個普通的struct,但是包含一個泛型方法Identity.
type S struct{}
// Identity 一個泛型方法,支持任意類型.
func (S) Identity[T any](v T) T { return v }
package p2
// HasIdentity 定義了一個接口,支持任意實現了泛型方法Identity的類型.
type HasIdentity interface {
 Identity[T any](T) T
}
package p3
import "p2"
// CheckIdentity 是一個普通函數,檢查實參是不是實現了HasIdentity接口,如果是,則調用這個接口的泛型方法Identity.
func CheckIdentity(v interface{}) {
 if vi, ok := v.(p2.HasIdentity); ok {
  if got := vi.Identity[int](0); got != 0 {
   panic(got)
  }
 }
}
package p4
import (
 "p1"
 "p3"
)
// CheckSIdentity 傳參S給CheckIdentity.
func CheckSIdentity() {
 p3.CheckIdentity(p1.S{})
}

作為一個多年用Java的人,一切看起來都沒有問題,但是問題是package p3不知道p1.S類型,整個程序中如果也沒有其它地方調用p1.S.Identity,依照現在的Go編譯器的實現,是沒有辦法為p1.S.Identity[int]生成對應的代碼的。

是的,如果go編譯器做的比較復雜,在編譯的時候這個場景是可以識別出來的,但是它需要遍歷整體的程序調用鏈以便生成全部可能的泛型方法,對編譯時間和編譯器復雜性帶來很大的調整。另外一點,如果代碼中通過反射調用的話,編譯器可能會遺漏一些泛型方法的實現,這就很要命了。

如果在運行時實現呢?就需要JIT或者反射等技術,這會造成運行時性能的下降。

很難實現啊?如果規定泛型方法不能實現接口呢?那么這類的泛型方法的存在的意義是什么呢?

所以目前沒有太好的手段去實現泛型方法,暫時擱置了。

期待后面的版本加上。

問題是發現,但是要怎么解決這個問題呢,就是我想直接輸出可用的類型,而不是any,因為它用起來實在是太麻煩了

go-stream框架是怎么處理這樣的場景的呢

之前用過python 的 groupby 和map, python是這么做的

student_group = groupby(stus, key=lambda s: s['score'])

它是把數組作為groupby的方法傳過去,后面是我們的操作,那我們是不是也可以用類似這樣的方式來實現呢?剛好Go語言支持泛型函數,就開搞,于是就有了Go-Stream v1.1.0版了,加了幾個泛型轉換函數,API如下:

轉換函數

通過這幾個函數你可以實現類型轉換,分組,flatmap 等處理。

注意:這幾個函數非常有用,也是最常用的,由于Go語言泛型的局限性,Go語言方法不支持自己獨立的泛型,所以導致用Stream中的方法轉換只能用 interface{} 代替,這樣會有個非常麻煩的問題就是,轉換后用的時候必須得強轉才能用,所以我把這些寫成轉換函數,就不會受制于類(struct) 的泛型了。

API

功能說明

Map()

類型轉換(優點:和上面的Map不一樣的是,這里轉換后可以直接使用,不需要強轉)

FlatMap()

按照條件將已有元素轉換為另一個對象類型,一對多邏輯,即原來一個元素對象可能會轉換為1個或者多個新類型的元素,返回新的stream流(優點:同Map)

GroupingBy()

對元素進行逐個遍歷,然后執行給定的處理邏輯

Collect()

將流轉換為指定的類型,通過collectors.Collector進行指定(優點:轉換后的類型可以直接使用,無需強轉)

通過這幾個函數實現上面的分組轉換功能要怎么操作呢?

V1.1.0 版本的實現

// v1.1.* 的代碼這樣實現
res := GroupingBy(Map(Of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), func(n int) Student {
  // 注意 這里的返回類型可以是目標類型了
  return studentMap[n]
 }).Filter(func(s Student) bool {
  // 這里過濾也不需要轉換類型
  // 過濾掉1的
  return s.Score != 1
 }), func(t Student) int {
   // key
  return t.Score
 }, func(t Student) Student {
    // v item
  return t
 }, func(t1 []Student) {
  // 按年齡降序排列
  sort.Slice(t1, func(i, j int) bool {
   return t1[i].Age > t1[j].Age
  })
 })
 println(res)

圖片圖片

可以看到,中間處理的時候不用轉換,結果也都是強類似的。

res 類型:map[int] []Student  返回值的類型我們可以直接用不用轉換。

雖然我們不能流式的處理不同的類型,好在用泛型函數也能解決,期待官方后續的版本支持泛型方法,stream處理列表真的非常絲滑,用過的都說好。。哈哈哈。。。

最后

作為一個Java開發,用習慣了Stream操作,在網上也沒找到合適的輕量的stream框架,也不知道后續官方是否會出,在這之前,就只能先自己實現了,后面遇到復雜的處理流程會持續的更新到上面除了除了倉庫首頁README里面的功能,還有并行流處理,數據的統計,支持各種分組,轉換等等,有興趣可以自行查看體驗測試類:stream_test

有什么問題可以在github上提issues 留言或者公號搜:todocoder,看到后第一時間回復,感謝大家的支持!

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

2021-09-29 18:17:30

Go泛型語言

2024-10-28 00:40:49

Go語法版本

2022-03-28 13:34:26

Go泛型部署泛型

2021-11-27 22:20:13

SlicesGo泛型

2023-11-03 14:02:04

Go切片泛型庫

2022-04-15 09:55:59

Go 泛型Go 程序函數

2021-12-05 23:45:23

Go泛型Maps

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2022-03-18 18:00:00

編程語言泛型支持模糊測試

2021-12-28 07:20:44

泛型Go場景

2021-12-30 18:34:29

緩存GoSinglefligh

2021-11-01 12:41:39

Go

2025-11-05 03:00:55

2022-03-29 11:48:40

Go泛型測試

2021-12-01 08:29:17

Go泛型Maps

2021-10-18 10:53:26

Go 代碼技術

2021-08-22 17:18:58

Go代碼泛型代碼

2022-07-12 06:17:43

GoogleGolang開發工作

2022-05-06 09:22:25

Go泛型

2021-12-13 08:52:42

Go 泛型
點贊
收藏

51CTO技術棧公眾號

秋霞午夜一区二区| 亚洲国产精品久久精品怡红院| 一区二区高清视频| 午夜精品久久久久久久91蜜桃| 亚洲毛片一区| 正在播放亚洲1区| 真实乱偷全部视频| 欧美影视资讯| 亚洲成人av电影在线| 日韩精品不卡| 四虎免费在线观看| 精品一区二区国语对白| 91超碰caoporn97人人| 久久一级免费视频| 性欧美lx╳lx╳| 91麻豆精品久久久久蜜臀| 成年网站在线免费观看| 在线中文字幕视频观看| 久久久精品免费免费| 国产精品三区在线| 一区二区精品视频在线观看| 欧美一级专区| 欧美精品videossex性护士| 亚洲最大成人综合网| 久久精品色播| 日韩欧美国产一区二区三区| 五月婷婷丁香色| 成人小电影网站| 午夜亚洲国产au精品一区二区| 中文字幕av日韩精品| 毛片在线免费| 99久久er热在这里只有精品66| 91久久精品国产91性色| 中文字幕精品视频在线观看| 一二三区精品| 久久久在线观看| 懂色av懂色av粉嫩av| 国产精品黑丝在线播放| 在线成人免费网站| 精品人妻互换一区二区三区| 日韩有码中文字幕在线| 欧美精品一区二区三区蜜臀| 天美一区二区三区| 免费成人毛片| 欧美主播一区二区三区| 女人另类性混交zo| 综合在线影院| 日本韩国视频一区二区| 成人久久久久久久久| 日韩影院在线| 动漫精品一区二区| jizzjizzxxxx| 新片速递亚洲合集欧美合集| 色av成人天堂桃色av| 少妇性饥渴无码a区免费| 天堂av在线| 色综合中文字幕| 一本大道熟女人妻中文字幕在线 | 中文字幕在线2018| 视频在线观看国产精品| 国产成人一区二区三区小说| 国产免费一区二区三区四区五区| 日韩国产高清影视| 国产精品色视频| 91福利在线观看视频| 激情小说亚洲一区| av在线不卡一区| 亚洲国产综合网| 波多野结衣亚洲一区| 极品校花啪啪激情久久| 日本韩国一区| 欧美—级在线免费片| 在线视频不卡一区二区| 亚洲精品天堂| 精品福利在线视频| 欧美黄色一级片视频| 欧美亚洲综合视频| 欧美一区二区三区在线观看| 97精品人妻一区二区三区蜜桃| 红杏aⅴ成人免费视频| 亚洲色图五月天| 顶级黑人搡bbw搡bbbb搡| 欧美日一区二区在线观看| 久久免费视频在线观看| 国产精品熟女视频| 国产尤物一区二区| 国产精品一区二区在线观看| 国产午夜在线观看| 亚洲乱码日产精品bd| 国产视频九色蝌蚪| 婷婷激情成人| 亚洲精品国产拍免费91在线| 国产熟女一区二区| 国精品一区二区三区| 国产91精品视频在线观看| 一区二区三区免费在线视频| 成人av网址在线观看| 午夜精品亚洲一区二区三区嫩草| 调教一区二区| 欧美视频在线一区二区三区| 日日夜夜精品视频免费观看| 久草成人在线| 欧美激情精品久久久久久变态| 亚洲av中文无码乱人伦在线视色| 国产在线精品国自产拍免费| 欧美精品一区在线| 四虎影院观看视频在线观看| 欧美最猛性xxxxx直播| 亚洲熟妇一区二区| 97精品视频| 欧美主播福利视频| 亚洲AV无码国产精品午夜字幕| 久久精品视频在线免费观看| 国产乱淫av片杨贵妃| 日韩av懂色| 亚洲日韩中文字幕| 日韩成人免费观看| 国产精品一区二区久激情瑜伽| 神马影院我不卡午夜| 91九色美女在线视频| 欧美一二三区在线观看| 亚洲ⅴ国产v天堂a无码二区| 国产视频久久| 99九九视频| 黄色网在线免费观看| 在线一区二区视频| 成年人网站免费看| 日韩视频不卡| 国产精品国产三级欧美二区| 国产精品实拍| 欧美日韩成人一区二区| 性欧美13一14内谢| 99亚洲视频| 国产伦精品一区二区三区视频免费 | 一区二区三区精品99久久| 日韩av大片在线观看| 成人涩涩免费视频| 欧洲精品在线播放| 亚洲国产欧美国产第一区| 日韩天堂在线视频| 中文字幕av片| 国产欧美1区2区3区| 久草在在线视频| 欧美男gay| 日韩av免费网站| 国产精品秘入口| 日本韩国一区二区三区视频| 国产精品20p| 石原莉奈一区二区三区在线观看| 欧美成熟毛茸茸复古| 色吧亚洲日本| 亚洲免费电影在线观看| 亚洲第一在线播放| 久久久精品黄色| av五月天在线| 日韩在线观看| 亚洲在线免费观看| 羞羞视频在线免费国产| 日韩精品中文字幕在线一区| 久久久久久久久久99| 成人h动漫精品一区二区| 丰满爆乳一区二区三区| 亚洲精品456| 国产精品第一第二| 浪潮av一区| 精品福利在线导航| 亚洲天堂av片| 中文字幕成人在线观看| 999久久久精品视频| 国产精品成人一区二区网站软件| 国产一区福利视频| 亚洲黄色网址| 色妞在线综合亚洲欧美| 国产99久一区二区三区a片| 亚洲国产精品自拍| 亚洲理论片在线观看| 精品一区二区三区在线观看| 黑人巨大国产9丨视频| 国产区精品视频在线观看豆花| 欧美专区在线播放| 国产写真视频在线观看| 亚洲精品一线二线三线无人区| 91浏览器在线观看| 国产精品麻豆网站| 少妇搡bbbb搡bbb搡打电话| 午夜在线精品偷拍| 一区二区三区日韩视频| 国产伦理久久久久久妇女| 国产z一区二区三区| av激情在线| 亚洲人成在线观| 国产成人精品a视频| 精品人伦一区二区三区蜜桃免费| 色欲狠狠躁天天躁无码中文字幕| 国产福利一区在线| 成人在线看视频| 欧美日韩a区| 日韩欧美电影一区二区| 成人春色在线观看免费网站| 国产成人中文字幕| 色婷婷视频在线观看| 国产亚洲精品久久久| 性中国古装videossex| 在线观看一区二区精品视频| 日本三级网站在线观看| 国产精品理论片在线观看| 熟女人妻在线视频| 丰满亚洲少妇av| 日韩精品视频一二三| 亚洲一区网站| 18禁裸男晨勃露j毛免费观看| 欧美高清视频在线观看mv| 国产亚洲情侣一区二区无| **精品中文字幕一区二区三区| 欧美一级在线亚洲天堂| 手机在线免费av| 久久精品视频在线| 成人免费黄色网页| 亚洲精品自拍偷拍| 亚洲精品久久久久久动漫器材一区| 欧美亚洲一区三区| 亚洲日本视频在线观看| 亚洲国产中文字幕| 男人av资源站| 一色屋精品亚洲香蕉网站| 亚洲综合网在线观看| 99re热视频这里只精品| 在线观看一区二区三区四区| 国精产品一区一区三区mba桃花| 97公开免费视频| 三级久久三级久久久| 激情网站五月天| 三级亚洲高清视频| 一本色道无码道dvd在线观看| 亚洲深夜福利| 欧美色图色综合| 国产精品久久久久毛片大屁完整版| 男女激情免费视频| 欧美私人啪啪vps| 日本黄网站色大片免费观看| 欧美国产激情| 小泽玛利亚av在线| 欧美日韩1区| 高清欧美精品xxxxx| 在线精品一区| 怡红院av亚洲一区二区三区h| 亚洲激情自拍| av免费播放网址| 久久欧美肥婆一二区| 久章草在线视频| 日本午夜一本久久久综合| 亚洲免费av一区二区三区| 三级不卡在线观看| 99国产精品久久久久久| 国模无码大尺度一区二区三区| 尤物网站在线看| 成人蜜臀av电影| 欧美bbbbb性bbbbb视频| 国产网站一区二区| 99久久久无码国产精品不卡| 国产精品国产三级国产aⅴ入口| 夫妻性生活毛片| 亚洲一区二区高清| 日本三级一区二区| 在线观看免费一区| 91在线你懂的| 亚洲精品一区二区精华| 欧美zozo| 精品国模在线视频| 国产盗摄在线视频网站| 欧洲日韩成人av| aa亚洲一区一区三区| 国产在线精品一区二区三区| 波多野结衣在线观看一区二区| 超碰成人在线免费观看| 亚洲午夜一区| 国产成人精品视频ⅴa片软件竹菊| 麻豆精品新av中文字幕| 免费观看污网站| 国产清纯白嫩初高生在线观看91 | 久久久久久穴| 欧美xxxxxbbbbb| 91毛片在线观看| www.xxxx日本| 欧美午夜激情在线| 国产视频手机在线| 亚洲精品一区二区三区婷婷月 | 日韩mv欧美mv国产网站| 亚洲高清视频一区| 亚洲无线一线二线三线区别av| 国产偷人视频免费| 国产精品一区二区久激情瑜伽 | 国产成人精品视频在线观看| 精品国模一区二区三区欧美 | 成人黄色在线观看| 日本一区福利在线| 国产卡一卡二在线| 久久精品天堂| www.四虎精品| 综合久久综合久久| 潘金莲一级淫片aaaaaa播放| 精品欧美久久久| 北岛玲日韩精品一区二区三区| 久久久免费精品视频| 狂野欧美性猛交xxxx| 久久久亚洲综合网站| 午夜精品久久| 国产精品久久a| 91色视频在线| 日本熟妇毛耸耸xxxxxx| 4438x成人网最大色成网站| 免费黄网站在线观看| 久久久之久亚州精品露出| 美女久久久久久| 日韩精品av一区二区三区| 亚洲九九精品| 五月天丁香社区| 亚洲欧美在线aaa| 中文字幕一区二区三区波野结| 亚洲欧美日本精品| 蜜桃在线视频| 国产欧美韩日| 亚洲黄色一区| www.啪啪.com| 亚洲午夜一区二区三区| 99久久精品国产成人一区二区 | 欧洲亚洲一区二区| 99视频一区| 欧产日产国产精品98| 亚洲午夜免费福利视频| 精品人妻伦一区二区三区久久 | 午夜精品一区二区三区在线观看| 老鸭窝91久久精品色噜噜导演| 精品国产av色一区二区深夜久久| 亚洲国产精品一区二区久久恐怖片| 99久久久无码国产精品免费| 久久精品这里热有精品| 免费视频观看成人| 伊人久久大香线蕉av一区| 蜜臀av性久久久久蜜臀aⅴ| 黄大色黄女片18免费| 欧美性猛交一区二区三区精品| 国产在线视频网址| 国产精品久久久久久久电影| 国产一区二区三区日韩精品| 国产精品igao| 中文字幕一区二区在线播放| 国产精品久久久国产盗摄| 久久天天躁狠狠躁夜夜爽蜜月| 激情欧美一区二区三区黑长吊| 亚洲精品在线视频观看| 精品一区二区免费| 日韩影院一区二区| 精品免费日韩av| av午夜在线观看| 久久久久久高清| 日韩精品高清不卡| 欧美88888| 日韩一区二区三区视频在线 | 国产在线91| 成人福利网站在线观看11| 欧美在线免费| 欧美一级片黄色| 色噜噜狠狠成人中文综合| 97电影在线| 91蜜桃网站免费观看| 在线高清一区| 国产免费一区二区三区网站免费| 欧美综合久久久| 欧洲在线视频| 欧美在线3区| 韩国三级中文字幕hd久久精品| 麻豆疯狂做受xxxx高潮视频| 日韩激情视频在线播放| 狂野欧美性猛交xxxx| 精品无码一区二区三区爱欲| 国产欧美日韩亚州综合 | 中文字幕在线中文| 97久久精品人人做人人爽50路| 在线观看国产区| 欧美高清自拍一区| 伊人久久大香线蕉av不卡| 日韩欧美理论片| 欧美日韩精品二区| 麻豆视频免费在线观看| 国产原创精品| 九九久久精品视频| 日韩特级黄色片| 久久亚洲精品毛片| 中文有码一区| 亚洲三级在线视频| 色av综合在线| www欧美xxxx| 亚洲最大免费| 2022国产精品视频| 成人av手机在线| 国产在线观看91精品一区| 99成人在线| 久热这里有精品| 最近2019年中文视频免费在线观看 |