3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang 接口类型 interface 简介使用

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang 接口类型 interface 简介使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. Go 語言與鴨子類型的關(guān)系

先直接來看維基百科里的定義:

If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.

翻譯過來就是:如果某個東西長得像鴨子,像鴨子一樣游泳,像鴨子一樣嘎嘎叫,那它就可以被看成是一只鴨子。

Duck Typing,鴨子類型,是動態(tài)編程語言的一種對象推斷策略,它更關(guān)注對象能如何被使用,而不是對象的類型本身。Go 語言作為一門靜態(tài)語言,它通過通過接口的方式完美支持鴨子類型。

例如,在動態(tài)語言 python 中,定義一個這樣的函數(shù):

def hello_world(coder):coder.say_hello()

當(dāng)調(diào)用此函數(shù)的時候,可以傳入任意類型,只要它實現(xiàn)了?say_hello()?函數(shù)就可以。如果沒有實現(xiàn),運行過程中會出現(xiàn)錯誤。

而在靜態(tài)語言如 Java, C++ 中,必須要顯示地聲明實現(xiàn)了某個接口,之后,才能用在任何需要這個接口的地方。如果你在程序中調(diào)用?hello_world?函數(shù),卻傳入了一個根本就沒有實現(xiàn)?say_hello()?的類型,那在編譯階段就不會通過。這也是靜態(tài)語言比動態(tài)語言更安全的原因。

動態(tài)語言和靜態(tài)語言的差別在此就有所體現(xiàn)。靜態(tài)語言在編譯期間就能發(fā)現(xiàn)類型不匹配的錯誤,不像動態(tài)語言,必須要運行到那一行代碼才會報錯。插一句,這也是我不喜歡用?python?的一個原因。當(dāng)然,靜態(tài)語言要求程序員在編碼階段就要按照規(guī)定來編寫程序,為每個變量規(guī)定數(shù)據(jù)類型,這在某種程度上,加大了工作量,也加長了代碼量。動態(tài)語言則沒有這些要求,可以讓人更專注在業(yè)務(wù)上,代碼也更短,寫起來更快,這一點,寫 python 的同學(xué)比較清楚。

Go 語言作為一門現(xiàn)代靜態(tài)語言,是有后發(fā)優(yōu)勢的。它引入了動態(tài)語言的便利,同時又會進行靜態(tài)語言的類型檢查,寫起來是非常 Happy 的。Go 采用了折中的做法:不要求類型顯示地聲明實現(xiàn)了某個接口,只要實現(xiàn)了相關(guān)的方法即可,編譯器就能檢測到。

來看個例子:

先定義一個接口,和使用此接口作為參數(shù)的函數(shù):

type IGreeting interface {sayHello() }func sayHello(i IGreeting) {i.sayHello() }

再來定義兩個結(jié)構(gòu)體:

type Go struct {} func (g Go) sayHello() {fmt.Println("Hi, I am GO!") }type PHP struct {} func (p PHP) sayHello() {fmt.Println("Hi, I am PHP!") }

最后,在 main 函數(shù)里調(diào)用 sayHello() 函數(shù):

func main() {golang := Go{}php := PHP{}sayHello(golang)sayHello(php) }

程序輸出:

Hi, I am GO! Hi, I am PHP!

在 main 函數(shù)中,調(diào)用?sayHello() 函數(shù)時,傳入了?golang, php?對象,它們并沒有顯式地聲明實現(xiàn)了 IGreeting 類型,只是實現(xiàn)了接口所規(guī)定的 sayHello() 函數(shù)。實際上,編譯器在調(diào)用 sayHello() 函數(shù)時,會隱式地將?golang, php?對象轉(zhuǎn)換成 IGreeting 類型,這也是靜態(tài)語言的類型檢查功能。

順帶再提一下動態(tài)語言的特點:

變量綁定的類型是不確定的,在運行期間才能確定
函數(shù)和方法可以接收任何類型的參數(shù),且調(diào)用時不檢查參數(shù)類型
不需要實現(xiàn)接口

總結(jié)一下,鴨子類型是一種動態(tài)語言的風(fēng)格,在這種風(fēng)格中,一個對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由它”當(dāng)前方法和屬性的集合”決定。Go 作為一種靜態(tài)語言,通過接口實現(xiàn)了?鴨子類型,實際上是 Go 的編譯器在其中作了隱匿的轉(zhuǎn)換工作。

2. 值接收者和指針接收者的區(qū)別

方法

方法能給用戶自定義的類型添加新的行為。它和函數(shù)的區(qū)別在于方法有一個接收者,給一個函數(shù)添加一個接收者,那么它就變成了方法。接收者可以是值接收者,也可以是指針接收者。

在調(diào)用方法的時候,值類型既可以調(diào)用值接收者的方法,也可以調(diào)用指針接收者的方法;指針類型既可以調(diào)用指針接收者的方法,也可以調(diào)用值接收者的方法。

也就是說,不管方法的接收者是什么類型,該類型的值和指針都可以調(diào)用,不必嚴(yán)格符合接收者的類型。

來看個例子:

package mainimport "fmt"type Person struct {age int }func (p Person) howOld() int {return p.age }func (p *Person) growUp() {p.age += 1 }func main() {// qcrao 是值類型qcrao := Person{age: 18}// 值類型 調(diào)用接收者也是值類型的方法fmt.Println(qcrao.howOld())// 值類型 調(diào)用接收者是指針類型的方法qcrao.growUp()fmt.Println(qcrao.howOld())// ----------------------// stefno 是指針類型stefno := &Person{age: 100}// 指針類型 調(diào)用接收者是值類型的方法fmt.Println(stefno.howOld())// 指針類型 調(diào)用接收者也是指針類型的方法stefno.growUp()fmt.Println(stefno.howOld()) }

上例子的輸出結(jié)果是:

18 19 100 101

調(diào)用了?growUp?函數(shù)后,不管調(diào)用者是值類型還是指針類型,它的?Age?值都改變了。

實際上,當(dāng)類型和方法的接收者類型不同時,其實是編譯器在背后做了一些工作,用一個表格來呈現(xiàn):

-值接收者指針接收者
值類型調(diào)用者方法會使用調(diào)用者的一個副本,類似于“傳值”使用值的引用來調(diào)用方法,上例中,qcrao.growUp()?實際上是?(&qcrao).growUp()
指針類型調(diào)用者指針被解引用為值,上例中,stefno.howOld()?實際上是?(*stefno).howOld()實際上也是“傳值”,方法里的操作會影響到調(diào)用者,類似于指針傳參,拷貝了一份指針

值接收者和指針接收者

前面說過,不管接收者類型是值類型還是指針類型,都可以通過值類型或指針類型調(diào)用,這里面實際上通過語法糖起作用的。

先說結(jié)論:實現(xiàn)了接收者是值類型的方法,相當(dāng)于自動實現(xiàn)了接收者是指針類型的方法;而實現(xiàn)了接收者是指針類型的方法,不會自動生成對應(yīng)接收者是值類型的方法。

來看一個例子,就會完全明白:

package mainimport "fmt"type coder interface {code()debug() }type Gopher struct {language string }func (p Gopher) code() {fmt.Printf("I am coding %s language\n", p.language) }func (p *Gopher) debug() {fmt.Printf("I am debuging %s language\n", p.language) }func main() {var c coder = &Gopher{"Go"}c.code()c.debug() }

上述代碼里定義了一個接口?coder,接口定義了兩個函數(shù):

code() debug()

接著定義了一個結(jié)構(gòu)體?Gopher,它實現(xiàn)了兩個方法,一個值接收者,一個指針接收者。

最后,我們在?main?函數(shù)里通過接口類型的變量調(diào)用了定義的兩個函數(shù)。

運行一下,結(jié)果:

I am coding Go language I am debuging Go language

但是如果我們把?main?函數(shù)的第一條語句換一下:

func main() {var c coder = Gopher{"Go"}c.code()c.debug() }

運行一下,報錯:

./main.go:23:6: cannot use Gopher literal (type Gopher) as type coder in assignment:Gopher does not implement coder (debug method has pointer receiver)

看出這兩處代碼的差別了嗎?第一次是將?&Gopher?賦給了?coder;第二次則是將?Gopher?賦給了?coder。

第二次報錯是說,Gopher?沒有實現(xiàn)?coder,很明顯了吧?因為?Gopher?類型并沒有實現(xiàn)?debug?方法。表面上看,?*Gopher?類型也沒有實現(xiàn)?code?方法,但是因為?Gopher?類型實現(xiàn)了?code?方法,所以讓?*Gopher?類型自動擁有了?code?方法。

當(dāng)然,上面的說法有一個簡單的解釋:接收者是指針類型的方法,很可能在方法中會對接收者的屬性進行更改操作,從而影響接收者;而對于接收者是值類型的方法,在方法中不會對接收者本身產(chǎn)生影響。

所以,當(dāng)實現(xiàn)了一個接收者是值類型的方法,就可以自動生成一個接收者是對應(yīng)指針類型的方法,因為兩者都不會影響接收者。但是,當(dāng)實現(xiàn)了一個接收者是指針類型的方法,如果此時自動生成一個接收者是值類型的方法,原本期望對接收者的改變(通過指針實現(xiàn)),現(xiàn)在無法實現(xiàn),因為值類型會產(chǎn)生一個拷貝,不會真正影響調(diào)用者。

最后,只要記住下面這點就可以了:

如果實現(xiàn)了接收者是值類型的方法,會隱含地也實現(xiàn)了接收者是指針類型的方法。

兩者分別在何時使用

如果方法的接收者是值類型,無論調(diào)用者是對象還是對象指針,修改的都是對象的副本,不影響調(diào)用者;如果方法的接收者是指針類型,則調(diào)用者修改的是指針指向的對象本身。

使用指針作為方法的接收者的理由:

  • 方法能夠修改接收者指向的值。
  • 避免在每次調(diào)用方法時復(fù)制該值,在值的類型為大型結(jié)構(gòu)體時,這樣做會更加高效。

是使用值接收者還是指針接收者,不是由該方法是否修改了調(diào)用者(也就是接收者)來決定,而是應(yīng)該基于該類型的本質(zhì)。

如果類型具備“原始的本質(zhì)”,也就是說它的成員都是由 Go 語言里內(nèi)置的原始類型,如字符串,整型值等,那就定義值接收者類型的方法。像內(nèi)置的引用類型,如 slice,map,interface,channel,這些類型比較特殊,聲明他們的時候,實際上是創(chuàng)建了一個?header, 對于他們也是直接定義值接收者類型的方法。這樣,調(diào)用函數(shù)時,是直接 copy 了這些類型的?header,而?header?本身就是為復(fù)制設(shè)計的。

如果類型具備非原始的本質(zhì),不能被安全地復(fù)制,這種類型總是應(yīng)該被共享,那就定義指針接收者的方法。比如 go 源碼里的文件結(jié)構(gòu)體(struct File)就不應(yīng)該被復(fù)制,應(yīng)該只有一份實體。

這一段說的比較繞,大家可以去看《Go 語言實戰(zhàn)》5.3 那一節(jié)。

3. iface 和 eface 的區(qū)別是什么

iface?和?eface?都是 Go 中描述接口的底層結(jié)構(gòu)體,區(qū)別在于?iface?描述的接口包含方法,而?eface?則是不包含任何方法的空接口:interface{}。

從源碼層面看一下:

type iface struct {tab *itabdata unsafe.Pointer }type itab struct {inter *interfacetype_type *_typelink *itabhash uint32 // copy of _type.hash. Used for type switches.bad bool // type does not implement interfaceinhash bool // has this itab been added to hash?unused [2]bytefun [1]uintptr // variable sized }

iface?內(nèi)部維護兩個指針,tab?指向一個?itab?實體, 它表示接口的類型以及賦給這個接口的實體類型。data?則指向接口具體的值,一般而言是一個指向堆內(nèi)存的指針。

再來仔細(xì)看一下?itab?結(jié)構(gòu)體:_type?字段描述了實體的類型,包括內(nèi)存對齊方式,大小等;inter?字段則描述了接口的類型。fun?字段放置和接口方法對應(yīng)的具體數(shù)據(jù)類型的方法地址,實現(xiàn)接口調(diào)用方法的動態(tài)分派,一般在每次給接口賦值發(fā)生轉(zhuǎn)換時會更新此表,或者直接拿緩存的 itab。

這里只會列出實體類型和接口相關(guān)的方法,實體類型的其他方法并不會出現(xiàn)在這里。如果你學(xué)過 C++ 的話,這里可以類比虛函數(shù)的概念。

另外,你可能會覺得奇怪,為什么?fun?數(shù)組的大小為 1,要是接口定義了多個方法可怎么辦?實際上,這里存儲的是第一個方法的函數(shù)指針,如果有更多的方法,在它之后的內(nèi)存空間里繼續(xù)存儲。從匯編角度來看,通過增加地址就能獲取到這些函數(shù)指針,沒什么影響。順便提一句,這些方法是按照函數(shù)名稱的字典序進行排列的。

再看一下?interfacetype?類型,它描述的是接口的類型:

type interfacetype struct {typ _typepkgpath namemhdr []imethod }

可以看到,它包裝了?_type?類型,_type?實際上是描述 Go 語言中各種數(shù)據(jù)類型的結(jié)構(gòu)體。我們注意到,這里還包含一個?mhdr?字段,表示接口所定義的函數(shù)列表,?pkgpath?記錄定義了接口的包名。

這里通過一張圖來看下?iface?結(jié)構(gòu)體的全貌:

iface 結(jié)構(gòu)體全景

接著來看一下?eface?的源碼:

type eface struct {_type *_typedata unsafe.Pointer }

相比?iface,eface?就比較簡單了。只維護了一個?_type?字段,表示空接口所承載的具體的實體類型。data?描述了具體的值。

eface 結(jié)構(gòu)體全景

我們來看個例子:

package mainimport "fmt"func main() {x := 200var any interface{} = xfmt.Println(any)g := Gopher{"Go"}var c coder = gfmt.Println(c) }type coder interface {code()debug() }type Gopher struct {language string }func (p Gopher) code() {fmt.Printf("I am coding %s language\n", p.language) }func (p Gopher) debug() {fmt.Printf("I am debuging %s language\n", p.language) }

執(zhí)行命令,打印出匯編語言:

go tool compile -S ./src/main.go

可以看到,main 函數(shù)里調(diào)用了兩個函數(shù):

func convT2E64(t *_type, elem unsafe.Pointer) (e eface) func convT2I(tab *itab, elem unsafe.Pointer) (i iface)

上面兩個函數(shù)的參數(shù)和?iface?及?eface?結(jié)構(gòu)體的字段是可以聯(lián)系起來的:兩個函數(shù)都是將參數(shù)組裝一下,形成最終的接口。

作為補充,我們最后再來看下?_type?結(jié)構(gòu)體:

type _type struct {// 類型大小size uintptrptrdata uintptr// 類型的 hash 值hash uint32// 類型的 flag,和反射相關(guān)tflag tflag// 內(nèi)存對齊相關(guān)align uint8fieldalign uint8// 類型的編號,有bool, slice, struct 等等等等kind uint8alg *typeAlg// gc 相關(guān)gcdata *bytestr nameOffptrToThis typeOff }

Go 語言各種數(shù)據(jù)類型都是在?_type?字段的基礎(chǔ)上,增加一些額外的字段來進行管理的:

type arraytype struct {typ _typeelem *_typeslice *_typelen uintptr }type chantype struct {typ _typeelem *_typedir uintptr }type slicetype struct {typ _typeelem *_type }type structtype struct {typ _typepkgPath namefields []structfield }

這些數(shù)據(jù)類型的結(jié)構(gòu)體定義,是反射實現(xiàn)的基礎(chǔ)。

4. 接口的動態(tài)類型和動態(tài)值

從源碼里可以看到:iface包含兩個字段:tab?是接口表指針,指向類型信息;data?是數(shù)據(jù)指針,則指向具體的數(shù)據(jù)。它們分別被稱為動態(tài)類型和動態(tài)值。而接口值包括動態(tài)類型和動態(tài)值。

【引申1】接口類型和?nil?作比較

接口值的零值是指動態(tài)類型和動態(tài)值都為?nil。當(dāng)僅且當(dāng)這兩部分的值都為?nil?的情況下,這個接口值就才會被認(rèn)為?接口值 == nil。

來看個例子:

package mainimport "fmt"type Coder interface {code() }type Gopher struct {name string }func (g Gopher) code() {fmt.Printf("%s is coding\n", g.name) }func main() {var c Coderfmt.Println(c == nil)fmt.Printf("c: %T, %v\n", c, c)var g *Gopherfmt.Println(g == nil)c = gfmt.Println(c == nil)fmt.Printf("c: %T, %v\n", c, c) }

輸出:

true c: <nil>, <nil> true false c: *main.Gopher, <nil>

一開始,c?的 動態(tài)類型和動態(tài)值都為?nil,g?也為?nil,當(dāng)把?g?賦值給?c?后,c?的動態(tài)類型變成了?*main.Gopher,僅管?c?的動態(tài)值仍為?nil,但是當(dāng)?c?和?nil?作比較的時候,結(jié)果就是?false?了。

【引申2】
來看一個例子,看一下它的輸出:

package mainimport "fmt"type MyError struct {}func (i MyError) Error() string {return "MyError" }func main() {err := Process()fmt.Println(err)fmt.Println(err == nil) }func Process() error {var err *MyError = nilreturn err }

函數(shù)運行結(jié)果:

<nil> false

這里先定義了一個?MyError?結(jié)構(gòu)體,實現(xiàn)了?Error?函數(shù),也就實現(xiàn)了?error?接口。Process?函數(shù)返回了一個?error?接口,這塊隱含了類型轉(zhuǎn)換。所以,雖然它的值是?nil,其實它的類型是?*MyError,最后和?nil?比較的時候,結(jié)果為?false。

【引申3】如何打印出接口的動態(tài)類型和值?

直接看代碼:

package mainimport ("unsafe""fmt" )type iface struct {itab, data uintptr }func main() {var a interface{} = nilvar b interface{} = (*int)(nil)x := 5var c interface{} = (*int)(&x)ia := *(*iface)(unsafe.Pointer(&a))ib := *(*iface)(unsafe.Pointer(&b))ic := *(*iface)(unsafe.Pointer(&c))fmt.Println(ia, ib, ic)fmt.Println(*(*int)(unsafe.Pointer(ic.data))) }

代碼里直接定義了一個?iface?結(jié)構(gòu)體,用兩個指針來描述?itab?和?data,之后將 a, b, c 在內(nèi)存中的內(nèi)容強制解釋成我們自定義的?iface。最后就可以打印出動態(tài)類型和動態(tài)值的地址。

運行結(jié)果如下:

{0 0} {17426912 0} {17426912 842350714568} 5

a 的動態(tài)類型和動態(tài)值的地址均為 0,也就是 nil;b 的動態(tài)類型和 c 的動態(tài)類型一致,都是?*int;最后,c 的動態(tài)值為 5。

5. 編譯器自動檢測類型是否實現(xiàn)接口

經(jīng)常看到一些開源庫里會有一些類似下面這種奇怪的用法:

var _ io.Writer = (*myWriter)(nil)

這時候會有點懵,不知道作者想要干什么,實際上這就是此問題的答案。編譯器會由此檢查?*myWriter?類型是否實現(xiàn)了?io.Writer?接口。

來看一個例子:

package mainimport "io"type myWriter struct {}/*func (w myWriter) Write(p []byte) (n int, err error) {return }*/func main() {// 檢查 *myWriter 類型是否實現(xiàn)了 io.Writer 接口var _ io.Writer = (*myWriter)(nil)// 檢查 myWriter 類型是否實現(xiàn)了 io.Writer 接口var _ io.Writer = myWriter{} }

注釋掉為 myWriter 定義的 Write 函數(shù)后,運行程序:

src/main.go:14:6: cannot use (*myWriter)(nil) (type *myWriter) as type io.Writer in assignment:*myWriter does not implement io.Writer (missing Write method) src/main.go:15:6: cannot use myWriter literal (type myWriter) as type io.Writer in assignment:myWriter does not implement io.Writer (missing Write method)

報錯信息:*myWriter/myWriter 未實現(xiàn) io.Writer 接口,也就是未實現(xiàn) Write 方法。

解除注釋后,運行程序不報錯。

實際上,上述賦值語句會發(fā)生隱式地類型轉(zhuǎn)換,在轉(zhuǎn)換的過程中,編譯器會檢測等號右邊的類型是否實現(xiàn)了等號左邊接口所規(guī)定的函數(shù)。

總結(jié)一下,可通過在代碼中添加類似如下的代碼,用來檢測類型是否實現(xiàn)了接口:

var _ io.Writer = (*myWriter)(nil) var _ io.Writer = myWriter{}

6. 接口的構(gòu)造過程是怎樣的

我們已經(jīng)看過了?iface?和?eface?的源碼,知道?iface?最重要的是?itab?和?_type。

為了研究清楚接口是如何構(gòu)造的,接下來我會拿起匯編的武器,還原背后的真相。

來看一個示例代碼:

package mainimport "fmt"type Person interface {growUp() }type Student struct {age int }func (p Student) growUp() {p.age += 1return }func main() {var qcrao = Person(Student{age: 18})fmt.Println(qcrao) }

執(zhí)行命令:

go tool compile -S main.go

得到 main 函數(shù)的匯編代碼如下:

0x0000 00000 (./src/main.go:30) TEXT "".main(SB), $80-0 0x0000 00000 (./src/main.go:30) MOVQ (TLS), CX 0x0009 00009 (./src/main.go:30) CMPQ SP, 16(CX) 0x000d 00013 (./src/main.go:30) JLS 157 0x0013 00019 (./src/main.go:30) SUBQ $80, SP 0x0017 00023 (./src/main.go:30) MOVQ BP, 72(SP) 0x001c 00028 (./src/main.go:30) LEAQ 72(SP), BP 0x0021 00033 (./src/main.go:30) FUNCDATA$0, gclocals·69c1753bd5f81501d95132d08af04464(SB) 0x0021 00033 (./src/main.go:30) FUNCDATA$1, gclocals·e226d4ae4a7cad8835311c6a4683c14f(SB) 0x0021 00033 (./src/main.go:31) MOVQ $18, ""..autotmp_1+48(SP) 0x002a 00042 (./src/main.go:31) LEAQ go.itab."".Student,"".Person(SB), AX 0x0031 00049 (./src/main.go:31) MOVQ AX, (SP) 0x0035 00053 (./src/main.go:31) LEAQ ""..autotmp_1+48(SP), AX 0x003a 00058 (./src/main.go:31) MOVQ AX, 8(SP) 0x003f 00063 (./src/main.go:31) PCDATA $0, $0 0x003f 00063 (./src/main.go:31) CALL runtime.convT2I64(SB) 0x0044 00068 (./src/main.go:31) MOVQ 24(SP), AX 0x0049 00073 (./src/main.go:31) MOVQ 16(SP), CX 0x004e 00078 (./src/main.go:33) TESTQ CX, CX 0x0051 00081 (./src/main.go:33) JEQ 87 0x0053 00083 (./src/main.go:33) MOVQ 8(CX), CX 0x0057 00087 (./src/main.go:33) MOVQ $0, ""..autotmp_2+56(SP) 0x0060 00096 (./src/main.go:33) MOVQ $0, ""..autotmp_2+64(SP) 0x0069 00105 (./src/main.go:33) MOVQ CX, ""..autotmp_2+56(SP) 0x006e 00110 (./src/main.go:33) MOVQ AX, ""..autotmp_2+64(SP) 0x0073 00115 (./src/main.go:33) LEAQ ""..autotmp_2+56(SP), AX 0x0078 00120 (./src/main.go:33) MOVQ AX, (SP) 0x007c 00124 (./src/main.go:33) MOVQ $1, 8(SP) 0x0085 00133 (./src/main.go:33) MOVQ $1, 16(SP) 0x008e 00142 (./src/main.go:33) PCDATA $0, $1 0x008e 00142 (./src/main.go:33) CALL fmt.Println(SB) 0x0093 00147 (./src/main.go:34) MOVQ 72(SP), BP 0x0098 00152 (./src/main.go:34) ADDQ $80, SP 0x009c 00156 (./src/main.go:34) RET 0x009d 00157 (./src/main.go:34) NOP 0x009d 00157 (./src/main.go:30) PCDATA $0, $-1 0x009d 00157 (./src/main.go:30) CALL runtime.morestack_noctxt(SB) 0x00a2 00162 (./src/main.go:30) JMP 0

我們從第 10 行開始看,如果不理解前面幾行匯編代碼的話,可以回去看看公眾號前面兩篇文章,這里我就省略了。

匯編行數(shù)操作
10-14構(gòu)造調(diào)用?runtime.convT2I64(SB)?的參數(shù)

我們來看下這個函數(shù)的參數(shù)形式:

func convT2I64(tab *itab, elem unsafe.Pointer) (i iface) {// …… }

convT2I64?會構(gòu)造出一個?inteface,也就是我們的?Person?接口。

第一個參數(shù)的位置是?(SP),這里被賦上了?go.itab."".Student,"".Person(SB)?的地址。

我們從生成的匯編找到:

go.itab."".Student,"".Person SNOPTRDATA dupok size=400x0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0010 00 00 00 00 00 00 00 00 da 9f 20 d4 rel 0+8 t=1 type."".Person+0rel 8+8 t=1 type."".Student+0

size=40?大小為40字節(jié),回顧一下:

type itab struct {inter *interfacetype // 8字節(jié)_type *_type // 8字節(jié)link *itab // 8字節(jié)hash uint32 // 4字節(jié)bad bool // 1字節(jié)inhash bool // 1字節(jié)unused [2]byte // 2字節(jié)fun [1]uintptr // variable sized // 8字節(jié) }

把每個字段的大小相加,itab?結(jié)構(gòu)體的大小就是 40 字節(jié)。上面那一串?dāng)?shù)字實際上是?itab?序列化后的內(nèi)容,注意到大部分?jǐn)?shù)字是 0,從 24 字節(jié)開始的 4 個字節(jié)?da 9f 20 d4?實際上是?itab?的?hash?值,這在判斷兩個類型是否相同的時候會用到。

下面兩行是鏈接指令,簡單說就是將所有源文件綜合起來,給每個符號賦予一個全局的位置值。這里的意思也比較明確:前8個字節(jié)最終存儲的是?type."".Person?的地址,對應(yīng)?itab?里的?inter?字段,表示接口類型;8-16 字節(jié)最終存儲的是?type."".Student?的地址,對應(yīng)?itab?里?_type?字段,表示具體類型。

第二個參數(shù)就比較簡單了,它就是數(shù)字?18?的地址,這也是初始化?Student?結(jié)構(gòu)體的時候會用到。

匯編行數(shù)操作
15調(diào)用?runtime.convT2I64(SB)

具體看下代碼:

func convT2I64(tab *itab, elem unsafe.Pointer) (i iface) {t := tab._type//...var x unsafe.Pointerif *(*uint64)(elem) == 0 {x = unsafe.Pointer(&zeroVal[0])} else {x = mallocgc(8, t, false)*(*uint64)(x) = *(*uint64)(elem)}i.tab = tabi.data = xreturn }

這塊代碼比較簡單,把?tab?賦給了?iface?的?tab?字段;data?部分則是在堆上申請了一塊內(nèi)存,然后將?elem?指向的?18?拷貝過去。這樣?iface?就組裝好了。

匯編行數(shù)操作
17把?i.tab?賦給?CX
18把?i.data?賦給?AX
19-21檢測?i.tab?是否是 nil,如果不是的話,把 CX 移動 8 個字節(jié),也就是把?itab?的?_type?字段賦給了 CX,這也是接口的實體類型,最終要作為?fmt.Println?函數(shù)的參數(shù)

后面,就是調(diào)用?fmt.Println?函數(shù)及之前的參數(shù)準(zhǔn)備工作了,不再贅述。

這樣,我們就把一個?interface?的構(gòu)造過程說完了。

【引申1】
如何打印出接口類型的?Hash?值?

這里參考曹大神翻譯的一篇文章,參考資料里會寫上。具體做法如下:

type iface struct {tab *itabdata unsafe.Pointer } type itab struct {inter uintptr_type uintptrlink uintptrhash uint32_ [4]bytefun [1]uintptr }func main() {var qcrao = Person(Student{age: 18})iface := (*iface)(unsafe.Pointer(&qcrao))fmt.Printf("iface.tab.hash = %#x\n", iface.tab.hash) }

定義了一個山寨版的?iface?和?itab,說它山寨是因為?itab?里的一些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)都不具體展開了,比如?_type,對比一下正宗的定義就可以發(fā)現(xiàn),但是山寨版依然能工作,因為?_type?就是一個指針而已嘛。

在?main?函數(shù)里,先構(gòu)造出一個接口對象?qcrao,然后強制類型轉(zhuǎn)換,最后讀取出?hash?值,非常妙!你也可以自己動手試一下。

運行結(jié)果:

iface.tab.hash = 0xd4209fda

值得一提的是,構(gòu)造接口?qcrao?的時候,即使我把?age?寫成其他值,得到的?hash?值依然不變的,這應(yīng)該是可以預(yù)料的,hash?值只和他的字段、方法相關(guān)。

7. 類型轉(zhuǎn)換和斷言的區(qū)別

我們知道,Go 語言中不允許隱式類型轉(zhuǎn)換,也就是說?=?兩邊,不允許出現(xiàn)類型不相同的變量。

類型轉(zhuǎn)換、類型斷言本質(zhì)都是把一個類型轉(zhuǎn)換成另外一個類型。不同之處在于,類型斷言是對接口變量進行的操作。

類型轉(zhuǎn)換

對于類型轉(zhuǎn)換而言,轉(zhuǎn)換前后的兩個類型要相互兼容才行。類型轉(zhuǎn)換的語法為:

<結(jié)果類型> := <目標(biāo)類型> ( <表達式> )

package mainimport "fmt"func main() {var i int = 9var f float64f = float64(i)fmt.Printf("%T, %v\n", f, f)f = 10.8a := int(f)fmt.Printf("%T, %v\n", a, a)// s := []int(i) }

上面的代碼里,我定義了一個?int?型和?float64?型的變量,嘗試在它們之前相互轉(zhuǎn)換,結(jié)果是成功的:int?型和?float64?是相互兼容的。

如果我把最后一行代碼的注釋去掉,編譯器會報告類型不兼容的錯誤:

cannot convert i (type int) to type []int

斷言

前面說過,因為空接口?interface{}?沒有定義任何函數(shù),因此 Go 中所有類型都實現(xiàn)了空接口。當(dāng)一個函數(shù)的形參是?interface{},那么在函數(shù)中,需要對形參進行斷言,從而得到它的真實類型。

斷言的語法為:

<目標(biāo)類型的值>,<布爾參數(shù)> := <表達式>.( 目標(biāo)類型 ) // 安全類型斷言
<目標(biāo)類型的值> := <表達式>.( 目標(biāo)類型 )  //非安全類型斷言

類型轉(zhuǎn)換和類型斷言有些相似,不同之處,在于類型斷言是對接口進行的操作。

還是來看一個簡短的例子:

package mainimport "fmt"type Student struct {Name stringAge int }func main() {var i interface{} = new(Student)s := i.(Student)fmt.Println(s) }

運行一下:

panic: interface conversion: interface {} is *main.Student, not main.Student

直接?panic?了,這是因為?i?是?*Student?類型,并非?Student?類型,斷言失敗。這里直接發(fā)生了?panic,線上代碼可能并不適合這樣做,可以采用“安全斷言”的語法:

func main() {var i interface{} = new(Student)s, ok := i.(Student)if ok {fmt.Println(s)} }

這樣,即使斷言失敗也不會?panic。

斷言其實還有另一種形式,就是用在利用?switch?語句判斷接口的類型。每一個?case?會被順序地考慮。當(dāng)命中一個?case?時,就會執(zhí)行?case?中的語句,因此?case?語句的順序是很重要的,因為很有可能會有多個?case?匹配的情況。

代碼示例如下:

func main() {//var i interface{} = new(Student)//var i interface{} = (*Student)(nil)var i interface{}fmt.Printf("%p %v\n", &i, i)judge(i) }func judge(v interface{}) {fmt.Printf("%p %v\n", &v, v)switch v := v.(type) {case nil:fmt.Printf("%p %v\n", &v, v)fmt.Printf("nil type[%T] %v\n", v, v)case Student:fmt.Printf("%p %v\n", &v, v)fmt.Printf("Student type[%T] %v\n", v, v)case *Student:fmt.Printf("%p %v\n", &v, v)fmt.Printf("*Student type[%T] %v\n", v, v)default:fmt.Printf("%p %v\n", &v, v)fmt.Printf("unknow\n")} }type Student struct {Name stringAge int }

main?函數(shù)里有三行不同的聲明,每次運行一行,注釋另外兩行,得到三組運行結(jié)果:

// --- var i interface{} = new(Student) 0xc4200701b0 [Name: ], [Age: 0] 0xc4200701d0 [Name: ], [Age: 0] 0xc420080020 [Name: ], [Age: 0] *Student type[*main.Student] [Name: ], [Age: 0]// --- var i interface{} = (*Student)(nil) 0xc42000e1d0 <nil> 0xc42000e1f0 <nil> 0xc42000c030 <nil> *Student type[*main.Student] <nil>// --- var i interface{} 0xc42000e1d0 <nil> 0xc42000e1e0 <nil> 0xc42000e1f0 <nil> nil type[<nil>] <nil>

對于第一行語句:

var i interface{} = new(Student)

i?是一個?*Student?類型,匹配上第三個 case,從打印的三個地址來看,這三處的變量實際上都是不一樣的。在?main?函數(shù)里有一個局部變量?i;調(diào)用函數(shù)時,實際上是復(fù)制了一份參數(shù),因此函數(shù)里又有一個變量?v,它是?i?的拷貝;斷言之后,又生成了一份新的拷貝。所以最終打印的三個變量的地址都不一樣。

對于第二行語句:

var i interface{} = (*Student)(nil)

這里想說明的其實是?i?在這里動態(tài)類型是?(*Student), 數(shù)據(jù)為?nil,它的類型并不是?nil,它與?nil?作比較的時候,得到的結(jié)果也是?false。

最后一行語句:

var i interface{}

這回?i?才是?nil?類型。

【引申1】
fmt.Println?函數(shù)的參數(shù)是?interface。對于內(nèi)置類型,函數(shù)內(nèi)部會用窮舉法,得出它的真實類型,然后轉(zhuǎn)換為字符串打印。而對于自定義類型,首先確定該類型是否實現(xiàn)了?String()?方法,如果實現(xiàn)了,則直接打印輸出?String()?方法的結(jié)果;否則,會通過反射來遍歷對象的成員進行打印。

再來看一個簡短的例子,比較簡單,不要緊張:

package mainimport "fmt"type Student struct {Name stringAge int }func main() {var s = Student{Name: "qcrao",Age: 18,}fmt.Println(s) }

因為?Student?結(jié)構(gòu)體沒有實現(xiàn)?String()?方法,所以?fmt.Println?會利用反射挨個打印成員變量:

{qcrao 18}

增加一個?String()?方法的實現(xiàn):

func (s Student) String() string {return fmt.Sprintf("[Name: %s], [Age: %d]", s.Name, s.Age) }

打印結(jié)果:

[Name: qcrao], [Age: 18]

按照我們自定義的方法來打印了。

【引申2】
針對上面的例子,如果改一下:

func (s *Student) String() string {return fmt.Sprintf("[Name: %s], [Age: %d]", s.Name, s.Age) }

注意看兩個函數(shù)的接受者類型不同,現(xiàn)在?Student?結(jié)構(gòu)體只有一個接受者類型為?指針類型?的?String()?函數(shù),打印結(jié)果:

{qcrao 18}

為什么?

類型?T?只有接受者是?T?的方法;而類型?*T?擁有接受者是?T?和?*T?的方法。語法上?T?能直接調(diào)?*T?的方法僅僅是?Go?的語法糖。

所以,?Student?結(jié)構(gòu)體定義了接受者類型是值類型的?String()?方法時,通過

fmt.Println(s) fmt.Println(&s)

均可以按照自定義的格式來打印。

如果?Student?結(jié)構(gòu)體定義了接受者類型是指針類型的?String()?方法時,只有通過

fmt.Println(&s)

才能按照自定義的格式打印。

8. 接口轉(zhuǎn)換的原理

通過前面提到的?iface?的源碼可以看到,實際上它包含接口的類型?interfacetype?和 實體類型的類型?_type,這兩者都是?iface?的字段?itab?的成員。也就是說生成一個?itab?同時需要接口的類型和實體的類型。

<interface 類型, 實體類型> ->itable

當(dāng)判定一種類型是否滿足某個接口時,Go 使用類型的方法集和接口所需要的方法集進行匹配,如果類型的方法集完全包含接口的方法集,則可認(rèn)為該類型實現(xiàn)了該接口。

例如某類型有?m?個方法,某接口有?n?個方法,則很容易知道這種判定的時間復(fù)雜度為?O(mn),Go 會對方法集的函數(shù)按照函數(shù)名的字典序進行排序,所以實際的時間復(fù)雜度為?O(m+n)。

這里我們來探索將一個接口轉(zhuǎn)換給另外一個接口背后的原理,當(dāng)然,能轉(zhuǎn)換的原因必然是類型兼容。

直接來看一個例子:

package mainimport "fmt"type coder interface {code()run() }type runner interface {run() }type Gopher struct {language string }func (g Gopher) code() {return }func (g Gopher) run() {return }func main() {var c coder = Gopher{}var r runnerr = cfmt.Println(c, r) }

簡單解釋下上述代碼:定義了兩個?interface:?coder?和?runner。定義了一個實體類型?Gopher,類型?Gopher?實現(xiàn)了兩個方法,分別是?run()?和?code()。main 函數(shù)里定義了一個接口變量?c,綁定了一個?Gopher?對象,之后將?c?賦值給另外一個接口變量?r?。賦值成功的原因是?c?中包含?run()?方法。這樣,兩個接口變量完成了轉(zhuǎn)換。

執(zhí)行命令:

go tool compile -S ./src/main.go

得到 main 函數(shù)的匯編命令,可以看到:?r = c?這一行語句實際上是調(diào)用了?runtime.convI2I(SB),也就是?convI2I?函數(shù),從函數(shù)名來看,就是將一個?interface?轉(zhuǎn)換成另外一個?interface,看下它的源代碼:

func convI2I(inter *interfacetype, i iface) (r iface) {tab := i.tabif tab == nil {return}if tab.inter == inter {r.tab = tabr.data = i.datareturn}r.tab = getitab(inter, tab._type, false)r.data = i.datareturn }

代碼比較簡單,函數(shù)參數(shù)?inter?表示接口類型,i?表示綁定了實體類型的接口,r?則表示接口轉(zhuǎn)換了之后的新的?iface。通過前面的分析,我們又知道,?iface?是由?tab?和?data?兩個字段組成。所以,實際上?convI2I?函數(shù)真正要做的事,找到新?interface?的?tab?和?data,就大功告成了。

我們還知道,tab?是由接口類型?interfacetype?和 實體類型?_type?組成。所以最關(guān)鍵的語句是?r.tab = getitab(inter, tab._type, false)。

因此,重點來看下?getitab?函數(shù)的源碼,只看關(guān)鍵的地方:

func getitab(inter *interfacetype, typ *_type, canfail bool) *itab {// ……// 根據(jù) inter, typ 計算出 hash 值h := itabhash(inter, typ)// look twice - once without lock, once with.// common case will be no lock contention.var m *itabvar locked intfor locked = 0; locked < 2; locked++ {if locked != 0 {lock(&ifaceLock)}// 遍歷哈希表的一個 slotfor m = (*itab)(atomic.Loadp(unsafe.Pointer(&hash[h]))); m != nil; m = m.link {// 如果在 hash 表中已經(jīng)找到了 itab(inter 和 typ 指針都相同)if m.inter == inter && m._type == typ {// ……if locked != 0 {unlock(&ifaceLock)}return m}}}// 在 hash 表中沒有找到 itab,那么新生成一個 itabm = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr)-1)*sys.PtrSize, 0, &memstats.other_sys))m.inter = interm._type = typ// 添加到全局的 hash 表中additab(m, true, canfail)unlock(&ifaceLock)if m.bad {return nil}return m }

簡單總結(jié)一下:getitab 函數(shù)會根據(jù)?interfacetype?和?_type?去全局的 itab 哈希表中查找,如果能找到,則直接返回;否則,會根據(jù)給定的?interfacetype?和?_type?新生成一個?itab,并插入到 itab 哈希表,這樣下一次就可以直接拿到?itab。

這里查找了兩次,并且第二次上鎖了,這是因為如果第一次沒找到,在第二次仍然沒有找到相應(yīng)的?itab?的情況下,需要新生成一個,并且寫入哈希表,因此需要加鎖。這樣,其他協(xié)程在查找相同的?itab?并且也沒有找到時,第二次查找時,會被掛住,之后,就會查到第一個協(xié)程寫入哈希表的?itab。

再來看一下?additab?函數(shù)的代碼:

// 檢查 _type 是否符合 interface_type 并且創(chuàng)建對應(yīng)的 itab 結(jié)構(gòu)體 將其放到 hash 表中 func additab(m *itab, locked, canfail bool) {inter := m.intertyp := m._typex := typ.uncommon()// both inter and typ have method sorted by name,// and interface names are unique,// so can iterate over both in lock step;// the loop is O(ni+nt) not O(ni*nt).// // inter 和 typ 的方法都按方法名稱進行了排序// 并且方法名都是唯一的。所以循環(huán)的次數(shù)是固定的// 只用循環(huán) O(ni+nt),而非 O(ni*nt)ni := len(inter.mhdr)nt := int(x.mcount)xmhdr := (*[1 << 16]method)(add(unsafe.Pointer(x), uintptr(x.moff)))[:nt:nt]j := 0for k := 0; k < ni; k++ {i := &inter.mhdr[k]itype := inter.typ.typeOff(i.ityp)name := inter.typ.nameOff(i.name)iname := name.name()ipkg := name.pkgPath()if ipkg == "" {ipkg = inter.pkgpath.name()}for ; j < nt; j++ {t := &xmhdr[j]tname := typ.nameOff(t.name)// 檢查方法名字是否一致if typ.typeOff(t.mtyp) == itype && tname.name() == iname {pkgPath := tname.pkgPath()if pkgPath == "" {pkgPath = typ.nameOff(x.pkgpath).name()}if tname.isExported() || pkgPath == ipkg {if m != nil {// 獲取函數(shù)地址,并加入到itab.fun數(shù)組中ifn := typ.textOff(t.ifn)*(*unsafe.Pointer)(add(unsafe.Pointer(&m.fun[0]), uintptr(k)*sys.PtrSize)) = ifn}goto nextimethod}}}// ……m.bad = truebreaknextimethod:}if !locked {throw("invalid itab locking")}// 計算 hash 值h := itabhash(inter, typ)// 加到Hash Slot鏈表中m.link = hash[h]m.inhash = trueatomicstorep(unsafe.Pointer(&hash[h]), unsafe.Pointer(m)) }

additab?會檢查?itab?持有的?interfacetype?和?_type?是否符合,就是看?_type?是否完全實現(xiàn)了?interfacetype?的方法,也就是看兩者的方法列表重疊的部分就是?interfacetype?所持有的方法列表。注意到其中有一個雙層循環(huán),乍一看,循環(huán)次數(shù)是?ni * nt,但由于兩者的函數(shù)列表都按照函數(shù)名稱進行了排序,因此最終只執(zhí)行了?ni + nt?次,代碼里通過一個小技巧來實現(xiàn):第二層循環(huán)并沒有從 0 開始計數(shù),而是從上一次遍歷到的位置開始。

求 hash 值的函數(shù)比較簡單:

func itabhash(inter *interfacetype, typ *_type) uint32 {h := inter.typ.hashh += 17 * typ.hashreturn h % hashSize }

hashSize?的值是 1009。

更一般的,當(dāng)把實體類型賦值給接口的時候,會調(diào)用?conv?系列函數(shù),例如空接口調(diào)用?convT2E?系列、非空接口調(diào)用?convT2I?系列。這些函數(shù)比較相似:

  • 具體類型轉(zhuǎn)空接口時,_type 字段直接復(fù)制源類型的 _type;調(diào)用 mallocgc 獲得一塊新內(nèi)存,把值復(fù)制進去,data 再指向這塊新內(nèi)存。
  • 具體類型轉(zhuǎn)非空接口時,入?yún)?tab 是編譯器在編譯階段預(yù)先生成好的,新接口 tab 字段直接指向入?yún)?tab 指向的 itab;調(diào)用 mallocgc 獲得一塊新內(nèi)存,把值復(fù)制進去,data 再指向這塊新內(nèi)存。
  • 而對于接口轉(zhuǎn)接口,itab 調(diào)用 getitab 函數(shù)獲取。只用生成一次,之后直接從 hash 表中獲取。
  • 9. 如何用 interface 實現(xiàn)多態(tài)

    Go?語言并沒有設(shè)計諸如虛函數(shù)、純虛函數(shù)、繼承、多重繼承等概念,但它通過接口卻非常優(yōu)雅地支持了面向?qū)ο蟮奶匦浴?/p>

    多態(tài)是一種運行期的行為,它有以下幾個特點:

  • 一種類型具有多種類型的能力
  • 允許不同的對象對同一消息做出靈活的反應(yīng)
  • 以一種通用的方式對待使用的對象
  • 非動態(tài)語言必須通過繼承和接口的方式來實現(xiàn)
  • 看一個實現(xiàn)了多態(tài)的代碼例子:

    package mainimport "fmt"func main() {qcrao := Student{age: 18}whatJob(&qcrao)growUp(&qcrao)fmt.Println(qcrao)stefno := Programmer{age: 100}whatJob(stefno)growUp(stefno)fmt.Println(stefno) }func whatJob(p Person) {p.job() }func growUp(p Person) {p.growUp() }type Person interface {job()growUp() }type Student struct {age int }func (p Student) job() {fmt.Println("I am a student.")return }func (p *Student) growUp() {p.age += 1return }type Programmer struct {age int }func (p Programmer) job() {fmt.Println("I am a programmer.")return }func (p Programmer) growUp() {// 程序員老得太快 ^_^p.age += 10return }

    代碼里先定義了 1 個?Person?接口,包含兩個函數(shù):

    job() growUp()

    然后,又定義了 2 個結(jié)構(gòu)體,Student?和?Programmer,同時,類型?*Student、Programmer?實現(xiàn)了?Person?接口定義的兩個函數(shù)。注意,*Student?類型實現(xiàn)了接口,?Student?類型卻沒有。

    之后,我又定義了函數(shù)參數(shù)是?Person?接口的兩個函數(shù):

    func whatJob(p Person) func growUp(p Person)

    main?函數(shù)里先生成?Student?和?Programmer?的對象,再將它們分別傳入到函數(shù)?whatJob?和?growUp。函數(shù)中,直接調(diào)用接口函數(shù),實際執(zhí)行的時候是看最終傳入的實體類型是什么,調(diào)用的是實體類型實現(xiàn)的函數(shù)。于是,不同對象針對同一消息就有多種表現(xiàn),多態(tài)就實現(xiàn)了。

    更深入一點來說的話,在函數(shù)?whatJob()?或者?growUp()?內(nèi)部,接口?person?綁定了實體類型?*Student?或者?Programmer。根據(jù)前面分析的?iface?源碼,這里會直接調(diào)用?fun?里保存的函數(shù),類似于:?s.tab->fun[0],而因為?fun?數(shù)組里保存的是實體類型實現(xiàn)的函數(shù),所以當(dāng)函數(shù)傳入不同的實體類型時,調(diào)用的實際上是不同的函數(shù)實現(xiàn),從而實現(xiàn)多態(tài)。

    運行一下代碼:

    I am a student. {19} I am a programmer. {100}

    10. Go 接口與 C++ 接口有何異同

    接口定義了一種規(guī)范,描述了類的行為和功能,而不做具體實現(xiàn)。

    C++ 的接口是使用抽象類來實現(xiàn)的,如果類中至少有一個函數(shù)被聲明為純虛函數(shù),則這個類就是抽象類。純虛函數(shù)是通過在聲明中使用 “= 0” 來指定的。例如:

    class Shape {public:// 純虛函數(shù)virtual double getArea() = 0;private:string name; // 名稱 };

    設(shè)計抽象類的目的,是為了給其他類提供一個可以繼承的適當(dāng)?shù)幕悺3橄箢惒荒鼙挥糜趯嵗瘜ο?#xff0c;它只能作為接口使用。

    派生類需要明確地聲明它繼承自基類,并且需要實現(xiàn)基類中所有的純虛函數(shù)。

    C++ 定義接口的方式稱為“侵入式”,而 Go 采用的是 “非侵入式”,不需要顯式聲明,只需要實現(xiàn)接口定義的函數(shù),編譯器自動會識別。

    C++ 和 Go 在定義接口方式上的不同,也導(dǎo)致了底層實現(xiàn)上的不同。C++ 通過虛函數(shù)表來實現(xiàn)基類調(diào)用派生類的函數(shù);而 Go 通過?itab?中的?fun?字段來實現(xiàn)接口變量調(diào)用實體類型的函數(shù)。C++ 中的虛函數(shù)表是在編譯期生成的;而 Go 的?itab?中的?fun?字段是在運行期間動態(tài)生成的。原因在于,Go 中實體類型可能會無意中實現(xiàn) N 多接口,很多接口并不是本來需要的,所以不能為類型實現(xiàn)的所有接口都生成一個?itab, 這也是“非侵入式”帶來的影響;這在 C++ 中是不存在的,因為派生需要顯示聲明它繼承自哪個基類。

    總結(jié)

    以上是生活随笔為你收集整理的golang 接口类型 interface 简介使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    四虎国产精品免费久久 | 波多野结衣 黑人 | 内射白嫩少妇超碰 | 亚洲成熟女人毛毛耸耸多 | 亚洲一区二区三区香蕉 | 欧美日韩视频无码一区二区三 | 亚洲中文字幕无码中文字在线 | 国产亚洲精品久久久久久大师 | 久青草影院在线观看国产 | 中文字幕乱码人妻无码久久 | 精品国产aⅴ无码一区二区 | 大色综合色综合网站 | 欧美丰满少妇xxxx性 | 亚洲精品一区二区三区大桥未久 | 动漫av网站免费观看 | 88国产精品欧美一区二区三区 | 无遮无挡爽爽免费视频 | 欧美性猛交内射兽交老熟妇 | 亚洲精品久久久久久一区二区 | 成人无码视频在线观看网站 | 麻豆国产丝袜白领秘书在线观看 | 精品无码国产一区二区三区av | 成年女人永久免费看片 | 人人澡人摸人人添 | 亚洲人成影院在线无码按摩店 | 日本在线高清不卡免费播放 | 乌克兰少妇性做爰 | 无码人妻丰满熟妇区毛片18 | 日本一本二本三区免费 | 中文字幕色婷婷在线视频 | 亚洲色偷偷偷综合网 | 性欧美牲交xxxxx视频 | 国产熟妇高潮叫床视频播放 | 久久亚洲国产成人精品性色 | 国产午夜福利100集发布 | 亚洲精品久久久久中文第一幕 | 精品人妻人人做人人爽 | 一个人免费观看的www视频 | 狠狠噜狠狠狠狠丁香五月 | 亚洲a无码综合a国产av中文 | 国产麻豆精品精东影业av网站 | 亚洲人成无码网www | 最近中文2019字幕第二页 | 欧美激情一区二区三区成人 | 精品偷拍一区二区三区在线看 | 国产激情艳情在线看视频 | 国产精品永久免费视频 | 99视频精品全部免费免费观看 | 亚洲日韩一区二区三区 | 久久精品国产精品国产精品污 | 中文字幕色婷婷在线视频 | 日本精品人妻无码77777 天堂一区人妻无码 | 欧美激情一区二区三区成人 | 日本精品少妇一区二区三区 | 曰本女人与公拘交酡免费视频 | 久激情内射婷内射蜜桃人妖 | 亚洲欧洲日本综合aⅴ在线 | 精品国产一区二区三区四区在线看 | 日韩精品久久久肉伦网站 | 丁香啪啪综合成人亚洲 | 成年美女黄网站色大免费全看 | 欧美野外疯狂做受xxxx高潮 | 国产成人精品必看 | 亚洲欧美综合区丁香五月小说 | 麻豆国产丝袜白领秘书在线观看 | 欧美真人作爱免费视频 | 黑人大群体交免费视频 | 亚洲精品一区二区三区四区五区 | 激情国产av做激情国产爱 | 国产色在线 | 国产 | av无码久久久久不卡免费网站 | 国产热a欧美热a在线视频 | 久久99久久99精品中文字幕 | 精品国偷自产在线视频 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美真人作爱免费视频 | 自拍偷自拍亚洲精品10p | 成人亚洲精品久久久久 | 亚洲欧美色中文字幕在线 | 亚洲国产精品久久久天堂 | 国产99久久精品一区二区 | 国内老熟妇对白xxxxhd | 黑人巨大精品欧美黑寡妇 | 国产在线精品一区二区高清不卡 | 久久婷婷五月综合色国产香蕉 | 少妇愉情理伦片bd | 精品少妇爆乳无码av无码专区 | 黑人粗大猛烈进出高潮视频 | 日本乱人伦片中文三区 | 国产内射老熟女aaaa | 婷婷色婷婷开心五月四房播播 | 天堂亚洲2017在线观看 | 少妇无码av无码专区在线观看 | 国产亚洲精品久久久久久国模美 | 又湿又紧又大又爽a视频国产 | 精品国产麻豆免费人成网站 | 久激情内射婷内射蜜桃人妖 | 初尝人妻少妇中文字幕 | 国产区女主播在线观看 | 日本爽爽爽爽爽爽在线观看免 | 亚洲中文字幕无码中文字在线 | 国产内射爽爽大片视频社区在线 | 欧美亚洲日韩国产人成在线播放 | 精品人妻中文字幕有码在线 | 久久99精品久久久久久动态图 | 高清国产亚洲精品自在久久 | 亚洲精品www久久久 | 熟女俱乐部五十路六十路av | 久久久久久a亚洲欧洲av冫 | 中文无码精品a∨在线观看不卡 | 久久久久av无码免费网 | 婷婷丁香六月激情综合啪 | 红桃av一区二区三区在线无码av | 精品aⅴ一区二区三区 | 精品无码国产自产拍在线观看蜜 | 国产精品无码成人午夜电影 | 国产99久久精品一区二区 | 88国产精品欧美一区二区三区 | 内射后入在线观看一区 | 99久久久无码国产aaa精品 | 亚洲一区av无码专区在线观看 | 亚洲中文字幕无码中字 | 东京一本一道一二三区 | 丝袜足控一区二区三区 | 国产极品美女高潮无套在线观看 | 亚洲自偷自偷在线制服 | 黄网在线观看免费网站 | 无码人妻黑人中文字幕 | 久久精品人妻少妇一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 亚洲最大成人网站 | 粗大的内捧猛烈进出视频 | 亚洲 欧美 激情 小说 另类 | 久久天天躁夜夜躁狠狠 | 国产精品人人爽人人做我的可爱 | 亚洲日韩中文字幕在线播放 | 青春草在线视频免费观看 | 成人精品一区二区三区中文字幕 | 精品国产av色一区二区深夜久久 | 国产精品办公室沙发 | 亚洲午夜久久久影院 | 无码一区二区三区在线 | 国产精品美女久久久久av爽李琼 | 青青久在线视频免费观看 | 国产亚洲精品久久久久久久 | 精品水蜜桃久久久久久久 | 国产精品a成v人在线播放 | 亚洲日韩av一区二区三区四区 | 久久综合久久自在自线精品自 | 少妇愉情理伦片bd | 荡女精品导航 | 国语精品一区二区三区 | 国产精品嫩草久久久久 | 国产特级毛片aaaaaa高潮流水 | 国产熟女一区二区三区四区五区 | 欧美性色19p | 欧美日韩人成综合在线播放 | 黑人巨大精品欧美黑寡妇 | 亚洲人成影院在线无码按摩店 | 人人妻人人藻人人爽欧美一区 | 亚洲啪av永久无码精品放毛片 | 无码国产激情在线观看 | 欧美激情一区二区三区成人 | 红桃av一区二区三区在线无码av | 精品夜夜澡人妻无码av蜜桃 | 国产精品久久久一区二区三区 | 无码人妻出轨黑人中文字幕 | 国内精品人妻无码久久久影院蜜桃 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲一区二区三区在线观看网站 | av无码不卡在线观看免费 | 欧美亚洲日韩国产人成在线播放 | 日本丰满护士爆乳xxxx | 精品偷自拍另类在线观看 | 亚洲综合久久一区二区 | 丁香花在线影院观看在线播放 | 日本一区二区三区免费播放 | 4hu四虎永久在线观看 | 中文字幕日产无线码一区 | 精品久久久久久人妻无码中文字幕 | 欧美老妇交乱视频在线观看 | 日日橹狠狠爱欧美视频 | 漂亮人妻洗澡被公强 日日躁 | 亚洲伊人久久精品影院 | 97精品人妻一区二区三区香蕉 | 在线视频网站www色 | 2020久久超碰国产精品最新 | 日本一区二区三区免费高清 | 久久精品女人天堂av免费观看 | 无码av岛国片在线播放 | 一个人看的www免费视频在线观看 | 日日干夜夜干 | 99麻豆久久久国产精品免费 | 精品无人区无码乱码毛片国产 | 娇妻被黑人粗大高潮白浆 | 日本大香伊一区二区三区 | 午夜精品一区二区三区的区别 | 午夜肉伦伦影院 | 四虎国产精品一区二区 | 欧美 日韩 人妻 高清 中文 | 国产人妻精品午夜福利免费 | 久久这里只有精品视频9 | 欧美激情一区二区三区成人 | 国产精品久久久久久亚洲毛片 | 啦啦啦www在线观看免费视频 | 蜜桃视频插满18在线观看 | 色综合久久88色综合天天 | 国产福利视频一区二区 | 国内丰满熟女出轨videos | 中文字幕无码免费久久99 | 国产成人一区二区三区在线观看 | 亚洲欧美日韩综合久久久 | 欧美成人免费全部网站 | 97精品人妻一区二区三区香蕉 | 日韩欧美中文字幕公布 | 日本精品人妻无码免费大全 | 国产口爆吞精在线视频 | 中文字幕乱码中文乱码51精品 | 亚洲国产精品久久久久久 | 丝袜 中出 制服 人妻 美腿 | 日本熟妇乱子伦xxxx | 婷婷五月综合激情中文字幕 | 国产精品久久国产三级国 | 亚洲国产欧美在线成人 | 免费观看的无遮挡av | 丰满人妻被黑人猛烈进入 | 久久精品无码一区二区三区 | 国产精品办公室沙发 | 999久久久国产精品消防器材 | 免费无码一区二区三区蜜桃大 | 性啪啪chinese东北女人 | 99久久精品国产一区二区蜜芽 | 欧美日韩在线亚洲综合国产人 | 国精产品一区二区三区 | 亚洲成a人片在线观看无码3d | 性色欲网站人妻丰满中文久久不卡 | 无码人妻丰满熟妇区毛片18 | 狠狠色噜噜狠狠狠狠7777米奇 | 久久99国产综合精品 | 国产色在线 | 国产 | 激情综合激情五月俺也去 | 国产高清不卡无码视频 | 暴力强奷在线播放无码 | 亚洲色欲久久久综合网东京热 | 国产精品无码成人午夜电影 | 99视频精品全部免费免费观看 | 四十如虎的丰满熟妇啪啪 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品igao视频网 | 熟妇人妻激情偷爽文 | 福利一区二区三区视频在线观看 | 波多野结衣一区二区三区av免费 | 九月婷婷人人澡人人添人人爽 | 日日碰狠狠躁久久躁蜜桃 | www国产亚洲精品久久网站 | 中文字幕无线码免费人妻 | 欧美日韩综合一区二区三区 | 妺妺窝人体色www在线小说 | 国产成人精品三级麻豆 | 亚洲а∨天堂久久精品2021 | 国产精品国产三级国产专播 | 欧美午夜特黄aaaaaa片 | 玩弄中年熟妇正在播放 | 麻豆果冻传媒2021精品传媒一区下载 | 久久久久久九九精品久 | 亚洲中文字幕无码中字 | 日日摸日日碰夜夜爽av | 丰满人妻精品国产99aⅴ | 精品一区二区三区无码免费视频 | 亚洲精品一区二区三区四区五区 | 亚洲日本va中文字幕 | 亚洲精品久久久久久久久久久 | 少妇的肉体aa片免费 | 亚洲熟熟妇xxxx | 色偷偷人人澡人人爽人人模 | 中文字幕无码av激情不卡 | 亚洲国产精品一区二区美利坚 | 99久久精品国产一区二区蜜芽 | 国产网红无码精品视频 | 亚洲va中文字幕无码久久不卡 | 人妻互换免费中文字幕 | 亚洲毛片av日韩av无码 | 久久99热只有频精品8 | 免费无码一区二区三区蜜桃大 | 国产精品18久久久久久麻辣 | 国产美女精品一区二区三区 | 色欲人妻aaaaaaa无码 | 久久人人爽人人爽人人片ⅴ | 色综合久久久无码网中文 | 欧美第一黄网免费网站 | 欧美人与物videos另类 | 成人影院yy111111在线观看 | 精品乱码久久久久久久 | 国产人妻精品午夜福利免费 | 色综合视频一区二区三区 | 日本精品人妻无码77777 天堂一区人妻无码 | 久久亚洲精品中文字幕无男同 | 精品国产aⅴ无码一区二区 | 日韩精品成人一区二区三区 | 色婷婷av一区二区三区之红樱桃 | 久久国产劲爆∧v内射 | a国产一区二区免费入口 | 一二三四社区在线中文视频 | 亚洲人成影院在线观看 | 无码av最新清无码专区吞精 | 久久久中文字幕日本无吗 | 成人片黄网站色大片免费观看 | 亚洲精品一区二区三区大桥未久 | 久热国产vs视频在线观看 | 国产午夜福利亚洲第一 | 天天拍夜夜添久久精品大 | 日韩在线不卡免费视频一区 | 亚洲人亚洲人成电影网站色 | 国产黑色丝袜在线播放 | 波多野结衣av一区二区全免费观看 | 欧美丰满老熟妇xxxxx性 | 一本无码人妻在中文字幕免费 | 99久久精品国产一区二区蜜芽 | 欧美人与物videos另类 | 色综合久久网 | 亚洲s色大片在线观看 | 久久人妻内射无码一区三区 | 无套内谢的新婚少妇国语播放 | 日韩精品一区二区av在线 | 久久综合给久久狠狠97色 | 中文字幕人成乱码熟女app | 一个人看的www免费视频在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 麻豆国产人妻欲求不满 | 超碰97人人做人人爱少妇 | 国产精品久久久久无码av色戒 | 亚洲色欲色欲欲www在线 | 国产香蕉97碰碰久久人人 | 精品少妇爆乳无码av无码专区 | 久久精品丝袜高跟鞋 | 成人无码视频在线观看网站 | 性生交大片免费看女人按摩摩 | 亚洲男人av香蕉爽爽爽爽 | 天天躁日日躁狠狠躁免费麻豆 | 国产无av码在线观看 | 人人爽人人澡人人高潮 | 激情爆乳一区二区三区 | 日本乱人伦片中文三区 | 麻豆果冻传媒2021精品传媒一区下载 | 欧美成人午夜精品久久久 | 四虎影视成人永久免费观看视频 | 4hu四虎永久在线观看 | 亚洲男人av香蕉爽爽爽爽 | av在线亚洲欧洲日产一区二区 | 无套内谢老熟女 | 国产亚洲tv在线观看 | 国产精品福利视频导航 | 亚洲午夜福利在线观看 | 少女韩国电视剧在线观看完整 | 免费国产黄网站在线观看 | 久久久国产一区二区三区 | 丰满少妇高潮惨叫视频 | 亚欧洲精品在线视频免费观看 | 亚洲精品国偷拍自产在线麻豆 | 天天躁夜夜躁狠狠是什么心态 | 中国女人内谢69xxxxxa片 | 亚洲成av人片在线观看无码不卡 | 领导边摸边吃奶边做爽在线观看 | 99er热精品视频 | 2020久久香蕉国产线看观看 | 免费乱码人妻系列无码专区 | 精品国产av色一区二区深夜久久 | 搡女人真爽免费视频大全 | 青青青爽视频在线观看 | 欧美丰满熟妇xxxx | 亚洲精品久久久久久一区二区 | 亚洲gv猛男gv无码男同 | 国产熟妇高潮叫床视频播放 | 人人妻人人澡人人爽人人精品浪潮 | 玩弄少妇高潮ⅹxxxyw | 精品一二三区久久aaa片 | 少妇无套内谢久久久久 | 成人一在线视频日韩国产 | 国产人成高清在线视频99最全资源 | 亚洲精品综合一区二区三区在线 | 久久精品中文字幕一区 | 亚洲成色www久久网站 | 国产精品第一国产精品 | 色狠狠av一区二区三区 | 亚洲日韩一区二区 | 欧美zoozzooz性欧美 | 久久婷婷五月综合色国产香蕉 | 妺妺窝人体色www在线小说 | 小鲜肉自慰网站xnxx | 1000部夫妻午夜免费 | 日本精品久久久久中文字幕 | 欧美喷潮久久久xxxxx | 亚洲精品一区二区三区大桥未久 | 亚洲日韩一区二区 | 成人精品视频一区二区 | 日韩av无码一区二区三区不卡 | 国产精品多人p群无码 | 高清国产亚洲精品自在久久 | 免费无码的av片在线观看 | 国产亚洲精品久久久久久 | 精品国产乱码久久久久乱码 | 欧美成人免费全部网站 | 国产精品久久久午夜夜伦鲁鲁 | 国产精品无码成人午夜电影 | 精品无码av一区二区三区 | 乱码av麻豆丝袜熟女系列 | 亚洲va欧美va天堂v国产综合 | 亚洲中文字幕无码中文字在线 | 无码人妻少妇伦在线电影 | 久久亚洲a片com人成 | 中文字幕亚洲情99在线 | 欧美日韩人成综合在线播放 | 好男人社区资源 | 日产精品99久久久久久 | 精品厕所偷拍各类美女tp嘘嘘 | 免费观看黄网站 | 久久精品丝袜高跟鞋 | 国产一区二区三区四区五区加勒比 | 永久黄网站色视频免费直播 | 国产艳妇av在线观看果冻传媒 | 国产免费无码一区二区视频 | 97精品人妻一区二区三区香蕉 | 久久久亚洲欧洲日产国码αv | av无码久久久久不卡免费网站 | 日韩欧美群交p片內射中文 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美变态另类xxxx | 97无码免费人妻超级碰碰夜夜 | 亚洲国产一区二区三区在线观看 | 一本久久伊人热热精品中文字幕 | 成人aaa片一区国产精品 | 亚洲自偷自拍另类第1页 | 在教室伦流澡到高潮hnp视频 | 国产乱人伦偷精品视频 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 又黄又爽又色的视频 | 女人被男人躁得好爽免费视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 最近免费中文字幕中文高清百度 | 色五月五月丁香亚洲综合网 | 色综合久久中文娱乐网 | www成人国产高清内射 | 久久亚洲中文字幕无码 | 熟妇女人妻丰满少妇中文字幕 | aa片在线观看视频在线播放 | 国产成人无码区免费内射一片色欲 | 精品无码国产自产拍在线观看蜜 | 骚片av蜜桃精品一区 | 午夜成人1000部免费视频 | 国产精品永久免费视频 | 亚洲人成影院在线无码按摩店 | 国产免费观看黄av片 | 夜夜夜高潮夜夜爽夜夜爰爰 | 在线成人www免费观看视频 | 亚洲欧美国产精品久久 | 国产精品成人av在线观看 | 日本爽爽爽爽爽爽在线观看免 | 精品夜夜澡人妻无码av蜜桃 | 欧美精品无码一区二区三区 | 一本久道久久综合狠狠爱 | 国产精品久久久午夜夜伦鲁鲁 | 久久久久亚洲精品男人的天堂 | 国产精品亚洲专区无码不卡 | 中文字幕乱码中文乱码51精品 | 欧洲极品少妇 | 色 综合 欧美 亚洲 国产 | 国产电影无码午夜在线播放 | 一个人看的www免费视频在线观看 | 国产精品久久久一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 亚洲欧美精品aaaaaa片 | 久久久www成人免费毛片 | 兔费看少妇性l交大片免费 | 久久久av男人的天堂 | 国产精品欧美成人 | 久久久久久久久888 | 亚洲自偷自拍另类第1页 | 国产av无码专区亚洲a∨毛片 | 2019nv天堂香蕉在线观看 | 国产后入清纯学生妹 | 色综合天天综合狠狠爱 | 亚洲色偷偷男人的天堂 | 四虎4hu永久免费 | 乱码av麻豆丝袜熟女系列 | 国产精品人人爽人人做我的可爱 | 激情综合激情五月俺也去 | 国产做国产爱免费视频 | 夜夜高潮次次欢爽av女 | 免费网站看v片在线18禁无码 | 精品人妻中文字幕有码在线 | 国产偷国产偷精品高清尤物 | 日韩少妇白浆无码系列 | 成在人线av无码免费 | 美女毛片一区二区三区四区 | 国产av剧情md精品麻豆 | 日本欧美一区二区三区乱码 | 精品 日韩 国产 欧美 视频 | 狂野欧美激情性xxxx | 国产 浪潮av性色四虎 | 色一情一乱一伦一区二区三欧美 | 欧美一区二区三区视频在线观看 | 国内综合精品午夜久久资源 | 国产精品爱久久久久久久 | 久久久精品成人免费观看 | 18禁黄网站男男禁片免费观看 | 国产真实伦对白全集 | 99re在线播放 | 在线а√天堂中文官网 | 日本一区二区三区免费高清 | 中文字幕无码av激情不卡 | 色爱情人网站 | 无码精品国产va在线观看dvd | 一本色道久久综合亚洲精品不卡 | 亚洲七七久久桃花影院 | 3d动漫精品啪啪一区二区中 | 大肉大捧一进一出视频出来呀 | 国产成人无码区免费内射一片色欲 | 国产亚洲精品久久久久久国模美 | 亚洲熟妇色xxxxx亚洲 | 日日噜噜噜噜夜夜爽亚洲精品 | 色婷婷久久一区二区三区麻豆 | 国产成人无码午夜视频在线观看 | 久久99国产综合精品 | 女人和拘做爰正片视频 | 天天摸天天碰天天添 | 国产成人精品三级麻豆 | 国产熟妇高潮叫床视频播放 | ass日本丰满熟妇pics | 亚洲色大成网站www国产 | 国产精品理论片在线观看 | 亚洲色大成网站www国产 | 牛和人交xxxx欧美 | 精品国产一区av天美传媒 | 少妇激情av一区二区 | 中文字幕av伊人av无码av | 无码乱肉视频免费大全合集 | 2020久久超碰国产精品最新 | 97久久国产亚洲精品超碰热 | 日本免费一区二区三区最新 | 中文字幕无码视频专区 | 色综合视频一区二区三区 | 亚洲国产精品久久久久久 | 午夜精品久久久内射近拍高清 | 波多野结衣av在线观看 | 国产亚洲美女精品久久久2020 | 夜夜高潮次次欢爽av女 | 成人精品视频一区二区 | 色欲久久久天天天综合网精品 | 欧美丰满熟妇xxxx性ppx人交 | 精品久久久无码中文字幕 | 久久久久久久人妻无码中文字幕爆 | 漂亮人妻洗澡被公强 日日躁 | 成在人线av无码免观看麻豆 | 日本丰满熟妇videos | 国产成人无码专区 | 亚洲精品无码人妻无码 | 又色又爽又黄的美女裸体网站 | 亚洲码国产精品高潮在线 | 蜜桃av抽搐高潮一区二区 | 少妇人妻大乳在线视频 | 亚洲小说春色综合另类 | 少妇高潮喷潮久久久影院 | 国产人妖乱国产精品人妖 | 国产两女互慰高潮视频在线观看 | 国产sm调教视频在线观看 | v一区无码内射国产 | 久久精品国产99久久6动漫 | 中文字幕av无码一区二区三区电影 | 少妇愉情理伦片bd | 久久久av男人的天堂 | www一区二区www免费 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲gv猛男gv无码男同 | 亚洲综合久久一区二区 | 中文字幕中文有码在线 | 国产人成高清在线视频99最全资源 | 国产极品美女高潮无套在线观看 | √8天堂资源地址中文在线 | 亚洲欧美日韩成人高清在线一区 | 任你躁在线精品免费 | 99久久精品国产一区二区蜜芽 | 日日碰狠狠丁香久燥 | 少妇的肉体aa片免费 | 无码成人精品区在线观看 | 永久免费精品精品永久-夜色 | 最近免费中文字幕中文高清百度 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 精品人妻人人做人人爽夜夜爽 | 性色欲网站人妻丰满中文久久不卡 | 捆绑白丝粉色jk震动捧喷白浆 | 日韩精品a片一区二区三区妖精 | 国产成人无码av片在线观看不卡 | 国产精品高潮呻吟av久久4虎 | 国产精品亚洲专区无码不卡 | √天堂资源地址中文在线 | 未满小14洗澡无码视频网站 | 扒开双腿吃奶呻吟做受视频 | 精品夜夜澡人妻无码av蜜桃 | 国产午夜亚洲精品不卡下载 | 亚洲国产日韩a在线播放 | 综合激情五月综合激情五月激情1 | 对白脏话肉麻粗话av | 亚洲日韩乱码中文无码蜜桃臀网站 | 日产精品99久久久久久 | 狠狠亚洲超碰狼人久久 | 荡女精品导航 | 日本熟妇乱子伦xxxx | 久久99精品国产麻豆蜜芽 | 国产在线精品一区二区三区直播 | 成人性做爰aaa片免费看不忠 | 国产热a欧美热a在线视频 | 性欧美videos高清精品 | 色五月五月丁香亚洲综合网 | 久久99精品国产.久久久久 | 性欧美疯狂xxxxbbbb | 欧美精品无码一区二区三区 | 国产精品无码成人午夜电影 | 六十路熟妇乱子伦 | 国产亚洲精品久久久久久久久动漫 | 麻豆精产国品 | 亚洲色成人中文字幕网站 | 高中生自慰www网站 | 任你躁在线精品免费 | 国产成人无码专区 | 国产人妻精品一区二区三区 | 日韩视频 中文字幕 视频一区 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲精品国产品国语在线观看 | 无码乱肉视频免费大全合集 | 风流少妇按摩来高潮 | 亚洲成色在线综合网站 | 亚洲欧洲中文日韩av乱码 | 亚洲欧美国产精品专区久久 | 中文字幕中文有码在线 | 精品乱子伦一区二区三区 | 精品久久久久久亚洲精品 | 国产欧美熟妇另类久久久 | 少女韩国电视剧在线观看完整 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 大屁股大乳丰满人妻 | 国产内射爽爽大片视频社区在线 | www国产亚洲精品久久久日本 | 九月婷婷人人澡人人添人人爽 | 亚洲午夜久久久影院 | 亚洲综合无码久久精品综合 | 免费人成在线观看网站 | 97久久国产亚洲精品超碰热 | 国产亚洲欧美在线专区 | 久久久国产精品无码免费专区 | 伊人久久大香线焦av综合影院 | 四十如虎的丰满熟妇啪啪 | 免费人成在线视频无码 | 天天躁日日躁狠狠躁免费麻豆 | 人人妻人人澡人人爽人人精品 | 麻豆av传媒蜜桃天美传媒 | 欧美 亚洲 国产 另类 | 欧美35页视频在线观看 | 人妻插b视频一区二区三区 | 精品国产成人一区二区三区 | 中文字幕人妻丝袜二区 | 清纯唯美经典一区二区 | 成年美女黄网站色大免费视频 | 无码播放一区二区三区 | 国产亚洲精品久久久久久久 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲午夜无码久久 | 中文字幕+乱码+中文字幕一区 | 麻豆md0077饥渴少妇 | 久久精品国产99精品亚洲 | 精品成人av一区二区三区 | 国产成人综合在线女婷五月99播放 | 中文字幕日韩精品一区二区三区 | 扒开双腿疯狂进出爽爽爽视频 | 99久久精品午夜一区二区 | 久久精品中文闷骚内射 | 丰满少妇人妻久久久久久 | 强奷人妻日本中文字幕 | 中文字幕 人妻熟女 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲欧美日韩成人高清在线一区 | 日韩精品a片一区二区三区妖精 | 亚洲人成网站免费播放 | 亚洲中文字幕在线观看 | 丰腴饱满的极品熟妇 | 爆乳一区二区三区无码 | 亚洲国产一区二区三区在线观看 | 日本一区二区三区免费高清 | 国产精品高潮呻吟av久久4虎 | 无码人妻精品一区二区三区下载 | 国内揄拍国内精品少妇国语 | 精品国产福利一区二区 | 国产明星裸体无码xxxx视频 | 国产成人综合在线女婷五月99播放 | 亚洲午夜久久久影院 | 亚洲精品欧美二区三区中文字幕 | 久久亚洲中文字幕精品一区 | 一本久久a久久精品亚洲 | 亚洲成a人片在线观看日本 | 亚洲精品无码人妻无码 | 强辱丰满人妻hd中文字幕 | 成人免费视频一区二区 | 少妇邻居内射在线 | 永久免费观看国产裸体美女 | 国产精品无码一区二区桃花视频 | 4hu四虎永久在线观看 | 亚洲中文字幕在线无码一区二区 | 国产片av国语在线观看 | 无码精品人妻一区二区三区av | 国产在线aaa片一区二区99 | 国产一区二区三区日韩精品 | 牲欲强的熟妇农村老妇女视频 | 天堂无码人妻精品一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品久久久久无码av色戒 | 大屁股大乳丰满人妻 | 一个人免费观看的www视频 | 无套内谢的新婚少妇国语播放 | 国产成人午夜福利在线播放 | 麻豆国产人妻欲求不满谁演的 | 377p欧洲日本亚洲大胆 | 亚洲自偷自拍另类第1页 | 在线成人www免费观看视频 | 亚洲成熟女人毛毛耸耸多 | 又粗又大又硬又长又爽 | 无套内射视频囯产 | 午夜福利试看120秒体验区 | 国产又粗又硬又大爽黄老大爷视 | 免费人成网站视频在线观看 | 亚洲欧美日韩成人高清在线一区 | 全黄性性激高免费视频 | 日韩精品成人一区二区三区 | 久久久久久av无码免费看大片 | 亚洲精品综合一区二区三区在线 | 又粗又大又硬又长又爽 | 综合人妻久久一区二区精品 | 久久精品人妻少妇一区二区三区 | 亚洲精品国产品国语在线观看 | 精品日本一区二区三区在线观看 | 夜夜躁日日躁狠狠久久av | 国产精品国产自线拍免费软件 | 国产性生大片免费观看性 | 性史性农村dvd毛片 | 成人精品天堂一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 久久无码专区国产精品s | 日本熟妇浓毛 | 自拍偷自拍亚洲精品10p | 玩弄中年熟妇正在播放 | 国产精品久久久久7777 | 99久久久无码国产精品免费 | 精品人妻中文字幕有码在线 | 99久久人妻精品免费二区 | 在线播放无码字幕亚洲 | 欧美人与动性行为视频 | 日韩精品成人一区二区三区 | 98国产精品综合一区二区三区 | 无码av最新清无码专区吞精 | 国产乱子伦视频在线播放 | 99er热精品视频 | 色窝窝无码一区二区三区色欲 | 18无码粉嫩小泬无套在线观看 | 亚洲一区二区三区无码久久 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲日韩av一区二区三区四区 | 丝袜人妻一区二区三区 | 无码毛片视频一区二区本码 | 亚洲国产精品毛片av不卡在线 | 四虎永久在线精品免费网址 | 午夜精品一区二区三区在线观看 | 黑人巨大精品欧美黑寡妇 | 亚洲s码欧洲m码国产av | 97久久超碰中文字幕 | 在线亚洲高清揄拍自拍一品区 | 天天摸天天碰天天添 | 亚洲日韩av片在线观看 | 人人超人人超碰超国产 | 中文精品久久久久人妻不卡 | 99久久久无码国产精品免费 | 精品人妻人人做人人爽 | 六十路熟妇乱子伦 | 熟女少妇人妻中文字幕 | 久久亚洲精品中文字幕无男同 | 国产无遮挡又黄又爽又色 | 国产农村妇女高潮大叫 | 欧美喷潮久久久xxxxx | 精品aⅴ一区二区三区 | 久久国内精品自在自线 | 99久久99久久免费精品蜜桃 | 免费网站看v片在线18禁无码 | 综合网日日天干夜夜久久 | 日韩av无码中文无码电影 | 日本乱人伦片中文三区 | 欧美人与禽猛交狂配 | 国产人妻久久精品二区三区老狼 | 亚洲精品久久久久中文第一幕 | 欧美变态另类xxxx | 国产精品va在线观看无码 | 清纯唯美经典一区二区 | 亚洲乱亚洲乱妇50p | 任你躁国产自任一区二区三区 | 国产午夜视频在线观看 | 亚洲精品中文字幕久久久久 | 久久午夜无码鲁丝片午夜精品 | 88国产精品欧美一区二区三区 | 性做久久久久久久久 | 丰腴饱满的极品熟妇 | 国产莉萝无码av在线播放 | 老子影院午夜精品无码 | 秋霞成人午夜鲁丝一区二区三区 | 日日麻批免费40分钟无码 | 免费国产黄网站在线观看 | 国产精品美女久久久网av | 国产综合在线观看 | 国产成人无码a区在线观看视频app | 在线成人www免费观看视频 | 国精品人妻无码一区二区三区蜜柚 | 老司机亚洲精品影院 | 男女猛烈xx00免费视频试看 | 欧美老熟妇乱xxxxx | 中文字幕乱码人妻二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲国产精品一区二区美利坚 | 久久久久久国产精品无码下载 | 日产精品高潮呻吟av久久 | 成人无码视频在线观看网站 | 精品久久久久久亚洲精品 | 一本久久伊人热热精品中文字幕 | 国产又爽又黄又刺激的视频 | 色婷婷av一区二区三区之红樱桃 | 国内揄拍国内精品少妇国语 | 丰满少妇熟乱xxxxx视频 | 丰满少妇女裸体bbw | 国产黄在线观看免费观看不卡 | 久久精品丝袜高跟鞋 | 亚洲中文无码av永久不收费 | 男人的天堂2018无码 | 搡女人真爽免费视频大全 | 久久久精品国产sm最大网站 | 欧美黑人巨大xxxxx | 蜜桃av抽搐高潮一区二区 | 久久久久免费精品国产 | 女人被爽到呻吟gif动态图视看 | 人妻少妇精品无码专区动漫 | 亚洲欧美日韩综合久久久 | 国产极品视觉盛宴 | 奇米影视7777久久精品 | 激情国产av做激情国产爱 | 性欧美大战久久久久久久 | 午夜精品久久久内射近拍高清 | 欧美激情内射喷水高潮 | 久久亚洲中文字幕无码 | 国产亚洲tv在线观看 | 久久国语露脸国产精品电影 | 无码任你躁久久久久久久 | 欧美 日韩 亚洲 在线 | 婷婷五月综合激情中文字幕 | 中文字幕无码乱人伦 | 午夜精品久久久内射近拍高清 | 色婷婷综合中文久久一本 | 日本爽爽爽爽爽爽在线观看免 | 国产乱码精品一品二品 | 精品一区二区不卡无码av | 在线天堂新版最新版在线8 | 亚洲一区av无码专区在线观看 | 97夜夜澡人人双人人人喊 | 真人与拘做受免费视频一 | 国产精品人妻一区二区三区四 | 欧美色就是色 | 国产色视频一区二区三区 | 成人毛片一区二区 | 18禁黄网站男男禁片免费观看 | 国产欧美精品一区二区三区 | 亚洲一区二区三区含羞草 | 狠狠色噜噜狠狠狠狠7777米奇 | 久久精品国产一区二区三区 | 国产偷抇久久精品a片69 | 性色欲网站人妻丰满中文久久不卡 | 日日碰狠狠躁久久躁蜜桃 | 国产一区二区三区四区五区加勒比 | 色综合久久中文娱乐网 | 97久久精品无码一区二区 | 亚洲一区二区三区偷拍女厕 | 亚洲精品久久久久avwww潮水 | а√资源新版在线天堂 | 国产办公室秘书无码精品99 | 国产无套内射久久久国产 | 亚洲午夜福利在线观看 | 黑人巨大精品欧美一区二区 | 欧美 日韩 人妻 高清 中文 | 国产成人无码a区在线观看视频app | 国产精品久久久午夜夜伦鲁鲁 | 少妇太爽了在线观看 | 国产成人无码专区 | 亚洲精品中文字幕乱码 | 性欧美大战久久久久久久 | 精品无码国产自产拍在线观看蜜 | 在线精品国产一区二区三区 | 成人影院yy111111在线观看 | 99麻豆久久久国产精品免费 | 久久精品人妻少妇一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 精品久久久久久人妻无码中文字幕 | 特黄特色大片免费播放器图片 | 午夜嘿嘿嘿影院 | 欧美成人免费全部网站 | 亚洲综合色区中文字幕 | 色婷婷欧美在线播放内射 | 国产在线精品一区二区三区直播 | 小鲜肉自慰网站xnxx | 日韩av无码一区二区三区不卡 | 国产熟妇高潮叫床视频播放 | 亚洲综合无码一区二区三区 | 一本精品99久久精品77 | 亚洲国产高清在线观看视频 | 大屁股大乳丰满人妻 | 久久99精品国产.久久久久 | 亚洲精品一区二区三区在线 | 国产麻豆精品一区二区三区v视界 | 日本肉体xxxx裸交 | 久久精品国产一区二区三区 | 国产成人人人97超碰超爽8 | 久久久久久久久888 | 亚洲欧美精品伊人久久 | 久久综合狠狠综合久久综合88 | 国内精品人妻无码久久久影院 | 人人妻在人人 | 蜜桃视频韩日免费播放 | 熟妇女人妻丰满少妇中文字幕 | 欧美日韩久久久精品a片 | aⅴ亚洲 日韩 色 图网站 播放 | 99精品国产综合久久久久五月天 | 蜜桃视频韩日免费播放 | www国产精品内射老师 | 欧美亚洲国产一区二区三区 | 亚洲va欧美va天堂v国产综合 | 日本欧美一区二区三区乱码 | 国产成人无码一二三区视频 | 无码国模国产在线观看 | 婷婷五月综合激情中文字幕 | 中文字幕av无码一区二区三区电影 | 久久久久久久久888 | 免费国产成人高清在线观看网站 | 亚洲国产欧美在线成人 | 成年美女黄网站色大免费全看 | 日韩人妻无码一区二区三区久久99 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 性啪啪chinese东北女人 | 噜噜噜亚洲色成人网站 | 97无码免费人妻超级碰碰夜夜 | 亚洲综合精品香蕉久久网 | 99久久婷婷国产综合精品青草免费 | 无码午夜成人1000部免费视频 | 正在播放东北夫妻内射 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久精品国产亚洲精品 | 未满小14洗澡无码视频网站 | 久久午夜夜伦鲁鲁片无码免费 | 久久久精品国产sm最大网站 | 色 综合 欧美 亚洲 国产 | 麻豆国产人妻欲求不满谁演的 | 国产绳艺sm调教室论坛 | 亚洲精品一区二区三区大桥未久 | 欧美丰满老熟妇xxxxx性 | 久久久久亚洲精品男人的天堂 | 一个人免费观看的www视频 | 亚洲精品国产品国语在线观看 | 少妇被黑人到高潮喷出白浆 | 成熟妇人a片免费看网站 | 高清国产亚洲精品自在久久 | 麻豆精品国产精华精华液好用吗 | 久久精品国产大片免费观看 | 亚洲精品午夜国产va久久成人 | 人妻互换免费中文字幕 | 色欲av亚洲一区无码少妇 | 精品国产乱码久久久久乱码 | 东京无码熟妇人妻av在线网址 | 日本欧美一区二区三区乱码 | 久久久亚洲欧洲日产国码αv | a国产一区二区免费入口 | 午夜福利不卡在线视频 | 日本欧美一区二区三区乱码 | 日本一区二区三区免费高清 | 精品熟女少妇av免费观看 | 免费人成网站视频在线观看 | 奇米影视7777久久精品人人爽 | 无码av岛国片在线播放 | 熟妇人妻中文av无码 | 曰韩少妇内射免费播放 | 精品成人av一区二区三区 | 台湾无码一区二区 | 亚洲国产精品一区二区第一页 | 亚洲中文字幕久久无码 | 日本爽爽爽爽爽爽在线观看免 | 国产精品二区一区二区aⅴ污介绍 | 亚洲gv猛男gv无码男同 | 无码免费一区二区三区 | 精品国产aⅴ无码一区二区 | 精品乱码久久久久久久 | 少妇邻居内射在线 | 日韩在线不卡免费视频一区 | 人妻aⅴ无码一区二区三区 | 色婷婷综合激情综在线播放 | 亚洲另类伦春色综合小说 | 啦啦啦www在线观看免费视频 | 国产综合在线观看 | 久久99精品国产麻豆蜜芽 | 人妻少妇精品无码专区二区 | 日本一卡2卡3卡四卡精品网站 | 国产精品久久国产三级国 | 最近中文2019字幕第二页 | 在线播放免费人成毛片乱码 | 亚洲精品国偷拍自产在线观看蜜桃 | 色婷婷久久一区二区三区麻豆 | 青青草原综合久久大伊人精品 | 丝袜人妻一区二区三区 | 国产超级va在线观看视频 | 亚洲呦女专区 | 欧美刺激性大交 | 理论片87福利理论电影 | 欧美黑人乱大交 | 亲嘴扒胸摸屁股激烈网站 | 久久久亚洲欧洲日产国码αv | 欧美三级a做爰在线观看 | 日本成熟视频免费视频 | 国产在线aaa片一区二区99 | 日日夜夜撸啊撸 | 成熟妇人a片免费看网站 | 亚洲欧洲日本无在线码 | 97久久超碰中文字幕 | 久久久久免费精品国产 | 领导边摸边吃奶边做爽在线观看 | 久久久精品456亚洲影院 | 大地资源中文第3页 | 无码福利日韩神码福利片 | 国产色在线 | 国产 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久人妻内射无码一区三区 | 人妻有码中文字幕在线 | 又湿又紧又大又爽a视频国产 | 少妇被黑人到高潮喷出白浆 | 性生交大片免费看l | 亚洲国产精华液网站w | 捆绑白丝粉色jk震动捧喷白浆 | 少妇人妻偷人精品无码视频 | 日韩精品无码一本二本三本色 | 国产成人精品久久亚洲高清不卡 | 成年美女黄网站色大免费全看 | 亚洲一区av无码专区在线观看 | 夫妻免费无码v看片 | 欧美黑人巨大xxxxx | 亚洲精品国产a久久久久久 | 粉嫩少妇内射浓精videos | 国产高清av在线播放 | 大肉大捧一进一出视频出来呀 | 亚洲中文字幕无码中文字在线 | 国产亚洲精品久久久久久 | 999久久久国产精品消防器材 | 精品国精品国产自在久国产87 | 色欲人妻aaaaaaa无码 | 久久99久久99精品中文字幕 | 性欧美大战久久久久久久 | а天堂中文在线官网 | 亚洲中文字幕乱码av波多ji | 搡女人真爽免费视频大全 | 国产日产欧产精品精品app | 中文字幕人成乱码熟女app | 日韩人妻无码一区二区三区久久99 | av香港经典三级级 在线 | 午夜精品一区二区三区在线观看 | www成人国产高清内射 | 国产免费久久久久久无码 | 国产精品毛多多水多 | 成人影院yy111111在线观看 | 成人精品天堂一区二区三区 | 亚洲成色在线综合网站 | 国产精品久久久久久亚洲毛片 | 色综合久久网 | 精品偷拍一区二区三区在线看 | 中文字幕乱码人妻二区三区 | 亚洲国精产品一二二线 | 精品一二三区久久aaa片 | 国产 精品 自在自线 | 久久综合给合久久狠狠狠97色 | 国内老熟妇对白xxxxhd | 精品aⅴ一区二区三区 | 国产精品99久久精品爆乳 | 国产精品久久久 | 日韩在线不卡免费视频一区 | 久精品国产欧美亚洲色aⅴ大片 | 国产人妻精品一区二区三区不卡 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲欧美国产精品久久 | 日本欧美一区二区三区乱码 | 久久亚洲日韩精品一区二区三区 | 亚洲精品无码国产 | 乌克兰少妇性做爰 | 欧美性猛交内射兽交老熟妇 | 久久99久久99精品中文字幕 | 精品亚洲成av人在线观看 | 国产精品第一区揄拍无码 | 真人与拘做受免费视频一 | 久久久www成人免费毛片 | 亚洲熟悉妇女xxx妇女av | 亚洲精品午夜国产va久久成人 | 欧美丰满熟妇xxxx性ppx人交 | 欧美人与禽zoz0性伦交 | 国产亚洲精品久久久久久国模美 | 亚洲小说春色综合另类 | 亚洲无人区一区二区三区 | 亚洲大尺度无码无码专区 | 亚洲精品综合五月久久小说 | 大色综合色综合网站 | 中文精品久久久久人妻不卡 | 久久99国产综合精品 | 日产精品高潮呻吟av久久 | 亚洲综合另类小说色区 | 疯狂三人交性欧美 | 欧美一区二区三区 | 曰本女人与公拘交酡免费视频 | 少妇邻居内射在线 | 国产人妻久久精品二区三区老狼 | 国产手机在线αⅴ片无码观看 | 日本精品久久久久中文字幕 | 国产特级毛片aaaaaaa高清 | 午夜精品久久久内射近拍高清 | 亚洲午夜福利在线观看 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产精品va在线播放 | 波多野结衣av一区二区全免费观看 | 国产激情一区二区三区 | 亚洲 欧美 激情 小说 另类 | 日本在线高清不卡免费播放 | 999久久久国产精品消防器材 | 国产国产精品人在线视 | 午夜精品久久久内射近拍高清 | 国产精品高潮呻吟av久久4虎 | 欧美阿v高清资源不卡在线播放 | 丰满岳乱妇在线观看中字无码 | 任你躁在线精品免费 | 免费网站看v片在线18禁无码 | 精品无码成人片一区二区98 | 在线天堂新版最新版在线8 | 亚洲 欧美 激情 小说 另类 | 7777奇米四色成人眼影 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久99热只有频精品8 | 思思久久99热只有频精品66 | 亚拍精品一区二区三区探花 | 久激情内射婷内射蜜桃人妖 | 久久久精品国产sm最大网站 | 九九久久精品国产免费看小说 | 综合激情五月综合激情五月激情1 | 欧美freesex黑人又粗又大 | 熟妇人妻无乱码中文字幕 | 国产人妻精品一区二区三区不卡 | 欧美日韩在线亚洲综合国产人 | аⅴ资源天堂资源库在线 | 少妇一晚三次一区二区三区 | 好爽又高潮了毛片免费下载 | 精品久久久久香蕉网 | 成人影院yy111111在线观看 | 欧美激情综合亚洲一二区 | 亚洲伊人久久精品影院 | 精品国产精品久久一区免费式 | 亚洲va欧美va天堂v国产综合 | 亚洲精品国产品国语在线观看 | 久久视频在线观看精品 | 国产精品亚洲综合色区韩国 | 天海翼激烈高潮到腰振不止 | 天堂无码人妻精品一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 国产亚洲精品久久久ai换 | 色噜噜亚洲男人的天堂 | 成人免费视频在线观看 | 精品亚洲韩国一区二区三区 | 日日橹狠狠爱欧美视频 | 美女扒开屁股让男人桶 | 国产真实伦对白全集 | 欧美老人巨大xxxx做受 | 国产真人无遮挡作爱免费视频 | 国产三级精品三级男人的天堂 | 成人影院yy111111在线观看 | 亚洲欧美国产精品久久 | 欧美熟妇另类久久久久久不卡 | 欧美zoozzooz性欧美 | 亚洲色欲久久久综合网东京热 | 欧美日韩久久久精品a片 | 日本一卡2卡3卡四卡精品网站 | 美女黄网站人色视频免费国产 | 国产精品毛多多水多 | av无码不卡在线观看免费 | 最新国产乱人伦偷精品免费网站 | 国产69精品久久久久app下载 | 国产精品二区一区二区aⅴ污介绍 | 久久熟妇人妻午夜寂寞影院 | 亚洲の无码国产の无码影院 | 国産精品久久久久久久 | 一本久久a久久精品vr综合 | 成人精品天堂一区二区三区 | 精品人人妻人人澡人人爽人人 | 欧美日本日韩 | 人人爽人人澡人人高潮 | 婷婷色婷婷开心五月四房播播 | 漂亮人妻洗澡被公强 日日躁 | 国产精品丝袜黑色高跟鞋 | 久激情内射婷内射蜜桃人妖 | 男女下面进入的视频免费午夜 | 少妇性l交大片 | 粉嫩少妇内射浓精videos | 成人免费视频在线观看 | 色综合久久网 | 国产肉丝袜在线观看 | 女人和拘做爰正片视频 | 中文字幕无码热在线视频 | 人妻夜夜爽天天爽三区 | 国产人妻精品一区二区三区不卡 | av人摸人人人澡人人超碰下载 | 午夜精品一区二区三区在线观看 | 亚洲精品午夜无码电影网 | 亚洲精品国产第一综合99久久 | 国产成人亚洲综合无码 | 久久亚洲a片com人成 | 国产亚洲精品精品国产亚洲综合 | 色综合视频一区二区三区 | 人妻少妇精品无码专区二区 | 午夜福利一区二区三区在线观看 | 国产两女互慰高潮视频在线观看 | 日本精品人妻无码免费大全 | 久久久精品人妻久久影视 | 午夜性刺激在线视频免费 | 久久综合给合久久狠狠狠97色 | 亚洲自偷自拍另类第1页 | 久久无码人妻影院 | 国产婷婷色一区二区三区在线 | 99久久亚洲精品无码毛片 | 丝袜 中出 制服 人妻 美腿 | 成 人 免费观看网站 | 99精品国产综合久久久久五月天 | 亚洲精品欧美二区三区中文字幕 | 国产精品a成v人在线播放 | 人人澡人人透人人爽 | 激情内射亚州一区二区三区爱妻 | 亚洲国产精品无码一区二区三区 | 丰满诱人的人妻3 | 丰满人妻一区二区三区免费视频 | 亚洲一区二区三区播放 | 亚洲区欧美区综合区自拍区 | 99久久人妻精品免费一区 | 日韩亚洲欧美精品综合 | 国语精品一区二区三区 | 色噜噜亚洲男人的天堂 | 中文字幕 亚洲精品 第1页 | 日日麻批免费40分钟无码 | 亚洲成av人片天堂网无码】 | 亚洲无人区午夜福利码高清完整版 | 国产精品美女久久久网av | 国产精品igao视频网 | 亚洲色偷偷偷综合网 | 国产免费久久久久久无码 | 久久久久久久久蜜桃 | 麻豆精品国产精华精华液好用吗 | 欧美老妇交乱视频在线观看 | 日日天日日夜日日摸 | 亚洲成a人片在线观看日本 | 亚洲综合精品香蕉久久网 | 国产成人久久精品流白浆 | 日韩欧美中文字幕在线三区 | 人妻少妇精品久久 | 日本护士xxxxhd少妇 | 日韩在线不卡免费视频一区 | 最近的中文字幕在线看视频 | 无码福利日韩神码福利片 | 无码人妻丰满熟妇区毛片18 | 欧美日韩精品 | 国产卡一卡二卡三 | www一区二区www免费 | 欧美黑人巨大xxxxx | 国产免费久久久久久无码 | 国产美女极度色诱视频www | 精品国精品国产自在久国产87 | 久久久久久a亚洲欧洲av冫 | 美女极度色诱视频国产 | 国产片av国语在线观看 | 日本高清一区免费中文视频 | 欧美亚洲日韩国产人成在线播放 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲日韩av片在线观看 | 成人免费无码大片a毛片 | 亚洲乱码日产精品bd | 国产精品99爱免费视频 | 欧美怡红院免费全部视频 | 欧洲vodafone精品性 | 婷婷色婷婷开心五月四房播播 | 强奷人妻日本中文字幕 | 亚洲gv猛男gv无码男同 | 人妻与老人中文字幕 | 伊人久久大香线焦av综合影院 | 色综合久久网 | 性欧美疯狂xxxxbbbb | 丰满妇女强制高潮18xxxx | 色窝窝无码一区二区三区色欲 | 99国产精品白浆在线观看免费 | 亚洲乱码日产精品bd | 亚洲另类伦春色综合小说 | 久久99热只有频精品8 | 亚洲国产精品成人久久蜜臀 | 国产一区二区三区影院 | 又大又硬又爽免费视频 | 一本无码人妻在中文字幕免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 人人妻人人澡人人爽欧美精品 | 亚洲日韩av一区二区三区中文 | 国产午夜福利亚洲第一 | 美女张开腿让人桶 | 亚洲日韩av一区二区三区中文 | 亚洲精品国偷拍自产在线观看蜜桃 | 99久久精品无码一区二区毛片 | 18禁止看的免费污网站 | 国产精品嫩草久久久久 | 久久精品国产一区二区三区 | 成人无码影片精品久久久 | 在线а√天堂中文官网 | 5858s亚洲色大成网站www | 在线成人www免费观看视频 | 中文字幕无码人妻少妇免费 | 无码播放一区二区三区 | 精品 日韩 国产 欧美 视频 | 日韩欧美中文字幕在线三区 | 精品久久久无码人妻字幂 | 久久国产精品二国产精品 | 久久久久成人精品免费播放动漫 | 久久99热只有频精品8 | 女人色极品影院 | 国产一区二区不卡老阿姨 | 特黄特色大片免费播放器图片 | 成人动漫在线观看 | 国内老熟妇对白xxxxhd | 精品国产乱码久久久久乱码 | 毛片内射-百度 | 丰满人妻被黑人猛烈进入 | 成人亚洲精品久久久久软件 | 国产av人人夜夜澡人人爽麻豆 | 亚洲精品成a人在线观看 | 国产另类ts人妖一区二区 | 牲欲强的熟妇农村老妇女 | 亚洲精品久久久久久一区二区 | 国产午夜无码视频在线观看 | 日韩欧美中文字幕公布 | 国产精品无码永久免费888 | 中文字幕日韩精品一区二区三区 | 草草网站影院白丝内射 | 人妻天天爽夜夜爽一区二区 | 亚洲区欧美区综合区自拍区 | 又大又硬又黄的免费视频 | 成年女人永久免费看片 | 国产电影无码午夜在线播放 | www国产亚洲精品久久网站 | 97精品人妻一区二区三区香蕉 | 亚洲色大成网站www | 正在播放东北夫妻内射 | 人妻中文无码久热丝袜 | 精品人人妻人人澡人人爽人人 | 中文无码精品a∨在线观看不卡 | 无码人中文字幕 | 国产高清av在线播放 | 亚洲成av人影院在线观看 | 一个人看的视频www在线 | 久久国产自偷自偷免费一区调 | 无码av岛国片在线播放 | 欧美性色19p | 水蜜桃色314在线观看 | 亚洲成色在线综合网站 | 永久免费精品精品永久-夜色 | 成在人线av无码免观看麻豆 | 成人精品视频一区二区三区尤物 | 西西人体www44rt大胆高清 | 亚洲综合在线一区二区三区 | 久久久精品人妻久久影视 | 无码帝国www无码专区色综合 | 国产精品久久久午夜夜伦鲁鲁 | 日本一卡2卡3卡四卡精品网站 | 装睡被陌生人摸出水好爽 | 少妇一晚三次一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 久久久久久久久蜜桃 | 牲欲强的熟妇农村老妇女视频 | 人妻熟女一区 | 熟妇人妻无乱码中文字幕 | 熟女俱乐部五十路六十路av | 中文字幕无线码免费人妻 | 欧美午夜特黄aaaaaa片 | 亚洲精品鲁一鲁一区二区三区 | 帮老师解开蕾丝奶罩吸乳网站 | 99久久亚洲精品无码毛片 | 搡女人真爽免费视频大全 | 人人超人人超碰超国产 | 欧美性生交xxxxx久久久 | 亚洲精品中文字幕久久久久 | 国产av一区二区精品久久凹凸 | 乱码av麻豆丝袜熟女系列 | 日本精品久久久久中文字幕 | 国产高潮视频在线观看 | 国产成人无码一二三区视频 | 性生交大片免费看女人按摩摩 | 欧洲欧美人成视频在线 | 免费中文字幕日韩欧美 | 亚洲国产精品一区二区第一页 | 国产艳妇av在线观看果冻传媒 | 熟女体下毛毛黑森林 | 99国产欧美久久久精品 | 亚洲欧洲日本综合aⅴ在线 | 东京无码熟妇人妻av在线网址 | 久久99精品久久久久久动态图 | 国产精品国产三级国产专播 | 熟女少妇人妻中文字幕 | 久久亚洲中文字幕精品一区 | 国产午夜亚洲精品不卡下载 | 无码乱肉视频免费大全合集 | 国产内射老熟女aaaa | 亚洲狠狠色丁香婷婷综合 | 色窝窝无码一区二区三区色欲 | 国产精品永久免费视频 | 最近免费中文字幕中文高清百度 | 人人爽人人澡人人人妻 | 欧美freesex黑人又粗又大 | 欧洲熟妇色 欧美 | 国产片av国语在线观看 | 精品 日韩 国产 欧美 视频 | 亚洲精品一区二区三区四区五区 | 亚洲日本在线电影 | 国产农村乱对白刺激视频 | 久久久久av无码免费网 | 国内综合精品午夜久久资源 | 国产精品久久久久9999小说 | 久久人人爽人人人人片 | 伊人久久大香线焦av综合影院 | 日本大香伊一区二区三区 | 婷婷六月久久综合丁香 | 夜夜躁日日躁狠狠久久av | 国精品人妻无码一区二区三区蜜柚 | 亚洲精品综合一区二区三区在线 | 伊人久久婷婷五月综合97色 | 乱人伦中文视频在线观看 | 色综合视频一区二区三区 | 强辱丰满人妻hd中文字幕 | 国产亚av手机在线观看 | 久久久精品人妻久久影视 | 日产国产精品亚洲系列 | 丝袜人妻一区二区三区 | 亚洲综合另类小说色区 | 麻豆av传媒蜜桃天美传媒 | 国产极品美女高潮无套在线观看 | 18无码粉嫩小泬无套在线观看 | 乱中年女人伦av三区 | 奇米影视888欧美在线观看 | 熟妇人妻中文av无码 | 欧美黑人巨大xxxxx | 天天摸天天碰天天添 | 一本精品99久久精品77 | 国产两女互慰高潮视频在线观看 | 青青青爽视频在线观看 | 国产激情综合五月久久 | 乱中年女人伦av三区 | 国产免费久久精品国产传媒 | 131美女爱做视频 | 18无码粉嫩小泬无套在线观看 | 久久这里只有精品视频9 | av无码电影一区二区三区 | 波多野结衣 黑人 | 欧美老熟妇乱xxxxx | 国产内射爽爽大片视频社区在线 | 人妻体内射精一区二区三四 | 无码中文字幕色专区 | 日日噜噜噜噜夜夜爽亚洲精品 | 高清无码午夜福利视频 | 亚洲一区二区三区国产精华液 | 最新版天堂资源中文官网 | 亚洲国产日韩a在线播放 | 四虎永久在线精品免费网址 | 日韩欧美中文字幕公布 | 狂野欧美激情性xxxx | 午夜无码区在线观看 | 国产无遮挡又黄又爽又色 | 人人妻人人澡人人爽人人精品 | 国产成人无码av一区二区 | 精品无码一区二区三区的天堂 | 99久久亚洲精品无码毛片 | ass日本丰满熟妇pics | 男人的天堂2018无码 | 日韩欧美成人免费观看 | 久久人妻内射无码一区三区 | 国产人妻大战黑人第1集 | 亚洲熟悉妇女xxx妇女av | 国产av无码专区亚洲awww | 4hu四虎永久在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲最大成人网站 | 久久 国产 尿 小便 嘘嘘 | 98国产精品综合一区二区三区 | 又紧又大又爽精品一区二区 | 亚洲 日韩 欧美 成人 在线观看 | 成人无码精品1区2区3区免费看 | 女人和拘做爰正片视频 | 高潮毛片无遮挡高清免费 | 中文字幕 人妻熟女 | a在线观看免费网站大全 | 亚洲日韩中文字幕在线播放 | a在线观看免费网站大全 | 一个人看的视频www在线 | 国产精品久久久久9999小说 | 成 人影片 免费观看 | 亚洲国产欧美日韩精品一区二区三区 | 国产成人久久精品流白浆 | 亚洲日本在线电影 | 无码av免费一区二区三区试看 | 日韩少妇白浆无码系列 | 亚洲一区二区三区无码久久 | 欧美老人巨大xxxx做受 | 日韩视频 中文字幕 视频一区 | 一个人免费观看的www视频 | 丰满少妇熟乱xxxxx视频 | 国产真实伦对白全集 | 理论片87福利理论电影 | 内射巨臀欧美在线视频 | 国产高清不卡无码视频 | 日本精品高清一区二区 | 国精产品一品二品国精品69xx | 青青草原综合久久大伊人精品 | 在线成人www免费观看视频 | 免费无码av一区二区 | 国产99久久精品一区二区 | 日本精品久久久久中文字幕 | 无码av最新清无码专区吞精 | 日产国产精品亚洲系列 | 色欲av亚洲一区无码少妇 | 人妻有码中文字幕在线 | 亚洲国产av美女网站 | 亚洲精品久久久久久一区二区 | 中文字幕乱码人妻二区三区 | 无码中文字幕色专区 | 久久精品无码一区二区三区 | 四虎影视成人永久免费观看视频 | 久久久精品国产sm最大网站 | 国产69精品久久久久app下载 | 国产午夜精品一区二区三区嫩草 | 色老头在线一区二区三区 | 国产精品无码成人午夜电影 | 少妇人妻大乳在线视频 | 夜夜夜高潮夜夜爽夜夜爰爰 | 无人区乱码一区二区三区 | 成人免费无码大片a毛片 | 无人区乱码一区二区三区 | 色噜噜亚洲男人的天堂 | 一本久久a久久精品亚洲 | 国产成人精品无码播放 | 国内精品人妻无码久久久影院蜜桃 | 国产三级久久久精品麻豆三级 | 国产网红无码精品视频 | 国产午夜亚洲精品不卡下载 | 性色欲网站人妻丰满中文久久不卡 | 2019午夜福利不卡片在线 | 久久久成人毛片无码 | 亚洲小说春色综合另类 | 亚洲va欧美va天堂v国产综合 | 一本一道久久综合久久 | 亚洲色欲色欲欲www在线 | 国产无av码在线观看 | 天天躁夜夜躁狠狠是什么心态 | 精品一区二区三区无码免费视频 | 亚洲爆乳精品无码一区二区三区 | 网友自拍区视频精品 | 国产激情无码一区二区 | 给我免费的视频在线观看 | 综合激情五月综合激情五月激情1 | 欧美日韩色另类综合 | 无码国内精品人妻少妇 | 55夜色66夜色国产精品视频 | 欧美人妻一区二区三区 | 成人性做爰aaa片免费看 | 国产精品丝袜黑色高跟鞋 | 精品欧美一区二区三区久久久 | 老熟女重囗味hdxx69 | 扒开双腿吃奶呻吟做受视频 | 欧美xxxx黑人又粗又长 | 久青草影院在线观看国产 | 国产极品美女高潮无套在线观看 | 国产亚洲欧美在线专区 | 妺妺窝人体色www在线小说 | 中文字幕 人妻熟女 | 最新国产乱人伦偷精品免费网站 | 日韩少妇内射免费播放 | 蜜桃视频插满18在线观看 | 日本一卡2卡3卡四卡精品网站 | 国产麻豆精品一区二区三区v视界 | 久9re热视频这里只有精品 | 奇米影视7777久久精品 | 国产av无码专区亚洲awww | 亚洲日韩精品欧美一区二区 | 国产亚洲精品久久久闺蜜 | 桃花色综合影院 | 国产特级毛片aaaaaa高潮流水 | 国产又爽又猛又粗的视频a片 | 亚洲s色大片在线观看 | 大地资源网第二页免费观看 | 欧洲精品码一区二区三区免费看 | 久久国内精品自在自线 | 两性色午夜视频免费播放 | 无码中文字幕色专区 | 日本饥渴人妻欲求不满 | www国产亚洲精品久久久日本 | 国产成人无码区免费内射一片色欲 | √8天堂资源地址中文在线 | 久久久久人妻一区精品色欧美 | 精品人人妻人人澡人人爽人人 | 国产99久久精品一区二区 | 亚洲综合色区中文字幕 | 欧美怡红院免费全部视频 | 三上悠亚人妻中文字幕在线 | 在线观看国产一区二区三区 | 久久综合久久自在自线精品自 | 久久综合给久久狠狠97色 | 一区二区传媒有限公司 | 乱码av麻豆丝袜熟女系列 | 精品国偷自产在线视频 | 国产内射老熟女aaaa | 国产三级久久久精品麻豆三级 | 亚洲一区二区三区国产精华液 | 两性色午夜免费视频 | 国产两女互慰高潮视频在线观看 | 久久精品视频在线看15 | 久久久久人妻一区精品色欧美 | 丰满人妻翻云覆雨呻吟视频 | 国语自产偷拍精品视频偷 | 色综合久久中文娱乐网 | 亚洲国产精品一区二区美利坚 | 亚洲中文字幕乱码av波多ji | 久久国产自偷自偷免费一区调 | 午夜时刻免费入口 | 蜜桃视频韩日免费播放 | 国模大胆一区二区三区 | 亚洲 欧美 激情 小说 另类 | 精品一区二区三区无码免费视频 | 亚洲精品一区三区三区在线观看 | 2020久久香蕉国产线看观看 | 免费人成在线观看网站 | 国产精品第一国产精品 | 人妻互换免费中文字幕 | 欧美日韩色另类综合 | 男人的天堂av网站 | 国内揄拍国内精品人妻 | 日本一区二区三区免费高清 | 人人妻人人澡人人爽人人精品浪潮 | 特大黑人娇小亚洲女 | 久久久av男人的天堂 | 蜜桃视频插满18在线观看 | 初尝人妻少妇中文字幕 | 狂野欧美性猛xxxx乱大交 | 亚洲熟女一区二区三区 | 亚洲日韩一区二区三区 | 麻豆成人精品国产免费 | 精品偷自拍另类在线观看 | 噜噜噜亚洲色成人网站 | 影音先锋中文字幕无码 | 中文字幕日产无线码一区 | 日韩精品无码一本二本三本色 | 亚洲日韩av一区二区三区中文 | 国产尤物精品视频 | 东京无码熟妇人妻av在线网址 | 国产午夜视频在线观看 | 99re在线播放 | 久久精品人人做人人综合 | 色综合久久中文娱乐网 | 377p欧洲日本亚洲大胆 | 永久黄网站色视频免费直播 | 欧美丰满老熟妇xxxxx性 |