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

一篇明白內(nèi)存中的接口類型

存儲 存儲軟件
抽象來講,接口,是一種約定,是一種約束,是一種協(xié)議。在Go語言中,接口是一種語法類型,用來定義一種編程規(guī)范。

[[432274]]

前言

抽象來講,接口,是一種約定,是一種約束,是一種協(xié)議。

在Go語言中,接口是一種語法類型,用來定義一種編程規(guī)范。

在Go語言中,接口主要有兩類:

沒有方法定義的空接口

有方法定義的非空接口

之前,有兩篇圖文詳細(xì)介紹了空接口對象及其類型:

  • 【Go】內(nèi)存中的空接口
  • 【Go】再談空接口

本文將深入探究包含方法的非空接口,以下簡稱接口。

環(huán)境

  1. OS : Ubuntu 20.04.2 LTS; x86_64 
  2. Go : go version go1.16.2 linux/amd64 

聲明

操作系統(tǒng)、處理器架構(gòu)、Go版本不同,均有可能造成相同的源碼編譯后運(yùn)行時的寄存器值、內(nèi)存地址、數(shù)據(jù)結(jié)構(gòu)等存在差異。

本文僅包含 64 位系統(tǒng)架構(gòu)下的 64 位可執(zhí)行程序的研究分析。

本文僅保證學(xué)習(xí)過程中的分析數(shù)據(jù)在當(dāng)前環(huán)境下的準(zhǔn)確有效性。

代碼清單

  1. // interface_in_memory.go 
  2. package main 
  3.  
  4. import "fmt" 
  5. import "reflect" 
  6. import "strconv" 
  7.  
  8. type foo interface { 
  9.   fmt.Stringer 
  10.   Foo() 
  11.   ree() 
  12.  
  13. type fooImpl int 
  14.  
  15. //go:noinline 
  16. func (i fooImpl) Foo() { 
  17.   println("hello foo"
  18.  
  19. //go:noinline 
  20. func (i fooImpl) ree() { 
  21.   println("hello ree"
  22.  
  23. //go:noinline 
  24. func (i fooImpl) String() string { 
  25.   return strconv.Itoa(int(i)) 
  26.  
  27. func main() { 
  28.   impl := fooImpl(123) 
  29.   impl.Foo() 
  30.   impl.ree() 
  31.   fmt.Println(impl.String()) 
  32.   typeOf(impl) 
  33.   exec(impl) 
  34.  
  35. //go:noinline 
  36. func exec(foo foo) { 
  37.   foo.Foo() 
  38.   foo.ree() 
  39.   fmt.Println(foo.String()) 
  40.   typeOf(foo) 
  41.   fmt.Printf("exec 參數(shù)類型地址:%p\n", reflect.TypeOf(exec).In(0)) 
  42.  
  43. //go:noinline 
  44. func typeOf(i interface{}) { 
  45.   v := reflect.ValueOf(i) 
  46.   t := v.Type() 
  47.   fmt.Printf("類型:%s\n", t.String()) 
  48.   fmt.Printf("地址:%p\n", t) 
  49.   fmt.Printf("值  :%d\n", v.Int()) 
  50.   fmt.Println() 

以上代碼,定義了一個包含3個方法的接口類型foo,還定義了一個fooImpl類型。在語法上,我們稱fooImpl類型實(shí)現(xiàn)了foo接口。

運(yùn)行結(jié)果

程序結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)介紹

接口數(shù)據(jù)類型的結(jié)構(gòu)定義在reflect/type.go源文件中,如下所示:

  1. // 表示一個接口方法 
  2. type imethod struct { 
  3.   name nameOff // 方法名稱相對程序 .rodata 節(jié)的偏移量 
  4.   typ  typeOff // 方法類型相對程序 .rodata 節(jié)的偏移量 
  5.  
  6. // 表示一個接口數(shù)據(jù)類型 
  7. type interfaceType struct { 
  8.   rtype             // 基礎(chǔ)信息 
  9.   pkgPath name      // 包路徑信息 
  10.   methods []imethod // 接口方法 

其實(shí)這只是一個表象,完整的接口數(shù)據(jù)類型結(jié)構(gòu)如下偽代碼所示:

  1. // 表示一個接口類型 
  2. type interfaceType struct { 
  3.   rtype             // 基礎(chǔ)信息 
  4.   pkgPath name      // 包路徑信息 
  5.   methods []imethod // 接口方法的 slice,實(shí)際指向 array 字段 
  6.   u uncommonType    // 占位 
  7.   array [len(methods)]imethod // 實(shí)際的接口方法數(shù)據(jù) 

完整的結(jié)構(gòu)分布圖如下:

另外兩個需要了解的結(jié)構(gòu)體,之前文章已經(jīng)多次介紹過,也在reflect/type.go源文件中,定義如下:

  1. type uncommonType struct { 
  2.     pkgPath nameOff  // 包路徑名稱偏移量 
  3.     mcount  uint16   // 方法的數(shù)量 
  4.     xcount  uint16   // 公共導(dǎo)出方法的數(shù)量 
  5.     moff    uint32   // [mcount]method 相對本對象起始地址的偏移量 
  6.     _       uint32   // unused 

reflect.uncommonType結(jié)構(gòu)體用于描述一個數(shù)據(jù)類型的包名和方法信息。對于接口類型,意義不是很大。

  1. // 非接口類型的方法 
  2. type method struct { 
  3.     name nameOff // 方法名稱偏移量 
  4.     mtyp typeOff // 方法類型偏移量 
  5.     ifn  textOff // 通過接口調(diào)用時的地址偏移量;接口類型本文不介紹 
  6.     tfn  textOff // 直接類型調(diào)用時的地址偏移量 

reflect.method結(jié)構(gòu)體用于描述一個非接口類型的方法,它是一個壓縮格式的結(jié)構(gòu),每個字段的值都是一個相對偏移量。

  1. type nameOff int32 // offset to a name 
  2. type typeOff int32 // offset to an *rtype 
  3. type textOff int32 // offset from top of text section 
  • nameOff 是相對程序 .rodata 節(jié)起始地址的偏移量。
  • typeOff 是相對程序 .rodata 節(jié)起始地址的偏移量。
  • textOff 是相對程序 .text 節(jié)起始地址的偏移量。

接口實(shí)現(xiàn)類型

從以上“運(yùn)行結(jié)果”可以看到,fooImpl的類型信息位于0x4a9be0內(nèi)存地址處。

關(guān)于fooImpl類型,【Go】再談?wù)麛?shù)類型一文曾進(jìn)行過非常詳細(xì)的介紹,此處僅分析其方法相關(guān)內(nèi)容。

查看fooImpl類型的內(nèi)存數(shù)據(jù)如下:

繪制成圖表如下:

fooImpl類型有3個方法,我們以Foo方法來說明接口相關(guān)的底層原理。

Foo方法的相關(guān)數(shù)據(jù)如下:

  1. var Foo = reflect.method { 
  2.   name: 0x00000172, // 方法名稱相對程序 `.rodata` 節(jié)起始地址的偏移量 
  3.   mtyp: 0x00009960, // 方法類型相對程序 `.rodata` 節(jié)起始地址的偏移量 
  4.   ifn:  0x000989a0, // 接口調(diào)用的指令相對程序 `.text` 節(jié)起始地址的偏移量 
  5.   tfn:  0x00098160, // 正常調(diào)用的指令相對程序 `.text` 節(jié)起始地址的偏移量 

方法名稱

method.name用于定位方法的名稱,即一個reflect.name對象。

Foo方法的reflect.name對象位于 0x49a172(0x00000172 + 0x49a000)地址處,毫無疑問,解析結(jié)果是Foo。

  1. (gdb) p /x 0x00000172 + 0x49a000 
  2. $3 = 0x49a172 
  3. (gdb) x /3bd 0x49a172 
  4. 0x49a172:  1  0  3 
  5. (gdb) x /3c 0x49a172 + 3 
  6. 0x49a175:  70 'F'  111 'o'  111 'o' 
  7. (gdb) 

方法類型

method.mtyp用于定位方法的數(shù)據(jù)類型,即一個reflect.funcType對象。

Foo方法的reflect.funcType對象,其位于0x4a3960(0x00009960 + 0x49a000)地址處。

Foo方法的數(shù)據(jù)類型的字符串表示形式是func()。

  1. (gdb) x /56bx 0x4a3960 
  2. 0x4a3960:  0x08  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
  3. 0x4a3968:  0x08  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
  4. 0x4a3970:  0xf6  0xbc  0x82  0xf6  0x02  0x08  0x08  0x33 
  5. 0x4a3978:  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
  6. 0x4a3980:  0xa0  0x4a  0x4c  0x00  0x00  0x00  0x00  0x00 
  7. 0x4a3988:  0x34  0x11  0x00  0x00  0x00  0x00  0x00  0x00 
  8. 0x4a3990:  0x00  0x00  0x00  0x00  0x00  0x00  0x00  0x00 
  9. (gdb) x /wx 0x4a3988 
  10. 0x4a3988:  0x00001134 
  11. (gdb) x /s 0x00001134 + 0x49a000 + 3 
  12. 0x49b137:  "*func()" 
  13. (gdb) 

想要深入了解函數(shù)類型,請閱讀【Go】內(nèi)存中的函數(shù)。

接口方法

method.ifn字段的英文注釋為function used in interface call,即調(diào)用接口方法時使用的函數(shù)。

在本例中,就是通過foo接口調(diào)用fooImpl類型的Foo函數(shù)時需要執(zhí)行的指令集合。

具體來講就是,代碼清單中的exec函數(shù)內(nèi)調(diào)用Foo方法需要執(zhí)行的指令集合。

Foo函數(shù)的method.ifn = 0x000989a0,計(jì)算出其指令集合位于地址0x4999a0(0x000989a0 + 0x401000)處。

通過內(nèi)存數(shù)據(jù)可以清楚地看到,接口方法的符號是main.(*fooImpl).Foo。該函數(shù)主要做了兩件事:

檢查panic

在0x4999d7地址處調(diào)用另一個函數(shù)main.fooImpl.Foo。

類型方法

method.tfn字段的英文注釋為function used for normal method call,即正常方法調(diào)用時使用的函數(shù)。

在本例中,就是通過fooImpl類型的對象調(diào)用Foo函數(shù)時需要執(zhí)行的指令集合。

具體來講就是,代碼清單中的main函數(shù)內(nèi)調(diào)用Foo方法需要執(zhí)行的指令集合。

Foo函數(shù)的method.tfn = 0x00098160,計(jì)算出其指令集合位于地址0x499160(0x00098160 + 0x401000)處。

通過內(nèi)存數(shù)據(jù)可以清楚地看到,類型方法的符號是main.fooImpl.Foo。

調(diào)用堆棧

通過上述分析,已經(jīng)能夠?qū)ethod.ifn和method.tfn兩個字段的含義建立起基本的認(rèn)知。

實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。能動手盡量別吵吵。

在main.(*fooImpl).Foo和main.fooImpl.Foo兩個函數(shù)的入口處設(shè)置斷點(diǎn),通過行動鞏固我們對接口類型的認(rèn)識。

通過動態(tài)調(diào)試,我們清晰地看到:

  • main函數(shù)調(diào)用了main.fooImpl.Foo函數(shù)
  • exec函數(shù)調(diào)用了main.(*fooImpl).Foo函數(shù)
  • main.(*fooImpl).Foo函數(shù)調(diào)用了main.fooImpl.Foo函數(shù)
  • main.(*fooImpl).Foo函數(shù)的調(diào)試信息顯示autogenerated,表示其是由編譯器生成的

對比本文“代碼清單”,你是否對Go語言的方法調(diào)用有了全新的認(rèn)識。

幾乎每種編程語言都會存在編譯器自動生成代碼的情況,用來實(shí)現(xiàn)某些通用邏輯的處理。本例中自動生成的main.(*fooImpl).Foo函數(shù)中增加了panic檢查邏輯,不過, 乍看起來這像是某種設(shè)計(jì)缺陷導(dǎo)致不能直接調(diào)用main.fooImpl.Foo函數(shù),而是必須經(jīng)過一個"中間人"才行。

接口類型

從以上“運(yùn)行結(jié)果”可以看到,exec函數(shù)的參數(shù)類型的地址是0x4aa5c0,也就是foo接口的類型信息存儲位置。查看類型數(shù)據(jù)如下:

將以上內(nèi)存數(shù)據(jù)繪制成圖表如下:

  • rtype.size = 16
  • rtype.ptrdata = 16
  • rtype.hash = 0x187f135e
  • rtype.tflag = 0xf = reflect.tflagUncommon | reflect.tflagExtraStar | reflect.tflagNamed
  • rtype.align = 8
  • rtype.fieldAlign = 8
  • rtype.kind = 0x14 = 20 = reflect.Interface
  • rtype.equal = 0x4c4d38 -> runtime.interequal
  • rtype.str = 0x000003e3 -> *main.foo
  • rtype.ptrToThis = 0x00006a20 -> *foo
  • interfaceType.pkgPath = 0x49a34c -> main
  • interfaceType.methods.Data = 0x4aa620
  • interfaceType.methods.Len = 3
  • interfaceType.methods.Cap = 3
  • uncommonType.pkgPath = 0x0000034c
  • uncommonType.mcount = 0
  • uncommonType.xcount = 0
  • uncommonType.moff = 0x28
  • interfaceType.methods[0].name = 0x00000172 -> Foo
  • interfaceType.methods[0].typ = 0x00009960 -> func()
  • interfaceType.methods[1].name = 0x00000d7a -> String
  • interfaceType.methods[1].typ = 0x0000a140 -> func() string
  • interfaceType.methods[2].name = 0x000002ce -> ree
  • interfaceType.methods[2].typ = 0x00009960 -> func()

對象大小

接口類型的對象大小(rtype.size)是16字節(jié),指針數(shù)據(jù)(rtype.ptrdata)占16字節(jié);也就是說,接口類型的對象由2個指針組成,與空接口(interface{})對象大小一樣。

比較函數(shù)

內(nèi)存數(shù)據(jù)顯示,接口類型的對象使用runtime.interequal進(jìn)行相等性比較,該函數(shù)定義在runtime/alg.go源文件中:

  1. func interequal(p, q unsafe.Pointer) bool { 
  2.   x := *(*iface)(p) 
  3.   y := *(*iface)(q) 
  4.   return x.tab == y.tab && ifaceeq(x.tab, x.data, y.data) 
  5.  
  6. func ifaceeq(tab *itab, x, y unsafe.Pointer) bool { 
  7.   if tab == nil { 
  8.     return true 
  9.   } 
  10.   t := tab._type 
  11.   eq := t.equal 
  12.   if eq == nil { 
  13.     panic(errorString("comparing uncomparable type " + t.string())) 
  14.   } 
  15.   if isDirectIface(t) { 
  16.     // See comment in efaceeq. 
  17.     return x == y 
  18.   } 
  19.   return eq(x, y) 

該函數(shù)的執(zhí)行邏輯是:

  1. 接口類型不同返回 false
  2. 接口類型為空返回 true
  3. 實(shí)現(xiàn)類型不可比較立即 panic
  4. 比較兩個實(shí)現(xiàn)類型的對象并返回結(jié)果

uncommonType

在接口類型數(shù)據(jù)中,包路徑信息可以通過interfaceType.pkgPath字段獲取,方法信息通過interfaceType.methods字段獲取, 因此uncommonType數(shù)據(jù)幾乎沒什么意義,只不過保持一致性罷了。

在本例中,可執(zhí)行程序.rodata節(jié)的起始地址是0x49a000, interfaceType.pkgPath=uncommonType.pkgPath+0x49a000。

接口方法

接口方法(reflect.imethod)只有名稱和類型信息,沒有可執(zhí)行指令,所以相對普通方法(reflect.method)缺少兩個字段。

foo接口的方法的名稱和類型,與fooImpl類型的方法的名稱和類型完全一致,此處不再贅述。如有需要請閱讀上文中方法相關(guān)的內(nèi)容。

接口對象

runtime.interequal函數(shù)源碼清晰地顯示,其比較的是兩個runtime.iface對象。

runtime.iface結(jié)構(gòu)體定義在runtime/runtime2.go源碼文件中,包含兩個指針字段,大小是16個字節(jié)(rtype.size)。

  1. type iface struct { 
  2.   tab  *itab 
  3.   data unsafe.Pointer 
  4.  
  5. type itab struct { 
  6.   inter *interfacetype // 接口類型 
  7.   _type *_type         // 具體實(shí)現(xiàn)類型 
  8.   hash  uint32 // copy of _type.hash. Used for type switches. 
  9.   _     [4]byte 
  10.   fun   [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter. 

該結(jié)構(gòu)體與reflect/value.go源文件中定義的nonEmptyInterface結(jié)構(gòu)體是等價的:

  1. type nonEmptyInterface struct { 
  2.   itab *struct { 
  3.     ityp *rtype // 接口類型 
  4.     typ  *rtype // 具體實(shí)現(xiàn)類型 
  5.     hash uint32 // 實(shí)現(xiàn)類型哈希種子 
  6.     _    [4]byte // 內(nèi)存對齊 
  7.     fun  [100000]unsafe.Pointer // 方法數(shù)組,編譯器控制數(shù)組長度 
  8.   } 
  9.   word unsafe.Pointer // 具體實(shí)現(xiàn)類型對象 

沒錯,接口對象就是iface對象,接口對象就是nonEmptyInterface對象。

源碼清單中的exec函數(shù)接受一個foo接口類型的參數(shù),在該函數(shù)入口處設(shè)置斷點(diǎn),即可查看其參數(shù):

內(nèi)存數(shù)據(jù)顯示,exec函數(shù)的參數(shù)foo的值如下偽代碼所示:

  1. foo := runtime.iface { 
  2.   tab:  0x4dcbb8, 
  3.   data: 0x543ad8, // 指向整數(shù) 123 

iface.data指針指向的內(nèi)存數(shù)據(jù)是整數(shù)123,關(guān)于整數(shù)和runtime.staticuint64s,請閱讀【Go】內(nèi)存中的整數(shù)。

iface.tab指針指向一個全局符號go.itab.main.fooImpl,main.foo。該符號可以被視為一個全局常量,它是由Go編譯器生成的,保存在可執(zhí)行程序的.rodata節(jié),其值如下偽代碼所示:

  1. go.itab.main.fooImpl,main.foo = & runtime.itab { 
  2.     inter: 0x4aa5c0,    // foo 接口類型的地址,上文已經(jīng)詳細(xì)分析 
  3.     _type: 0x4a9be0,    // fooImpl 實(shí)現(xiàn)類型的地址,上文已經(jīng)詳細(xì)分析 
  4.     hash:  0xb597252a,  // fooImpl 類型的哈希種子拷貝 
  5.     fun:   [0x4999a0, 0x499a20, 0x499aa0] // 方法數(shù)組 

在本例中,runtime.iface.tab.fun字段值包含三個指針,分別指向以下三個函數(shù):

  • main.(*fooImpl).Foo (0x4999a0)
  • main.(*fooImpl).String (0x499a20)
  • main.(*fooImpl).ree (0x499aa0)

當(dāng)exec函數(shù)調(diào)用foo接口的方法時,實(shí)際是從runtime.iface.tab.fun字段的數(shù)組中獲得方法地址;

所以,在本例中,exec`函數(shù)只能尋址以上三個方法,而無法尋址以下三個方法:

  • main.fooImpl.Foo
  • main.fooImpl.String
  • main.fooImpl.ree

如果定義新的類型實(shí)現(xiàn)了foo接口,作為參數(shù)傳遞給exec函數(shù),Go編譯器就會生成新的runtime.itab對象,并命名為go.itab.${pkg}.${type},main.foo格式,也是以相同的方式進(jìn)行調(diào)用和執(zhí)行。

在Go語言中,接口方法的調(diào)用邏輯是一致的。

接口擴(kuò)展(繼承)

在源碼清單中,foo接口繼承了fmt.Stringer接口,并擴(kuò)展了兩個方法。

  1. type foo interface { 
  2.   fmt.Stringer 
  3.   Foo() 
  4.   ree() 

而在程序運(yùn)行時的內(nèi)存數(shù)據(jù)中,在動態(tài)調(diào)試過程中,根本就沒有fmt.Stringer接口什么事,連根毛都沒看見。

實(shí)際上,Go編譯器把foo接口的定義調(diào)整為以下代碼,這就是接口繼承和擴(kuò)展的本質(zhì)。

  1. type foo interface { 
  2.   String() string 
  3.   Foo() 
  4.   ree() 

總結(jié)

本文完整地、詳細(xì)地、深入地剖析了Go語言接口的類型結(jié)構(gòu)、對象結(jié)構(gòu)、實(shí)現(xiàn)類型、方法調(diào)用、繼承擴(kuò)展等等的各個方面的底層原理。

相信這是對Go接口類型的一次重新認(rèn)識。

 

責(zé)任編輯:武曉燕 來源: Golang In Memory
相關(guān)推薦

2021-10-31 15:46:34

Go語言進(jìn)程

2024-08-07 09:02:51

2021-08-12 14:19:14

Slice數(shù)組類型內(nèi)存

2023-11-28 08:29:31

Rust內(nèi)存布局

2023-04-06 08:37:24

2024-03-27 18:22:58

Hadoop部件生態(tài)

2023-02-10 09:43:51

架構(gòu)開發(fā)

2022-07-27 07:45:53

二叉樹鏡像函數(shù)

2023-12-11 18:23:21

2010-03-22 10:56:26

各種交換機(jī)

2021-02-15 13:38:38

多線程異步模型

2025-05-13 01:10:00

數(shù)據(jù)產(chǎn)品開發(fā)

2022-10-08 07:17:14

架構(gòu)

2022-07-21 07:07:40

大數(shù)據(jù)技術(shù)

2023-06-01 21:50:53

Doris數(shù)倉SQL

2015-07-15 17:09:48

HiveHadoop分布式文件系統(tǒng)

2020-09-17 11:19:39

Linux 系統(tǒng) 數(shù)據(jù)

2021-12-09 07:13:25

C#集合類型

2021-05-08 07:14:38

MySQL數(shù)據(jù)庫安全性

2019-07-09 14:17:28

Linux內(nèi)存管理進(jìn)程
點(diǎn)贊
收藏

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

欧美日韩午夜视频| 伊人成色综合网| jlzzjlzz亚洲女人18| 国产中文在线播放| 99久久久国产精品免费蜜臀| 欧美亚洲国产日韩2020| 欧美亚洲色综久久精品国产| 视频精品一区| 色素色在线综合| 熟女熟妇伦久久影院毛片一区二区| 精品人妻av一区二区三区| 99热精品在线观看| 日韩有码片在线观看| www.啪啪.com| 丝袜中文在线| 久久精品综合网| 99久久自偷自偷国产精品不卡| 欧美a∨亚洲欧美亚洲| 久久亚洲精品中文字幕蜜潮电影| 欧美mv日韩mv国产网站app| 18岁视频在线观看| 亚洲丝袜一区| 国产精品久久久久aaaa| 国产在线播放一区二区| 在线免费观看一区二区| 一道本一区二区| 久久久国产精品亚洲一区| 51调教丨国产调教视频| 欧美国产中文高清| 91国偷自产一区二区三区成为亚洲经典| 日本高清视频免费在线观看| 国产系列在线观看| 99视频精品全部免费在线| 亚洲精品女av网站| 国产一级片免费在线观看| 亚洲影院天堂中文av色| 欧美一区二区在线视频| 黄色一级二级三级| 蜜桃视频m3u8在线观看| 一级日本不卡的影视| 一级特黄录像免费播放全99| 可以免费看污视频的网站在线| 国产a精品视频| 成人综合网网址| 国产偷人爽久久久久久老妇app| 亚洲精品九九| 久久久久久久影院| 在线免费日韩av| 国产精品成人a在线观看| 国产亚洲在线播放| 91视频在线网站| 亚洲精品进入| 亚洲美女av网站| 青青草视频播放| 极品尤物一区| 亚洲精美色品网站| 香港三日本8a三级少妇三级99| 亚洲天堂手机| 婷婷一区二区三区| 777av视频| 99riav视频在线观看| 亚洲国产综合视频在线观看| 国产精品久久久久久久乖乖| 欧美hdxxx| 91啪亚洲精品| 久久艳妇乳肉豪妇荡乳av| 免费观看黄色av| 成人午夜视频免费看| 5278欧美一区二区三区| 国产乡下妇女做爰毛片| 国产精品欧美三级在线观看| 日韩麻豆第一页| 亚洲黄色在线网站| 美女毛片一区二区三区四区| 亚洲欧美激情精品一区二区| 91视频在线网站| 精品不卡一区| 日韩在线观看免费高清| 麻豆明星ai换脸视频| 红桃视频欧美| 2019av中文字幕| 精品亚洲乱码一区二区 | 欧美精选午夜久久久乱码6080| 天天干天天综合| 精品一区二区三区中文字幕| 精品裸体舞一区二区三区| 插我舔内射18免费视频| 欧美禁忌电影网| 色偷偷偷综合中文字幕;dd| 91高清免费观看| 亚洲精选91| 国产91在线播放精品91| 一区二区不卡视频在线观看| 国产91精品一区二区| 久中文字幕一区| 1024国产在线| 亚洲高清久久久| 欧美精品aaaa| 亚洲性视频在线| 亚洲人成欧美中文字幕| 卡通动漫亚洲综合| 国产一区二区精品| 成人av番号网| 午夜性色福利视频| 国产在线一区观看| 国产女人水真多18毛片18精品 | 成人网男人的天堂| 日本三级中国三级99人妇网站| xvideos国产在线视频| 精品电影在线观看| 国产欧美一区二| 欧美a一欧美| 精品久久久久久无| 公肉吊粗大爽色翁浪妇视频| 国产精品啊啊啊| 国产精品情侣自拍| 波多野结衣在线观看一区| 国产麻豆日韩欧美久久| 蜜桃臀一区二区三区| huan性巨大欧美| 欧美中文字幕一区二区三区亚洲 | 国产免费一区二区三区四区五区 | 韩曰欧美视频免费观看| 涩涩网站在线看| 精品一区二区三区中文字幕老牛 | 久久黄色免费视频| 蜜桃av噜噜一区| 久久精品日产第一区二区三区 | 2019中文字幕在线观看| av在线资源观看| 中文字幕乱码亚洲精品一区 | 天天操夜夜操av| 欧美亚洲三级| 国产一区二区三区无遮挡| 国产最新在线| 最新成人av在线| 国产免费成人在线| 欧美日韩美女| 亚洲精品大尺度| 国产精品23p| 国产精品 日产精品 欧美精品| 亚洲成人午夜在线| 日韩精品影片| 亚洲免费一在线| 精品国产免费观看| 波多野结衣在线一区| 欧美日韩视频免费| 精品午夜av| 欧美精品手机在线| aaa级黄色片| 亚洲欧美一区二区久久 | 黄色av电影在线播放| 欧美性一二三区| 免费看污片网站| 99在线精品视频在线观看| 成人激情av| 黄页网站在线| 亚洲国产精品99久久| 中文字幕第28页| 成人毛片在线观看| 亚洲不卡中文字幕无码| 亚洲伦理影院| 伊人伊成久久人综合网小说| 中文字幕 欧美激情| 亚洲国产精品传媒在线观看| 91香蕉视频污版| 青青草国产免费一区二区下载 | 亚洲天堂免费视频| 91在线视频免费播放| 久久久99免费| jizzzz日本| 91成人免费| 福利视频一区二区三区| 黄在线观看免费网站ktv| 日韩成人在线免费观看| 青青视频在线免费观看| 国产精品久久久久久亚洲毛片| 亚洲精品视频三区| 亚洲天堂久久| 欧美日韩国产综合在线| 久久er热在这里只有精品66| 精品美女被调教视频大全网站| 久久久久亚洲av无码专区| 成人国产精品免费观看视频| 国产在线观看福利| 久久激情电影| 97伦理在线四区| 欧美成人黑人| 久久香蕉频线观| 四虎影视在线播放| 欧美亚洲高清一区| 久久艹精品视频| 久久久久久亚洲综合影院红桃| 中日韩av在线播放| 激情综合自拍| 亚洲欧洲精品一区| 成人中文字幕视频| 国产精品视频区| 黑人玩欧美人三根一起进| 亚洲视频第一页| 国产色综合视频| 欧美日韩另类在线| 最新黄色av网址| 91在线一区二区| 一个色综合久久| 亚洲免费大片| 9999在线观看| 伊人春色之综合网| 99在线视频首页| 福利视频亚洲| 91av在线不卡| 最新超碰在线| 色悠悠久久88| 天堂网www中文在线| 欧美日韩亚洲国产综合| 日韩欧美成人一区二区三区| 97久久超碰国产精品| 国产精品区在线| 在线视频精品| 日韩不卡视频一区二区| 国产伦精品一区二区三区视频 | 久久久天堂国产精品女人| 成人高清网站| 欧美在线色视频| 日本一区二区免费在线观看| 中文字幕一区二区在线观看| 男生裸体视频网站| 国产成人aaa| 17c国产在线| 日韩高清一区在线| 日韩中文字幕在线视频观看| 亚洲视频综合| 欧美这里只有精品| 五月天激情综合网| 亚洲第一在线综合在线| 日韩一级电影| 国产一区二区三区免费不卡| 超碰97久久国产精品牛牛| 91亚洲精品在线观看| 国产精品成人国产| 国产精品wwwwww| 国产精品高清乱码在线观看| 性欧美在线看片a免费观看| 国内高清免费在线视频| 九九热精品视频国产| 18在线观看的| 久久99精品久久久久久青青91| av在线影院| 久热精品视频在线免费观看| 黄色网页在线观看| xxx成人少妇69| 91精彩视频在线观看| 中日韩午夜理伦电影免费| 国产精品久久一区二区三区不卡| 亚洲免费伊人电影在线观看av| 欧美挠脚心网站| 亚洲欧美色婷婷| 国产中文字幕在线观看| 尤物yw午夜国产精品视频| 激情福利在线| 中文国产成人精品久久一| 91精彩在线视频| 久久精品成人欧美大片| 中文字幕在线播放网址| 欧美多人乱p欧美4p久久| a级片国产精品自在拍在线播放| 久99久在线视频| 丁香花电影在线观看完整版 | 欧美电影免费观看高清完整| 日本中文字幕久久看| 国产a亚洲精品| 91久久国产精品91久久性色| 视频一区在线| 精品视频导航| 欧美一区二区麻豆红桃视频| 亚洲一区二区在| 午夜日韩视频| 久久国产亚洲精品无码| 青草国产精品久久久久久| 97人人模人人爽人人澡| gogogo免费视频观看亚洲一| 右手影院亚洲欧美 | 免费在线黄色网| 亚洲电影一区二区| 久久人人爽人人爽人人片av免费| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产又粗又猛视频| 欧美mv日韩mv国产| 国产在线观看精品一区| 久久视频国产精品免费视频在线 | 久久人体视频| 久久精品xxx| 日韩福利视频导航| 能看毛片的网站| 久久久国产精华| 欧美日韩精品一区二区三区视频播放 | 欧美精品久久天天躁| 欧美一级淫片aaaaaa| 中文字幕av一区二区| 久久国产精品黑丝| 国产精品白嫩初高中害羞小美女| 精品一区二区三区免费看| 久久人人爽爽人人爽人人片av| 久久精品影视| 日本久久久精品视频| 国产成人在线免费| 精品欧美一区二区久久久| 亚洲一区二区三区视频在线| 波多野结衣网站| 精品国产露脸精彩对白| aⅴ在线视频男人的天堂| 午夜精品久久久久久久99热浪潮| 国产精品videossex撒尿| 国产伦精品一区二区三毛| 国产精品成人一区二区不卡| 欧美一级在线看| 丰满岳乱妇一区二区三区| 国产破处视频在线观看| 欧美日韩国产色视频| 性一交一乱一色一视频麻豆| 中文字幕视频一区二区在线有码| 亚洲私拍视频| 国产日韩一区二区| 你懂的视频一区二区| 色播五月激情五月| 国产三级一区二区三区| 亚洲精品中文字幕在线播放| 综合久久久久久久| 波多野结衣网站| 亚洲美女在线观看| а√天堂资源官网在线资源| 亚洲一区二区三区在线免费观看 | 亚洲人成网站777色婷婷| 91超碰国产在线| 国产精品麻豆免费版| 午夜国产精品视频| 午夜天堂在线视频| 中文字幕日韩精品一区| 中文字幕男人天堂| 一本色道久久88精品综合| 在线观看精品| 欧美重口乱码一区二区| 翔田千里一区二区| 亚洲av无码一区二区二三区| 婷婷国产在线综合| 亚洲av成人无码网天堂| 97热精品视频官网| 狼人精品一区二区三区在线| 精品人妻少妇一区二区| jizz一区二区| 久久久久久少妇| 亚洲欧美日韩精品久久| 成人视屏在线观看| 手机看片福利永久国产日韩| 日本女优在线视频一区二区| www..com.cn蕾丝视频在线观看免费版| 色综合天天性综合| 国产精品久久欧美久久一区| 日韩中文在线中文网三级| 欧美综合影院| 在线观看av的网址| 国产成人激情av| 日韩免费一二三区| 日韩国产高清视频在线| 中文在线最新版地址| 欧洲国产精品| 日本欧美一区二区| 26uuu成人网| 欧美精品一区二区久久婷婷| 福利影院在线看| 日本午夜精品一区二区| 久久精品国产亚洲aⅴ| 欧美另类videoxo高潮| 日韩小视频在线观看专区| 黄色av网址在线免费观看| 国产精品都在这里| 91精品精品| 深田咏美中文字幕| 一本到不卡免费一区二区| 成人免费在线电影| 91免费在线视频网站| 亚洲网站在线| 免费看黄色的视频| 欧美精品 国产精品| 国产精品蜜臀| 欧美在线日韩精品| 狠狠色丁香九九婷婷综合五月| 中文字幕影音先锋| 日韩精品在线第一页| 国产成人福利夜色影视| 欧美做暖暖视频| 久久久欧美精品sm网站| 国产精品国产一区二区三区四区| 欧美激情在线观看视频| 国产欧美日韩精品一区二区免费| 色综合五月婷婷| 色综合久久九月婷婷色综合| 国产精品久久久久久福利| 国产一区自拍视频| 老司机午夜精品|