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

Golang 中 map 探究

原創(chuàng) 精選
開發(fā)
本文主要通過探究在golang 中map的數(shù)據(jù)結(jié)構(gòu)及源碼實(shí)現(xiàn)來學(xué)習(xí)和了解map的特性,共包含map的模型探究、存取、擴(kuò)容等內(nèi)容。歡迎大家共同討論。

作者|?趙燕輝

簡(jiǎn)介

本文主要通過探究在golang 中map的數(shù)據(jù)結(jié)構(gòu)及源碼實(shí)現(xiàn)來學(xué)習(xí)和了解map的特性,共包含map的模型探究、存取、擴(kuò)容等內(nèi)容。歡迎大家共同討論。

Map 的底層內(nèi)存模型

在 goland 的源碼中表示 map 的底層 struct 是 hmap,其是 hashmap 的縮寫

type hmap struct {

// map中存入元素的個(gè)數(shù), golang中調(diào)用len(map)的時(shí)候直接返回該字段
count int
// 狀態(tài)標(biāo)記位,通過與定義的枚舉值進(jìn)行&操作可以判斷當(dāng)前是否處于這種狀態(tài)
flags uint8
B uint8 // 2^B 表示bucket的數(shù)量, B 表示取hash后多少位來做bucket的分組
noverflow uint16 // overflow bucket 的數(shù)量的近似數(shù)
hash0 uint32 // hash seed (hash 種子) 一般是一個(gè)素?cái)?shù)

buckets unsafe.Pointer // 共有2^B個(gè) bucket ,但是如果沒有元素存入,這個(gè)字段可能為nil
oldbuckets unsafe.Pointer // 在擴(kuò)容期間,將舊的bucket數(shù)組放在這里, 新buckets會(huì)是這個(gè)的兩倍大
nevacuate uintptr // 表示已經(jīng)完成擴(kuò)容遷移的bucket的指針, 地址小于當(dāng)前指針的bucket已經(jīng)遷移完成

extra *mapextra // optional fields
}

B 是 buckets 數(shù)組的長(zhǎng)度的對(duì)數(shù), 即 bucket 數(shù)組的長(zhǎng)度是 2^B。bucket 的本質(zhì)上是一個(gè)指針,指向了一片內(nèi)存空間,其指向的 struct 如下所示:

// A bucket for a Go map.
type bmap struct {
tophash [bucketCnt]uint8
}

但這只是表面(src/runtime/hashmap.go)的結(jié)構(gòu),編譯期間會(huì)給它加料,動(dòng)態(tài)地創(chuàng)建一個(gè)新的結(jié)構(gòu):

type bmap struct {
topbits [8]uint8
keys [8]keytype
values [8]valuetype
pad uintptr // 內(nèi)存對(duì)齊使用,可能不需要
overflow uintptr // 當(dāng)bucket 的8個(gè)key 存滿了之后
}

bmap 就是我們常說的“桶”的底層數(shù)據(jù)結(jié)構(gòu), 一個(gè)桶中可以存放最多 8 個(gè) key/value, map 使用 hash 函數(shù) 得到 hash 值決定分配到哪個(gè)桶, 然后又會(huì)根據(jù) hash 值的高 8 位來尋找放在桶的哪個(gè)位置 具體的 map 的組成結(jié)構(gòu)如下圖所示:

圖片

Map 的存與取

在 map 中存與取本質(zhì)上都是在進(jìn)行一個(gè)工作, 那就是:

  1. 查詢當(dāng)前 k/v 應(yīng)該存儲(chǔ)的位置。
  2. 賦值/取值, 所以我們理解了 map 中 key 的定位我們就理解了存取。

底層代碼

func mapaccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool) {
// map 為空,或者元素?cái)?shù)為 0,直接返回未找到
if h == nil || h.count == 0 {
return unsafe.Pointer(&zeroVal[0]), false
}
// 不支持并發(fā)讀寫
if h.flags&hashWriting != 0 {
throw("concurrent map read and map write")
}
// 根據(jù)hash 函數(shù)算出hash值,注意key的類型不同可能使用的hash函數(shù)也不同
hash := t.hasher(key, uintptr(h.hash0))
// 如果 B = 5,那么結(jié)果用二進(jìn)制表示就是 11111 , 返回的是B位全1的值
m := bucketMask(h.B)
// 根據(jù)hash的后B位,定位在bucket數(shù)組中的位置
b := (*bmap)(unsafe.Pointer(uintptr(h.buckets) + (hash&m)*uintptr(t.bucketsize)))
// 當(dāng) h.oldbuckets 非空時(shí),說明 map 發(fā)生了擴(kuò)容
// 這時(shí)候,新的 buckets 里可能還沒有老的內(nèi)容
// 所以一定要在老的里面找,否則有可能發(fā)生“消失”的詭異現(xiàn)象
if c := h.oldbuckets; c != nil {
if !h.sameSizeGrow() {
// 說明之前只有一半的 bucket,需要除 2
m >>= 1
}
oldb := (*bmap)(unsafe.Pointer(uintptr(c) + (hash&m)*uintptr(t.bucketsize)))
if !evacuated(oldb) {
b = oldb
}
}
// tophash 取其高 8bit 的值
top := tophash(hash)
// 一個(gè) bucket 在存儲(chǔ)滿 8 個(gè)元素后,就再也放不下了,這時(shí)候會(huì)創(chuàng)建新的 bucket,掛在原來的 bucket 的 overflow 指針成員上
// 遍歷當(dāng)前bucket的所有鏈?zhǔn)絙ucket
for ; b != nil; b = b.overflow(t) {
// 在bucket的8個(gè)位置上查詢
for i := uintptr(0); i < bucketCnt; i++ {
// 如果找到了相等的 tophash,那說明就是這個(gè) bucket 了
if b.tophash[i] != top {
continue
}
// 根據(jù)內(nèi)存結(jié)構(gòu)定位key的位置
k := add(unsafe.Pointer(b), dataOffset+i*uintptr(t.keysize))
if t.indirectkey {
k = *((*unsafe.Pointer)(k))
}
// 校驗(yàn)找到的key是否匹配
if t.key.equal(key, k) {
// 定位v的位置
v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
if t.indirectvalue {
v = *((*unsafe.Pointer)(v))
}
return v, true
}
}
}

// 所有 bucket 都沒有找到,返回零值和 false
return unsafe.Pointer(&zeroVal[0]), false
}

尋址過程

圖片

圖片

Map 的擴(kuò)容

在 golang 中 map 和 slice 一樣都是在初始化時(shí)首先申請(qǐng)較小的內(nèi)存空間,在 map 的不斷存入的過程中,動(dòng)態(tài)的進(jìn)行擴(kuò)容。擴(kuò)容共有兩種,增量擴(kuò)容與等量擴(kuò)容(重新排列并分配內(nèi)存)。下面我們來了解一下擴(kuò)容的觸發(fā)方式:

  1. 負(fù)載因子超過閾值,源碼里定義的閾值是 6.5。(觸發(fā)增量擴(kuò)容)
  2. overflow 的 bucket 數(shù)量過多:當(dāng) B 小于 15,也就是 bucket 總數(shù) 2^B 小于 2^15 時(shí),如果 overflow 的 bucket 數(shù)量超過 2^B;當(dāng) B >= 15,也就是 bucket 總數(shù) 2^B 大于等于 2^15,如果 overflow 的 bucket 數(shù)量超過 2^15。(觸發(fā)等量擴(kuò)容)

第一種情況

圖片

第二種情況

圖片

Map 的有序性

先說結(jié)論,在 golang 中 map 是無序的,準(zhǔn)確的說是無法嚴(yán)格保證順序的, 從上面的源碼中我們可以知道,golang 中 map 在擴(kuò)容后,可能會(huì)將部分 key 移至新內(nèi)存,由于在擴(kuò)容搬移數(shù)據(jù)過程中,并未記錄原數(shù)據(jù)位置, 并且在 golang 的數(shù)據(jù)結(jié)構(gòu)中也并未保存數(shù)據(jù)的順序,所以那么這一部分在擴(kuò)容后實(shí)際上就已經(jīng)是無序的了。

遍歷的過程,其實(shí)就是按順序遍歷內(nèi)存地址,同時(shí)按順序遍歷內(nèi)存地址中的 key。但這時(shí)已經(jīng)是無序的了。但是如果我就一個(gè) map,我保證不會(huì)對(duì) map 進(jìn)行修改刪除等操作,那么按理說沒有擴(kuò)容就不會(huì)發(fā)生改變。但也是因?yàn)檫@樣,GO 才在源碼中 但是有一個(gè)有趣的現(xiàn)象,就算不對(duì) map 進(jìn)行插入刪除等操作致使其擴(kuò)容,其在遍歷過程中仍是無序的。

objMap := make(map[string]int)
for i := 0; i < 5; i++ {
objMap[strconv.Itoa(i)] = i
}
for i := 0 ; i < 5; i ++ {
var valStr1, valStr2 string
for k, v := range objMap {
fmt.Println(k)
fmt.Println(v)
valStr1 += k
}
for k, v := range objMap {
fmt.Println(k)
fmt.Println(v)
valStr2 += k
}
fmt.Println(valStr1 == valStr2)
if valStr1 != valStr2 {
fmt.Println("not equal")
}
}
fmt.Println("end")

?以上的運(yùn)行結(jié)果是

圖片

?不難看出,即使不對(duì) map 進(jìn)行擴(kuò)容,在多次遍歷時(shí)也是無序的,這是因?yàn)?golang 官方在設(shè)計(jì)時(shí)故意加上隨機(jī)的元素,將遍歷 map 的順序隨機(jī)化,用來防止使用者用來順序遍歷。

而這是有風(fēng)險(xiǎn)的代碼,在 GO 的嚴(yán)格語法規(guī)則下,是堅(jiān)決不提倡的。所以我們?cè)谑褂?map 時(shí)一定要記得其是無序的,不要依賴其順序。

Map 的并發(fā)

首先我們大家都知道,在 golang 中 map 并不是一個(gè)并發(fā)安全的數(shù)據(jù)結(jié)構(gòu),當(dāng)幾個(gè) goruotine 同時(shí)對(duì)一個(gè) map 進(jìn)行讀寫操作時(shí),就會(huì)出現(xiàn)并發(fā)寫問題:fatal error: concurrent map writes。但是為什么 map 是不支持并發(fā)安全的呢, 主要是因?yàn)槌杀九c效益。

官方答復(fù)原因如下:?

  • 典型使用場(chǎng)景:map 的典型使用場(chǎng)景是不需要從多個(gè) goroutine 中進(jìn)行安全訪問。
  • 非典型場(chǎng)景(需要原子操作):map 可能是一些更大的數(shù)據(jù)結(jié)構(gòu)或已經(jīng)同步的計(jì)算的一部分。

?性能場(chǎng)景考慮:若是只是為少數(shù)程序增加安全性,導(dǎo)致 map 所有的操作都要處理 mutex,將會(huì)降低大多數(shù)程序的性能。同時(shí) golang 提供了并發(fā)安全的 sync map。

, // 不支持并發(fā)讀寫
if h.flags&hashWriting != 0 {
throw("concurrent map read and map write")
}

但是我們又有疑問了,為什么 golang map 并發(fā)沖突了不拋一個(gè) error 出來,或者 panic 掉,而是要讓程序 panic,選擇讓程序 crash 崩潰掉。這里是 golang 官方出于權(quán)衡風(fēng)險(xiǎn)和 map 使用復(fù)雜度場(chǎng)景考慮的,首先 map 在官方中就明確表示不支持并發(fā)讀寫, 所以并發(fā)對(duì) map 進(jìn)行讀寫操作本身就是不正確的。

場(chǎng)景假設(shè)一:如果 map 選擇在寫入或者讀取時(shí)增加 error 返回值,會(huì)導(dǎo)致程序在使用 map 時(shí)就無法像現(xiàn)在一樣,需要額外的捕獲并判斷 err。

場(chǎng)景假設(shè)二:如果 map 選擇 panic(可被 recover),此時(shí)如果出現(xiàn)并發(fā)寫入數(shù)據(jù)的場(chǎng)景,就會(huì)導(dǎo)致走進(jìn) recover 中,如果沒有對(duì)這種場(chǎng)景進(jìn)行特殊處理,就會(huì)導(dǎo)致 map 中存在臟數(shù)據(jù),此時(shí)程序在使用 map 時(shí)就會(huì)引發(fā)不可預(yù)知的錯(cuò)誤,此時(shí)排查起來也是很難找到問題的根因的。

所以 golang 在考慮了這些場(chǎng)景后,選擇明確的拋出 crash 崩潰異常,使得風(fēng)險(xiǎn)被提前暴露。可以明確的定位到問題點(diǎn)。綜上所述我們?cè)谑褂?map 時(shí),已經(jīng)要嚴(yán)格保障其是在單線程內(nèi)使用的,如果有多線程場(chǎng)景,建議使用 sync map?

責(zé)任編輯:未麗燕 來源: 字節(jié)跳動(dòng)技術(shù)團(tuán)隊(duì)
相關(guān)推薦

2017-09-13 10:04:41

性能探究HashMap

2023-10-22 20:20:37

FiberGo

2011-03-07 13:27:13

SQLCase

2010-08-30 10:58:19

DIV CSSfloat

2017-01-04 10:18:00

React NativScrollViewAndroid

2010-11-02 13:45:52

TFS2010VS2010微軟

2010-09-08 14:00:08

marginCSS

2023-11-13 21:55:12

Go編程

2025-06-10 02:00:00

Golangmap

2010-03-19 13:17:26

Parallel

2021-02-22 11:30:07

Golang 1.16ModuleGolang

2023-01-27 23:11:25

GolangNetHttp

2022-03-07 16:30:10

數(shù)據(jù)庫ORM開發(fā)人員

2022-01-21 10:58:39

JavaScriptGolangPython

2010-08-25 14:11:01

CSSborder-top

2010-09-10 10:20:51

DIVSpan

2010-09-15 14:00:06

position屬性DIV

2009-06-29 15:18:00

JavaFX綁定

2024-12-03 08:53:46

Go語言類型

2020-10-27 18:45:45

GolangGraphQ開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产厕所精品在线观看| 亚洲第一网站免费视频| 天堂社区 天堂综合网 天堂资源最新版| 日本视频在线观看免费| 久久av资源| 欧美人与性动xxxx| 999一区二区三区| 天堂网在线观看视频| 性欧美长视频| 久久精品电影一区二区| 久久久男人的天堂| 日韩成人动漫| 亚洲精品国产第一综合99久久| 精品一区久久久| 老熟妇一区二区三区啪啪| 亚洲精品中文字幕乱码| 日韩高清中文字幕| 亚洲天堂av一区二区三区| 国产美女精品写真福利视频| 日本一二三四高清不卡| 国产精品乱码视频| 中文字幕av网站| 999亚洲国产精| 日韩在线免费视频观看| 国产 xxxx| 91麻豆精品| 色老汉av一区二区三区| 激情五月六月婷婷| av福利在线播放| 96av麻豆蜜桃一区二区| 亚洲在线www| 亚洲精品国产无码| 最新国产拍偷乱拍精品| 久久亚洲精品国产亚洲老地址| 亚洲永久精品ww.7491进入| 国产精品视频一区二区三区| 在线中文字幕一区| av7777777| 黄色小说在线播放| 亚洲色图在线播放| 伊人久久大香线蕉成人综合网| 欧美成人免费| 99久久综合国产精品| 成人在线一区二区| 亚洲天堂2021av| 国产精品久久久一区二区| 九九久久综合网站| 99成人在线观看| 欧美一级淫片| 亚洲天堂男人天堂女人天堂| 波多野结衣有码| 粉嫩的18在线观看极品精品| 欧美一区二区三区在线电影| 成人日韩在线视频| 成人交换视频| 欧美日韩精品一区二区天天拍小说 | 日韩精品一区二区三区四区| 色乱码一区二区三区在线| 欧美韩国亚洲| 欧美影院一区二区| 九色91popny| 激情久久一区二区| 欧美日韩国产一二三| 激情视频综合网| 精品无人乱码一区二区三区| 91黄色免费网站| 999在线免费视频| 福利一区视频| 欧美一区二区精美| 久久久久亚洲av成人网人人软件| 999久久久久久久久6666| 精品美女一区二区三区| 91九色蝌蚪porny| 国产一区二区在线视频你懂的| 精品成人私密视频| 亚洲人人夜夜澡人人爽| 国产精品最新| y97精品国产97久久久久久| 永久久久久久久| 激情文学一区| 欧美在线亚洲在线| 香蕉视频色在线观看| 亚洲成人激情小说| 美女福利一区二区| 欧美视频一区二| 在线观看日本www| 一区中文字幕电影| 亚洲美女在线看| 日韩在线一卡二卡| 99精品国产在热久久下载| 国产激情999| 91国产精品一区| 懂色av中文字幕一区二区三区| 国产精品日本一区二区| 男人久久精品| 久久精品五月婷婷| 男女一区二区三区| 久久最新网址| 色偷偷噜噜噜亚洲男人| 久久99久久98精品免观看软件| av成人毛片| 亚洲精品久久久久久久久| 亚洲精品国产91| 久久精品影视| **欧美日韩vr在线| 在线不卡免费视频| 成人av免费观看| 先锋影音网一区| 牛牛精品视频在线| 欧美伊人久久久久久久久影院| 三区视频在线观看| 人人精品亚洲| 免费av一区二区| www.av88| 99久久婷婷国产精品综合| 在线播放豆国产99亚洲| freexxx性亚洲精品| 欧美精选在线播放| 妺妺窝人体色WWW精品| 欧美福利在线| 国产在线观看精品| 国内在线精品| 亚瑟在线精品视频| 亚洲男人天堂2021| 精品久久影院| 日韩av免费在线看| 成人毛片在线免费观看| 成人免费小视频| 91在线视频观看免费| 欧美日韩夜夜| 久久久久国产精品免费| 伊人网中文字幕| 久久精品夜色噜噜亚洲aⅴ| 300部国产真实乱| 999色成人| 最新69国产成人精品视频免费| 六月丁香激情综合| 99在线视频精品| 国产精彩视频一区二区| 午夜视频在线观看精品中文| 中文字幕日韩精品在线| 中文字幕在线日本| 久久免费精品国产久精品久久久久| 东北少妇不带套对白| 日韩一二三区| 久久99热这里只有精品国产| 911美女片黄在线观看游戏| 国产清纯美女被跳蛋高潮一区二区久久w | 久久精品一本久久99精品| 一级黄色av片| 久久久高清一区二区三区| 国内性生活视频| 日韩高清影视在线观看| 911国产网站尤物在线观看| 亚洲精品一区二区口爆| 伊人色综合久久天天| 被黑人猛躁10次高潮视频| 欧美一区影院| 国产成人看片| 麻豆理论在线观看| 亚洲精品自产拍| 国产精品久久久久久久久久尿| 曰本女人与公拘交酡| 国产一区免费电影| 91成人综合网| 日韩大尺度在线观看| 欧美一区视频在线| 黄色片在线看| 欧美视频一区二区| 亚洲视频重口味| 国产成人免费av在线| 国产玉足脚交久久欧美| 欧美尿孔扩张虐视频| 国产精品xxx视频| 麻豆91在线| 精品免费99久久| 在线观看免费国产视频| 国产亚洲成aⅴ人片在线观看| xxxx一级片| 午夜久久黄色| 九色综合婷婷综合| 日韩制服一区| 欧美精品日韩三级| 色视频在线看| 欧美乱妇23p| 免费毛片一区二区三区| 国产网站一区二区三区| 日韩成人av免费| 亚洲国产高清视频| 欧洲一区二区在线| 国产视频网站一区二区三区| 91精品国产九九九久久久亚洲| 国产私拍精品| 日韩精品一区二区三区视频在线观看 | 久久久久国产精品人| 看看黄色一级片| 黄色在线免费观看| 久久久久免费观看| 亚洲一区二区福利视频| 激情自拍一区| 午夜精品一区二区三区四区 | 国产一区二区中文| 欧美日韩一区二区三区在线观看免 | 国产成人黄色| 亚洲一区二区三区乱码aⅴ蜜桃女| 成人观看网址| 日韩中文理论片| 天堂av手机版| 在线综合亚洲欧美在线视频| 国产九色在线播放九色| 一区在线观看视频| 风间由美一二三区av片| 国内精品伊人久久久久av影院 | 成人欧美一区二区| 国产成人福利夜色影视| 97国产精品视频人人做人人爱| 电影av在线| 亚洲另类图片色| www.久久精品.com| 欧美精品三级日韩久久| 国产成人一级片| 亚洲最色的网站| 中日韩一级黄色片| 国产视频一区不卡| 激情综合丁香五月| 国产91丝袜在线观看| 亚洲精品久久久中文字幕| 国产一区二区三区久久久久久久久 | 国产一区二区三区四区| 懂色一区二区三区av片| 亚洲黑人在线| 国产欧美韩国高清| 午夜激情成人网| 欧洲成人免费视频| heyzo在线| 欧美精品videos另类日本| 国产福利视频在线| 久久精品国产久精国产思思| 国产在线资源| 国产午夜精品全部视频播放 | 亚洲欧洲日产国码av系列天堂| 国内爆初菊对白视频| 日韩免费看网站| 国内老熟妇对白xxxxhd| 正在播放一区二区| 国产精品视频在线观看免费| 欧美日韩精品欧美日韩精品 | 91精品国产综合久久久久| 国产三级理论片| 97se亚洲国产综合自在线观| 国产精品无码专区| 91香蕉视频mp4| 日本xxx在线播放| 2020日本不卡一区二区视频| 黄色国产在线观看| 26uuu成人网一区二区三区| 亚洲av片不卡无码久久| 97久久久精品综合88久久| 亚洲中文字幕无码一区| 99精品久久久久久| 久久丫精品国产亚洲av不卡| 久久久久久久久伊人| 97在线观看免费视频| 国产精品麻豆视频| 四虎精品免费视频| 亚洲一区免费观看| 日本一区二区三区四区五区| 天天做天天摸天天爽国产一区| 国产尤物在线视频| 91久久国产最好的精华液| 日韩在线国产精品| 欧美熟妇另类久久久久久不卡 | 茄子视频成人在线| 成人全视频免费观看在线看| 成人午夜小视频| 91综合久久爱com| 六月婷婷久久| 日韩精品诱惑一区?区三区| 一区二区在线观看网站| 欧美午夜不卡| 人妻少妇被粗大爽9797pw| 日本中文字幕一区| 手机在线免费毛片| 99久久99久久精品免费观看| 少妇无套高潮一二三区| 中文字幕一区二区三区不卡| 黄色一级片在线免费观看| 午夜亚洲国产au精品一区二区| 超碰超碰超碰超碰| 制服丝袜亚洲网站| 性xxxfllreexxx少妇| 在线看福利67194| 啪啪免费视频一区| 国产成一区二区| 精品一区二区三区中文字幕在线 | 亚洲国产天堂| 国产自产精品| 日韩欧美不卡| 国产欧美日韩小视频| 奇米四色…亚洲| aaa黄色大片| 国产精品久久国产精麻豆99网站| 国产一级av毛片| 欧美色视频一区| 日韩性xxxx| 久久国产精品久久精品| 成人黄色免费短视频| 99在线高清视频在线播放| 亚洲动漫精品| 欧美乱大交xxxxx潮喷l头像| 日本特黄久久久高潮| 在线精品视频播放| 亚洲视频一区在线观看| 日韩中文字幕在线观看视频| 日韩一区二区视频在线观看| 国产黄在线观看免费观看不卡| 欧美激情性做爰免费视频| 精品乱码一区二区三区四区| 精品国产一区二区三区麻豆免费观看完整版 | 777午夜精品视频在线播放| 欧美中文在线| 国产最新精品视频| 免费观看亚洲天堂| 亚洲三级一区| 视频一区二区不卡| aaaa黄色片| 亚洲电影一区二区三区| 国产普通话bbwbbwbbw| 国产一区二区三区在线观看网站 | 欧美激情视频一区二区| 巨大黑人极品videos精品| 欧美性天天影院| 国产精品永久| 人妻在线日韩免费视频| 亚洲精品综合在线| 97超视频在线观看| 在线精品国产欧美| 国产精成人品2018| 婷婷四月色综合| 久久亚洲影院| 亚洲第一香蕉网| 欧美午夜激情视频| 亚洲色图 校园春色| 97在线免费视频| 欧美日韩导航| 国产中文字幕在线免费观看| 99久久精品免费| 日韩成人免费在线视频| 亚洲成色999久久网站| av在线小说| 久久精品国产精品国产精品污 | 中文字幕91爱爱| 色婷婷综合成人av| 视频欧美精品| 久久免费一级片| 国产成人免费在线观看| 久久精品www人人爽人人| 日韩精品一区国产麻豆| 91豆花视频在线播放| 久久久一本精品99久久精品66| av成人天堂| 最近中文字幕免费| 欧美色中文字幕| 日本www在线观看| 97se视频在线观看| 日韩亚洲国产精品| 国产一区二区三区四区五区六区| 在线观看亚洲成人| 九七久久人人| 国产精品一区免费观看| 亚洲精选久久| 天堂久久精品忘忧草| 欧美剧情片在线观看| 欧美激情成人动漫| 精品日产一区2区三区黄免费 | 午夜伦理精品一区| 日韩三级毛片| 天天干在线影院| 亚洲欧美视频在线观看视频| 成人精品在线播放| 国产精品高精视频免费| 日韩啪啪电影网| 婷婷五月精品中文字幕| 狠狠躁夜夜躁人人躁婷婷91| 国产精品一区在线看| 91老司机在线| 亚洲三级影院| 综合 欧美 亚洲日本| 精品日本一线二线三线不卡| 在线视频超级| 欧洲xxxxx| 久久蜜桃av一区精品变态类天堂| 中文字幕日产av| 亚州欧美日韩中文视频| 欧美一级精品| 免费日本黄色网址| 欧美精品第1页| 性欧美xxx69hd高清| 国产人妻互换一区二区| 久久午夜色播影院免费高清|