久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(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)容還不錯,歡迎將生活随笔推薦給好友。

    亚洲男人av香蕉爽爽爽爽 | 亚洲s色大片在线观看 | 欧美熟妇另类久久久久久不卡 | 久久国产精品精品国产色婷婷 | 国产电影无码午夜在线播放 | 国产精品人人爽人人做我的可爱 | 图片小说视频一区二区 | 日本一卡2卡3卡四卡精品网站 | 黑人大群体交免费视频 | 欧美老人巨大xxxx做受 | 又色又爽又黄的美女裸体网站 | 99国产欧美久久久精品 | 四虎国产精品免费久久 | 兔费看少妇性l交大片免费 | 国产精品人妻一区二区三区四 | av无码不卡在线观看免费 | 国产精品二区一区二区aⅴ污介绍 | 国产办公室秘书无码精品99 | 真人与拘做受免费视频一 | 亚洲精品久久久久avwww潮水 | 女人被男人躁得好爽免费视频 | 欧美人与禽猛交狂配 | 沈阳熟女露脸对白视频 | 欧美35页视频在线观看 | 国产高清av在线播放 | 又大又硬又爽免费视频 | 少妇无码av无码专区在线观看 | 波多野结衣av在线观看 | 99久久精品午夜一区二区 | 亚洲高清偷拍一区二区三区 | 性开放的女人aaa片 | 成人无码影片精品久久久 | 日本熟妇乱子伦xxxx | 人妻互换免费中文字幕 | 亚洲精品美女久久久久久久 | 中文字幕日产无线码一区 | 国产又爽又猛又粗的视频a片 | 少妇被粗大的猛进出69影院 | 丝袜美腿亚洲一区二区 | 国产在线一区二区三区四区五区 | 国产综合色产在线精品 | 在线欧美精品一区二区三区 | 中文精品久久久久人妻不卡 | 亚洲中文字幕无码一久久区 | 亚洲呦女专区 | 无套内谢老熟女 | 午夜福利一区二区三区在线观看 | 97久久精品无码一区二区 | 日韩成人一区二区三区在线观看 | 天下第一社区视频www日本 | 女人高潮内射99精品 | 97夜夜澡人人爽人人喊中国片 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久久久成人片免费观看蜜芽 | 日韩 欧美 动漫 国产 制服 | 成人精品一区二区三区中文字幕 | 九月婷婷人人澡人人添人人爽 | 亚洲另类伦春色综合小说 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品久久久久久亚洲影视内衣 | 国产性生交xxxxx无码 | 一本久久a久久精品vr综合 | 精品无码一区二区三区的天堂 | 中文字幕无码视频专区 | 亚洲国产精品久久人人爱 | 中文字幕久久久久人妻 | 国产午夜手机精彩视频 | 在线观看欧美一区二区三区 | 国产国产精品人在线视 | 中文字幕久久久久人妻 | 少妇太爽了在线观看 | 精品国产福利一区二区 | 三级4级全黄60分钟 | 国产精品久久久久影院嫩草 | 中文字幕久久久久人妻 | aⅴ在线视频男人的天堂 | 最新国产乱人伦偷精品免费网站 | 思思久久99热只有频精品66 | 国产精品99爱免费视频 | 日韩亚洲欧美精品综合 | 中文字幕乱码中文乱码51精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 午夜福利一区二区三区在线观看 | 国产欧美精品一区二区三区 | 欧美性色19p | 粗大的内捧猛烈进出视频 | 国产精品久久久久久无码 | 亚洲伊人久久精品影院 | 亚洲国产精品无码一区二区三区 | 奇米影视888欧美在线观看 | 无码精品国产va在线观看dvd | 人妻互换免费中文字幕 | 波多野结衣高清一区二区三区 | 天堂在线观看www | 精品国产一区二区三区av 性色 | 午夜福利试看120秒体验区 | 激情五月综合色婷婷一区二区 | 欧美35页视频在线观看 | 人妻少妇被猛烈进入中文字幕 | 欧美阿v高清资源不卡在线播放 | 丝袜美腿亚洲一区二区 | 老熟女重囗味hdxx69 | 欧美老熟妇乱xxxxx | 国内精品久久毛片一区二区 | 精品无码国产一区二区三区av | 伊人色综合久久天天小片 | 一本久久伊人热热精品中文字幕 | 一区二区传媒有限公司 | 亚洲爆乳大丰满无码专区 | 亚洲天堂2017无码 | 久久国产精品萌白酱免费 | 亚洲 高清 成人 动漫 | 亚洲性无码av中文字幕 | 亚洲色无码一区二区三区 | 荫蒂被男人添的好舒服爽免费视频 | 国产成人久久精品流白浆 | 亚洲乱码日产精品bd | 久久久久亚洲精品中文字幕 | 一本无码人妻在中文字幕免费 | 综合激情五月综合激情五月激情1 | 中文字幕乱码人妻二区三区 | 欧美人与禽zoz0性伦交 | 欧美成人午夜精品久久久 | 日韩精品一区二区av在线 | 狠狠色色综合网站 | 国内丰满熟女出轨videos | 永久免费精品精品永久-夜色 | 大肉大捧一进一出视频出来呀 | 久久久久久亚洲精品a片成人 | 国产精品国产自线拍免费软件 | 女人被男人躁得好爽免费视频 | 久久久久久九九精品久 | 少妇邻居内射在线 | 国产一区二区三区四区五区加勒比 | 色诱久久久久综合网ywww | 久9re热视频这里只有精品 | 国产午夜无码精品免费看 | 国产在线无码精品电影网 | 亚洲人交乣女bbw | 51国偷自产一区二区三区 | 精品偷拍一区二区三区在线看 | 性色av无码免费一区二区三区 | 日欧一片内射va在线影院 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久99国产综合精品 | 丝袜 中出 制服 人妻 美腿 | 亚洲 激情 小说 另类 欧美 | 内射后入在线观看一区 | v一区无码内射国产 | 国产精品视频免费播放 | 国产综合色产在线精品 | 欧美午夜特黄aaaaaa片 | 成人欧美一区二区三区黑人 | 亚洲乱码国产乱码精品精 | 日本精品人妻无码77777 天堂一区人妻无码 | 免费观看黄网站 | 中文字幕乱码亚洲无线三区 | 久久久久se色偷偷亚洲精品av | 色综合久久久无码网中文 | 国产精品亚洲一区二区三区喷水 | 日欧一片内射va在线影院 | 久久精品中文字幕大胸 | 国产精品久免费的黄网站 | 亚洲综合久久一区二区 | 天天做天天爱天天爽综合网 | 蜜桃av抽搐高潮一区二区 | 少女韩国电视剧在线观看完整 | 亚洲国产成人av在线观看 | 亚洲国精产品一二二线 | 午夜精品久久久内射近拍高清 | 国产精品va在线播放 | 国产精品人人妻人人爽 | 国产女主播喷水视频在线观看 | 亚洲精品欧美二区三区中文字幕 | 99久久无码一区人妻 | 日韩人妻少妇一区二区三区 | 国产一区二区不卡老阿姨 | √天堂中文官网8在线 | 亚洲色www成人永久网址 | 国产 精品 自在自线 | 午夜精品一区二区三区在线观看 | 中文字幕乱码人妻二区三区 | 桃花色综合影院 | 国产成人亚洲综合无码 | 在线 国产 欧美 亚洲 天堂 | 漂亮人妻洗澡被公强 日日躁 | 窝窝午夜理论片影院 | 国产黄在线观看免费观看不卡 | 婷婷色婷婷开心五月四房播播 | 亚洲乱码日产精品bd | 国产黄在线观看免费观看不卡 | 好男人www社区 | 中文字幕无码日韩专区 | 国产片av国语在线观看 | 性欧美熟妇videofreesex | 国产真实夫妇视频 | 国产免费久久精品国产传媒 | 男人扒开女人内裤强吻桶进去 | 久久久久成人精品免费播放动漫 | 亚洲欧洲无卡二区视頻 | 精品久久久久久亚洲精品 | 人妻夜夜爽天天爽三区 | 无人区乱码一区二区三区 | 日本护士毛茸茸高潮 | 亚洲成a人片在线观看无码 | 97久久国产亚洲精品超碰热 | 亚洲の无码国产の无码影院 | 欧美亚洲国产一区二区三区 | 欧美丰满熟妇xxxx | 人人妻人人澡人人爽精品欧美 | 丰满少妇人妻久久久久久 | 天堂无码人妻精品一区二区三区 | 俺去俺来也在线www色官网 | 亚洲国产精品无码一区二区三区 | 丝袜足控一区二区三区 | 国产办公室秘书无码精品99 | 中文字幕乱码人妻无码久久 | 中文精品久久久久人妻不卡 | 99精品国产综合久久久久五月天 | 3d动漫精品啪啪一区二区中 | 国产精品二区一区二区aⅴ污介绍 | 国产精品福利视频导航 | 国产 精品 自在自线 | 亚洲国产综合无码一区 | 国产精品二区一区二区aⅴ污介绍 | 午夜福利一区二区三区在线观看 | 日本精品久久久久中文字幕 | 中文字幕无线码免费人妻 | 1000部啪啪未满十八勿入下载 | 亚洲精品鲁一鲁一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 国产精品igao视频网 | 国产精品99爱免费视频 | 国产麻豆精品精东影业av网站 | 成人av无码一区二区三区 | 亚洲国产欧美日韩精品一区二区三区 | 国产无套内射久久久国产 | 久久人人爽人人爽人人片ⅴ | 亚洲精品一区二区三区在线 | 日本一区二区三区免费播放 | 熟妇人妻无码xxx视频 | 日欧一片内射va在线影院 | 久久国产精品偷任你爽任你 | 国产av一区二区精品久久凹凸 | 国内揄拍国内精品少妇国语 | 国产精品亚洲一区二区三区喷水 | 欧美自拍另类欧美综合图片区 | 亚洲一区二区三区无码久久 | 国产手机在线αⅴ片无码观看 | 97色伦图片97综合影院 | 日韩欧美中文字幕在线三区 | 大肉大捧一进一出好爽视频 | 亚洲国产高清在线观看视频 | 国产乱人伦偷精品视频 | 久久精品国产99久久6动漫 | 特黄特色大片免费播放器图片 | 老熟女乱子伦 | 兔费看少妇性l交大片免费 | 性欧美videos高清精品 | 激情内射亚州一区二区三区爱妻 | 一本精品99久久精品77 | 色婷婷香蕉在线一区二区 | 国产成人一区二区三区别 | 国产欧美精品一区二区三区 | 色诱久久久久综合网ywww | 无码中文字幕色专区 | 精品欧美一区二区三区久久久 | 亚洲日韩精品欧美一区二区 | 天天综合网天天综合色 | 无码中文字幕色专区 | 欧洲熟妇精品视频 | 国产乱码精品一品二品 | 少女韩国电视剧在线观看完整 | 国产精品99爱免费视频 | 最近的中文字幕在线看视频 | 亚洲中文字幕无码中字 | 久久97精品久久久久久久不卡 | 久久久www成人免费毛片 | 55夜色66夜色国产精品视频 | 任你躁在线精品免费 | 国产午夜无码精品免费看 | 免费人成在线视频无码 | 国产艳妇av在线观看果冻传媒 | 男人扒开女人内裤强吻桶进去 | 国产av无码专区亚洲awww | 草草网站影院白丝内射 | 国产一区二区不卡老阿姨 | 天天躁夜夜躁狠狠是什么心态 | 久久这里只有精品视频9 | 狠狠亚洲超碰狼人久久 | 国产在线精品一区二区三区直播 | 国产成人无码av片在线观看不卡 | 亚洲综合无码一区二区三区 | 国产精品亚洲综合色区韩国 | 荫蒂被男人添的好舒服爽免费视频 | 午夜精品一区二区三区在线观看 | 亚洲精品一区国产 | 亚洲国产综合无码一区 | 亚洲色大成网站www | 久久这里只有精品视频9 | 国产真实伦对白全集 | 永久免费观看国产裸体美女 | 欧美大屁股xxxxhd黑色 | 大肉大捧一进一出视频出来呀 | 亚洲色大成网站www | 强奷人妻日本中文字幕 | 又黄又爽又色的视频 | 精品偷自拍另类在线观看 | 精品人妻人人做人人爽 | 久久综合给合久久狠狠狠97色 | 丁香花在线影院观看在线播放 | 学生妹亚洲一区二区 | 中文精品无码中文字幕无码专区 | 久久综合九色综合欧美狠狠 | 精品国产一区二区三区四区在线看 | 国产人妻久久精品二区三区老狼 | 搡女人真爽免费视频大全 | 国产深夜福利视频在线 | 国产网红无码精品视频 | 国产一精品一av一免费 | 久久综合狠狠综合久久综合88 | 中文字幕乱妇无码av在线 | 久久综合网欧美色妞网 | 麻豆人妻少妇精品无码专区 | 日本xxxx色视频在线观看免费 | 97夜夜澡人人爽人人喊中国片 | 夫妻免费无码v看片 | 国产亚洲精品久久久久久久 | 成人三级无码视频在线观看 | 未满小14洗澡无码视频网站 | 老太婆性杂交欧美肥老太 | 日本xxxx色视频在线观看免费 | 亚洲日韩av片在线观看 | 久在线观看福利视频 | 中文字幕人成乱码熟女app | 又粗又大又硬毛片免费看 | 97人妻精品一区二区三区 | 久久久久成人片免费观看蜜芽 | 在教室伦流澡到高潮hnp视频 | 国产尤物精品视频 | 日韩 欧美 动漫 国产 制服 | 装睡被陌生人摸出水好爽 | 天天拍夜夜添久久精品大 | 亚洲综合伊人久久大杳蕉 | 久久久国产一区二区三区 | 久久久久久国产精品无码下载 | 久久久中文字幕日本无吗 | 丰满肥臀大屁股熟妇激情视频 | 九九热爱视频精品 | 亚洲七七久久桃花影院 | 国产真实伦对白全集 | 一本久久伊人热热精品中文字幕 | 兔费看少妇性l交大片免费 | 久久综合九色综合欧美狠狠 | 国产 浪潮av性色四虎 | 国产精品美女久久久网av | 国产成人综合在线女婷五月99播放 | 美女毛片一区二区三区四区 | 一区二区三区乱码在线 | 欧洲 | 成人无码精品一区二区三区 | 国产精品永久免费视频 | 理论片87福利理论电影 | 国产suv精品一区二区五 | 日本一区二区三区免费播放 | 国产真实乱对白精彩久久 | 久9re热视频这里只有精品 | 国产在线无码精品电影网 | 国产av久久久久精东av | 红桃av一区二区三区在线无码av | 无码国内精品人妻少妇 | 一本色道久久综合亚洲精品不卡 | 久久精品国产亚洲精品 | 美女张开腿让人桶 | 亚洲日本一区二区三区在线 | 波多野结衣乳巨码无在线观看 | 人人妻人人澡人人爽精品欧美 | 亚洲精品国偷拍自产在线麻豆 | 国产精品久久精品三级 | 亚洲精品美女久久久久久久 | 在线亚洲高清揄拍自拍一品区 | 黑人粗大猛烈进出高潮视频 | 中文无码伦av中文字幕 | 成在人线av无码免观看麻豆 | 在线欧美精品一区二区三区 | 日本乱偷人妻中文字幕 | 国产一区二区不卡老阿姨 | 成人无码视频免费播放 | 亚洲精品综合五月久久小说 | 亚洲 日韩 欧美 成人 在线观看 | 久久久久久久人妻无码中文字幕爆 | 国产精品爱久久久久久久 | 伊人久久大香线蕉av一区二区 | 一个人看的视频www在线 | 精品熟女少妇av免费观看 | 亚洲一区二区三区国产精华液 | 丰满人妻一区二区三区免费视频 | 国内精品人妻无码久久久影院蜜桃 | 国产激情无码一区二区 | 少女韩国电视剧在线观看完整 | 国产高清不卡无码视频 | 欧美老妇交乱视频在线观看 | 男女超爽视频免费播放 | 老子影院午夜精品无码 | 动漫av一区二区在线观看 | 国产精品18久久久久久麻辣 | 日韩 欧美 动漫 国产 制服 | 国产xxx69麻豆国语对白 | 亚洲成av人片天堂网无码】 | 亚洲日韩av一区二区三区四区 | 日日天日日夜日日摸 | 国产真人无遮挡作爱免费视频 | 人妻少妇精品无码专区二区 | 夜夜影院未满十八勿进 | 永久免费观看美女裸体的网站 | 少妇无码av无码专区在线观看 | 久久精品国产精品国产精品污 | 久久国产精品二国产精品 | 久久精品人人做人人综合试看 | 欧美熟妇另类久久久久久多毛 | 全黄性性激高免费视频 | 国产亚洲精品久久久闺蜜 | 亚洲日韩av一区二区三区中文 | 婷婷五月综合缴情在线视频 | 麻豆国产丝袜白领秘书在线观看 | 国产成人午夜福利在线播放 | 亚洲中文字幕无码中文字在线 | 乱人伦人妻中文字幕无码 | 无码人妻久久一区二区三区不卡 | 欧洲美熟女乱又伦 | av在线亚洲欧洲日产一区二区 | 日本乱人伦片中文三区 | 美女极度色诱视频国产 | 少妇无码一区二区二三区 | 小sao货水好多真紧h无码视频 | 亚洲色大成网站www国产 | 午夜福利不卡在线视频 | 在线观看国产午夜福利片 | 欧洲精品码一区二区三区免费看 | 日日碰狠狠丁香久燥 | 日韩少妇白浆无码系列 | 精品人妻人人做人人爽 | 欧美午夜特黄aaaaaa片 | 久久无码专区国产精品s | 亚洲色成人中文字幕网站 | 亚洲 日韩 欧美 成人 在线观看 | 色窝窝无码一区二区三区色欲 | 中国大陆精品视频xxxx | 中国女人内谢69xxxxxa片 | 亚洲欧美色中文字幕在线 | 欧美激情综合亚洲一二区 | 亚洲a无码综合a国产av中文 | 最近免费中文字幕中文高清百度 | 西西人体www44rt大胆高清 | 人妻熟女一区 | 国产亲子乱弄免费视频 | 日本一区二区三区免费播放 | 丝袜人妻一区二区三区 | 久久久久99精品国产片 | 黑人大群体交免费视频 | 久久综合久久自在自线精品自 | 男女猛烈xx00免费视频试看 | 丁香花在线影院观看在线播放 | 国产精品久久久午夜夜伦鲁鲁 | 人妻插b视频一区二区三区 | 999久久久国产精品消防器材 | 亚洲男女内射在线播放 | 99久久人妻精品免费二区 | 国产乱人偷精品人妻a片 | 丰满妇女强制高潮18xxxx | 亚洲国产精品无码一区二区三区 | 精品久久综合1区2区3区激情 | 国产偷抇久久精品a片69 | 久久久国产精品无码免费专区 | 无码纯肉视频在线观看 | 久久久久久av无码免费看大片 | 在线精品国产一区二区三区 | 成人免费视频一区二区 | 国产婷婷色一区二区三区在线 | 婷婷五月综合激情中文字幕 | 久久久精品国产sm最大网站 | 内射爽无广熟女亚洲 | 最新版天堂资源中文官网 | www国产亚洲精品久久久日本 | 久久成人a毛片免费观看网站 | 久久国产精品萌白酱免费 | 亚洲国产精品无码一区二区三区 | av香港经典三级级 在线 | 乱中年女人伦av三区 | 国产精品亚洲综合色区韩国 | 久久久久久a亚洲欧洲av冫 | 奇米影视888欧美在线观看 | 国产精品美女久久久 | 婷婷丁香六月激情综合啪 | 九九综合va免费看 | 撕开奶罩揉吮奶头视频 | 欧美阿v高清资源不卡在线播放 | 国产日产欧产精品精品app | 免费乱码人妻系列无码专区 | 美女黄网站人色视频免费国产 | 亚洲理论电影在线观看 | 999久久久国产精品消防器材 | 色妞www精品免费视频 | 亚洲理论电影在线观看 | 欧美丰满老熟妇xxxxx性 | 一本久久a久久精品vr综合 | 熟妇人妻中文av无码 | 熟妇人妻中文av无码 | 对白脏话肉麻粗话av | 欧美放荡的少妇 | 正在播放东北夫妻内射 | 亚洲狠狠色丁香婷婷综合 | 国产无av码在线观看 | 一本久久伊人热热精品中文字幕 | 大色综合色综合网站 | 人人妻人人澡人人爽欧美一区九九 | 撕开奶罩揉吮奶头视频 | 国产精品永久免费视频 | 亚洲国产av精品一区二区蜜芽 | 妺妺窝人体色www在线小说 | 中国女人内谢69xxxxxa片 | 成人欧美一区二区三区黑人免费 | 人妻少妇精品无码专区二区 | 国产人妻人伦精品1国产丝袜 | 99精品久久毛片a片 | 中文字幕无码乱人伦 | 亚拍精品一区二区三区探花 | 亚洲国产av美女网站 | 亚洲色在线无码国产精品不卡 | 国产成人无码av片在线观看不卡 | 99久久人妻精品免费一区 | 亚洲色欲色欲欲www在线 | 久久人人爽人人爽人人片av高清 | 亚洲日韩av一区二区三区四区 | 人妻无码αv中文字幕久久琪琪布 | 亚洲日本一区二区三区在线 | 在线a亚洲视频播放在线观看 | 国产真实伦对白全集 | 麻豆av传媒蜜桃天美传媒 | 亚洲中文字幕成人无码 | 一本久久a久久精品亚洲 | 国产激情一区二区三区 | 亚洲理论电影在线观看 | 亚洲精品一区国产 | 国产精品久免费的黄网站 | 久久国语露脸国产精品电影 | 波多野结衣乳巨码无在线观看 | а√天堂www在线天堂小说 | 日日麻批免费40分钟无码 | 精品国产青草久久久久福利 | 欧美老人巨大xxxx做受 | 久久亚洲国产成人精品性色 | 夫妻免费无码v看片 | 亚洲一区二区三区四区 | 无码人妻丰满熟妇区毛片18 | 国产精品无码久久av | 男人的天堂av网站 | 成人av无码一区二区三区 | 国产特级毛片aaaaaa高潮流水 | 人人妻人人澡人人爽欧美一区九九 | 双乳奶水饱满少妇呻吟 | 亚洲精品中文字幕乱码 | 99riav国产精品视频 | 特级做a爰片毛片免费69 | 国产区女主播在线观看 | 久久精品国产一区二区三区肥胖 | 色欲人妻aaaaaaa无码 | 丰满肥臀大屁股熟妇激情视频 | 无码中文字幕色专区 | 亚洲成av人片在线观看无码不卡 | 波多野结衣 黑人 | 激情内射亚州一区二区三区爱妻 | 好男人www社区 | 久久亚洲日韩精品一区二区三区 | 亚洲日韩精品欧美一区二区 | 国产免费久久精品国产传媒 | 亚洲精品国偷拍自产在线麻豆 | 自拍偷自拍亚洲精品10p | 亚洲大尺度无码无码专区 | 一个人看的www免费视频在线观看 | 亚洲人成网站在线播放942 | 一本大道久久东京热无码av | 午夜无码人妻av大片色欲 | 天堂久久天堂av色综合 | 正在播放东北夫妻内射 | 人人妻人人澡人人爽欧美一区 | 俺去俺来也在线www色官网 | 一本加勒比波多野结衣 | 成人无码精品一区二区三区 | 99久久久国产精品无码免费 | 97资源共享在线视频 | 国产亚洲精品久久久久久久 | 成人综合网亚洲伊人 | 99久久婷婷国产综合精品青草免费 | 成人影院yy111111在线观看 | 欧美日本免费一区二区三区 | 青草视频在线播放 | aa片在线观看视频在线播放 | 又粗又大又硬毛片免费看 | 欧美亚洲国产一区二区三区 | 成人欧美一区二区三区黑人免费 | 秋霞成人午夜鲁丝一区二区三区 | 欧美性黑人极品hd | 欧美国产日韩久久mv | 国内丰满熟女出轨videos | 国产片av国语在线观看 | 99久久精品日本一区二区免费 | 国产无套粉嫩白浆在线 | 好爽又高潮了毛片免费下载 | 亚洲精品国产品国语在线观看 | 久青草影院在线观看国产 | 国产精品.xx视频.xxtv | 好屌草这里只有精品 | 中文字幕人妻丝袜二区 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲日韩av一区二区三区四区 | 曰韩无码二三区中文字幕 | 成人试看120秒体验区 | 亚洲精品综合一区二区三区在线 | 亚洲色在线无码国产精品不卡 | www成人国产高清内射 | 中文字幕色婷婷在线视频 | 精品国产一区二区三区四区在线看 | 中文字幕+乱码+中文字幕一区 | 无码国产激情在线观看 | 日韩无套无码精品 | 九月婷婷人人澡人人添人人爽 | 久久国产自偷自偷免费一区调 | 男女爱爱好爽视频免费看 | 日本又色又爽又黄的a片18禁 | 国产三级久久久精品麻豆三级 | 蜜桃视频韩日免费播放 | 国语精品一区二区三区 | 国产精品a成v人在线播放 | 亚洲爆乳精品无码一区二区三区 | 国产精品欧美成人 | 亚洲综合久久一区二区 | 18精品久久久无码午夜福利 | 国产亚洲美女精品久久久2020 | 精品一区二区三区无码免费视频 | 国产精品久久久一区二区三区 | 久久99精品久久久久婷婷 | 亚洲一区二区三区国产精华液 | 久久久国产精品无码免费专区 | 激情五月综合色婷婷一区二区 | 久久精品人妻少妇一区二区三区 | 啦啦啦www在线观看免费视频 | 18黄暴禁片在线观看 | 国产人妻久久精品二区三区老狼 | 亚洲精品午夜无码电影网 | 久久久中文字幕日本无吗 | 亚洲精品一区二区三区四区五区 | 狠狠色噜噜狠狠狠7777奇米 | 性生交片免费无码看人 | 中文字幕日产无线码一区 | 亚洲欧洲日本综合aⅴ在线 | 76少妇精品导航 | 国产精品视频免费播放 | 国产办公室秘书无码精品99 | 亚洲gv猛男gv无码男同 | 天海翼激烈高潮到腰振不止 | 97夜夜澡人人爽人人喊中国片 | 激情内射亚州一区二区三区爱妻 | 久久精品国产大片免费观看 | av小次郎收藏 | 伊人久久大香线蕉午夜 | 99国产精品白浆在线观看免费 | 九九在线中文字幕无码 | 日欧一片内射va在线影院 | 亚洲一区av无码专区在线观看 | 中文字幕人妻无码一区二区三区 | 日韩av激情在线观看 | 日本大乳高潮视频在线观看 | 久久国产自偷自偷免费一区调 | 免费看男女做好爽好硬视频 | 亚洲欧美国产精品专区久久 | 国产精品久久国产精品99 | 精品无码国产一区二区三区av | 久久精品丝袜高跟鞋 | v一区无码内射国产 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美真人作爱免费视频 | 欧美国产日韩久久mv | 亚洲国产高清在线观看视频 | 国产国产精品人在线视 | 又粗又大又硬毛片免费看 | 丰满少妇女裸体bbw | 在线天堂新版最新版在线8 | 激情内射日本一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 亚洲成av人在线观看网址 | 无码国产色欲xxxxx视频 | 国产成人无码午夜视频在线观看 | 乱码av麻豆丝袜熟女系列 | 99久久久无码国产精品免费 | 女人和拘做爰正片视频 | 荡女精品导航 | 久久人人爽人人爽人人片av高清 | 国产综合久久久久鬼色 | 亚洲精品成人福利网站 | 欧美放荡的少妇 | 成人无码精品一区二区三区 | 中文亚洲成a人片在线观看 | 欧美日韩色另类综合 | 成人无码视频免费播放 | 无码人妻丰满熟妇区五十路百度 | 国产激情精品一区二区三区 | 成人欧美一区二区三区 | 伊人久久大香线蕉av一区二区 | 国产亚洲tv在线观看 | 蜜桃av抽搐高潮一区二区 | 国产精品无码mv在线观看 | 老子影院午夜精品无码 | 成人精品视频一区二区三区尤物 | 曰本女人与公拘交酡免费视频 | 国产手机在线αⅴ片无码观看 | 日日碰狠狠丁香久燥 | 日本一卡二卡不卡视频查询 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产免费观看黄av片 | 妺妺窝人体色www婷婷 | 午夜肉伦伦影院 | 亚洲人成无码网www | 欧美自拍另类欧美综合图片区 | 人人爽人人爽人人片av亚洲 | 日韩av无码一区二区三区不卡 | 无遮挡啪啪摇乳动态图 | 亚洲小说图区综合在线 | √8天堂资源地址中文在线 | 亚洲 另类 在线 欧美 制服 | 亚洲日本在线电影 | 国产精品无码mv在线观看 | 高潮喷水的毛片 | 俺去俺来也在线www色官网 | 一区二区三区高清视频一 | 美女极度色诱视频国产 | 国产av久久久久精东av | 国产免费无码一区二区视频 | 大地资源中文第3页 | 麻豆md0077饥渴少妇 | 日本乱人伦片中文三区 | 无码精品国产va在线观看dvd | 男女猛烈xx00免费视频试看 | 久久国产精品偷任你爽任你 | 在线播放无码字幕亚洲 | 久久国产精品_国产精品 | 嫩b人妻精品一区二区三区 | 亚洲a无码综合a国产av中文 | 免费人成网站视频在线观看 | 在线观看国产午夜福利片 | 高潮毛片无遮挡高清免费 | 粉嫩少妇内射浓精videos | 俺去俺来也在线www色官网 | 日本丰满熟妇videos | 中文无码成人免费视频在线观看 | 午夜精品久久久内射近拍高清 | 免费观看黄网站 | 丰满人妻被黑人猛烈进入 | 中文字幕乱码中文乱码51精品 | 色综合视频一区二区三区 | 狠狠cao日日穞夜夜穞av | 国产av剧情md精品麻豆 | 狠狠色色综合网站 | 成人免费无码大片a毛片 | 2020久久超碰国产精品最新 | 99久久久国产精品无码免费 | 久久久久久亚洲精品a片成人 | 无码国产色欲xxxxx视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 青青青手机频在线观看 | 精品久久久久久人妻无码中文字幕 | 国产av久久久久精东av | 亚洲欧美精品伊人久久 | 99er热精品视频 | 亚洲精品国产第一综合99久久 | 久久亚洲日韩精品一区二区三区 | 欧美日韩一区二区免费视频 | 亚洲小说图区综合在线 | 久久综合色之久久综合 | 天堂无码人妻精品一区二区三区 | 日本护士毛茸茸高潮 | 欧美猛少妇色xxxxx | 真人与拘做受免费视频 | 久久久中文字幕日本无吗 | 妺妺窝人体色www在线小说 | 小泽玛莉亚一区二区视频在线 | 天天躁日日躁狠狠躁免费麻豆 | 大乳丰满人妻中文字幕日本 | 扒开双腿吃奶呻吟做受视频 | 国产人成高清在线视频99最全资源 | 男女爱爱好爽视频免费看 | 初尝人妻少妇中文字幕 | 男人的天堂2018无码 | 中文字幕色婷婷在线视频 | 中文久久乱码一区二区 | √天堂资源地址中文在线 | 亚洲综合久久一区二区 | 中文字幕 亚洲精品 第1页 | 无套内谢老熟女 | 在线a亚洲视频播放在线观看 | 亚欧洲精品在线视频免费观看 | 国产麻豆精品精东影业av网站 | 日本一区二区三区免费高清 | 精品久久8x国产免费观看 | 国产成人无码av片在线观看不卡 | 久久精品无码一区二区三区 | 日日麻批免费40分钟无码 | 在线成人www免费观看视频 | 国产又粗又硬又大爽黄老大爷视 | 伦伦影院午夜理论片 | 桃花色综合影院 | 无码一区二区三区在线观看 | 婷婷五月综合激情中文字幕 | 扒开双腿疯狂进出爽爽爽视频 | 天干天干啦夜天干天2017 | 欧美日韩一区二区免费视频 | 国产情侣作爱视频免费观看 | 丰满人妻一区二区三区免费视频 | 丰满人妻一区二区三区免费视频 | 久久久精品人妻久久影视 | 中文无码成人免费视频在线观看 | 少妇无套内谢久久久久 | 性欧美牲交xxxxx视频 | 中文字幕乱码中文乱码51精品 | 国内精品人妻无码久久久影院 | 成人精品一区二区三区中文字幕 | 性色欲情网站iwww九文堂 | 中文字幕乱码中文乱码51精品 | 夜夜影院未满十八勿进 | 俺去俺来也在线www色官网 | 国产精品久久久久7777 | 午夜男女很黄的视频 | 伊人久久大香线蕉亚洲 | 国产精品亚洲lv粉色 | 欧美日韩久久久精品a片 | 国产熟妇高潮叫床视频播放 | 亚洲乱码国产乱码精品精 | 极品尤物被啪到呻吟喷水 | 色五月五月丁香亚洲综合网 | 沈阳熟女露脸对白视频 | 麻豆国产丝袜白领秘书在线观看 | 久久午夜无码鲁丝片 | 日本爽爽爽爽爽爽在线观看免 | 国产成人无码a区在线观看视频app | 亚洲熟悉妇女xxx妇女av | 麻豆av传媒蜜桃天美传媒 | 欧美一区二区三区视频在线观看 | 日日麻批免费40分钟无码 | 久久zyz资源站无码中文动漫 | 国产成人无码一二三区视频 | 日本精品人妻无码免费大全 | 人人澡人摸人人添 | 中国女人内谢69xxxxxa片 | 99在线 | 亚洲 | 国产成人午夜福利在线播放 | 精品国产一区二区三区四区在线看 | 亚洲s码欧洲m码国产av | 久久精品无码一区二区三区 | 久久久久免费精品国产 | 国产口爆吞精在线视频 | 亚洲最大成人网站 | 爱做久久久久久 | 欧美 亚洲 国产 另类 | 国内老熟妇对白xxxxhd | 狠狠综合久久久久综合网 | 亚洲精品午夜无码电影网 | 国产高潮视频在线观看 | 欧美一区二区三区视频在线观看 | 中文字幕无码免费久久9一区9 | 18精品久久久无码午夜福利 | 沈阳熟女露脸对白视频 | 丰满护士巨好爽好大乳 | 免费网站看v片在线18禁无码 | 青草青草久热国产精品 | 成 人影片 免费观看 | 国产av剧情md精品麻豆 | 国产乱人伦偷精品视频 | 国产极品美女高潮无套在线观看 | 伊人久久大香线焦av综合影院 | 久久99久久99精品中文字幕 | 国产人妻人伦精品1国产丝袜 | 免费无码的av片在线观看 | 娇妻被黑人粗大高潮白浆 | 国产又爽又黄又刺激的视频 | aⅴ亚洲 日韩 色 图网站 播放 | 久久99精品国产麻豆 | 蜜桃臀无码内射一区二区三区 | 日日摸天天摸爽爽狠狠97 | 欧美三级不卡在线观看 | 久久亚洲国产成人精品性色 | 国产欧美精品一区二区三区 | 国产精品无码mv在线观看 | 88国产精品欧美一区二区三区 | 波多野42部无码喷潮在线 | 久久久久人妻一区精品色欧美 | 亚洲の无码国产の无码影院 | 亚洲乱码日产精品bd | 国产农村乱对白刺激视频 | 亚洲国产精品无码一区二区三区 | 亚洲另类伦春色综合小说 | 成人精品视频一区二区三区尤物 | 东京无码熟妇人妻av在线网址 | 国产精品无套呻吟在线 | 97无码免费人妻超级碰碰夜夜 | 久久亚洲精品成人无码 | 无码av免费一区二区三区试看 | 亚洲а∨天堂久久精品2021 | 97夜夜澡人人爽人人喊中国片 | 久久人人爽人人人人片 | 国产精品亚洲а∨无码播放麻豆 | 国产亚洲人成a在线v网站 | 国产精品亚洲а∨无码播放麻豆 | 亚洲s码欧洲m码国产av | 国产精品久久久久7777 | 综合人妻久久一区二区精品 | 老熟妇仑乱视频一区二区 | 无码人中文字幕 | 熟妇激情内射com | 亚洲第一网站男人都懂 | 精品国产乱码久久久久乱码 | 日韩无套无码精品 | 亚洲 日韩 欧美 成人 在线观看 | 女高中生第一次破苞av | 亚洲gv猛男gv无码男同 | 中文字幕av日韩精品一区二区 | 亚洲精品无码国产 | 国产av人人夜夜澡人人爽麻豆 | 久久国产精品二国产精品 | 国产av人人夜夜澡人人爽麻豆 | 一个人免费观看的www视频 | 无码av中文字幕免费放 | 亚洲国产欧美在线成人 | 亚洲国产精品成人久久蜜臀 | 亚洲欧洲日本无在线码 | 四虎4hu永久免费 | 草草网站影院白丝内射 | 精品国产一区二区三区四区 | 欧美 日韩 亚洲 在线 | 四虎永久在线精品免费网址 | 少妇性俱乐部纵欲狂欢电影 | 精品欧美一区二区三区久久久 | 色婷婷av一区二区三区之红樱桃 | 女人色极品影院 | 国产av人人夜夜澡人人爽麻豆 | 中国女人内谢69xxxx | 亚洲日韩中文字幕在线播放 | 国产日产欧产精品精品app | 色婷婷香蕉在线一区二区 | 伊人久久婷婷五月综合97色 | 4hu四虎永久在线观看 | 97精品人妻一区二区三区香蕉 | 亚洲 另类 在线 欧美 制服 | 女人被男人躁得好爽免费视频 | 动漫av网站免费观看 | 中文字幕无码免费久久99 | 精品人妻人人做人人爽 | 1000部啪啪未满十八勿入下载 | 一个人看的www免费视频在线观看 | 国产艳妇av在线观看果冻传媒 | 精品一区二区三区波多野结衣 | 免费观看又污又黄的网站 | 精品人妻中文字幕有码在线 | 欧美一区二区三区视频在线观看 | 无码一区二区三区在线观看 | 国产色在线 | 国产 | 亚洲精品美女久久久久久久 | 麻花豆传媒剧国产免费mv在线 | 亚洲精品午夜国产va久久成人 | 好屌草这里只有精品 | 国产精品二区一区二区aⅴ污介绍 | 99久久久无码国产aaa精品 | 少妇高潮一区二区三区99 | 亚洲乱码国产乱码精品精 | 又粗又大又硬毛片免费看 | 久久精品国产精品国产精品污 | 亚拍精品一区二区三区探花 | 7777奇米四色成人眼影 | 国产后入清纯学生妹 | 激情综合激情五月俺也去 | 无码一区二区三区在线观看 | 国产网红无码精品视频 | 高潮毛片无遮挡高清免费视频 | 中文精品久久久久人妻不卡 | 狠狠cao日日穞夜夜穞av | 蜜臀av无码人妻精品 | 国产办公室秘书无码精品99 | 中文字幕无码人妻少妇免费 | 99久久久无码国产精品免费 | 亚洲人成网站免费播放 | 高中生自慰www网站 | 性色av无码免费一区二区三区 | 激情亚洲一区国产精品 | 18精品久久久无码午夜福利 | 青春草在线视频免费观看 | 亚洲一区二区观看播放 | 一本一道久久综合久久 | 老太婆性杂交欧美肥老太 | 亚洲成av人综合在线观看 | 大地资源中文第3页 | 久久人人爽人人爽人人片ⅴ | 99久久久无码国产精品免费 | 国产在线一区二区三区四区五区 | 欧美性生交活xxxxxdddd | 国产女主播喷水视频在线观看 | 精品国产aⅴ无码一区二区 | 午夜精品一区二区三区在线观看 | 欧美激情一区二区三区成人 | 国产网红无码精品视频 | 日韩无码专区 | 免费网站看v片在线18禁无码 | 极品嫩模高潮叫床 | 天天躁夜夜躁狠狠是什么心态 | 内射老妇bbwx0c0ck | 精品国产乱码久久久久乱码 | 国产成人无码av在线影院 | 荫蒂被男人添的好舒服爽免费视频 | 捆绑白丝粉色jk震动捧喷白浆 | 久久久av男人的天堂 | 国产精品a成v人在线播放 | 欧美成人高清在线播放 | 久久久精品人妻久久影视 | 日日碰狠狠躁久久躁蜜桃 | 俺去俺来也在线www色官网 | 国内揄拍国内精品少妇国语 | 国产av一区二区精品久久凹凸 | 天天摸天天透天天添 | 亚洲区小说区激情区图片区 | 欧美zoozzooz性欧美 | 玩弄人妻少妇500系列视频 | 欧美性生交活xxxxxdddd | 国产精品久久久久7777 | 国产69精品久久久久app下载 | 国产97色在线 | 免 | 伊人久久大香线蕉av一区二区 | 日本免费一区二区三区最新 | 亚洲自偷自拍另类第1页 | 男女下面进入的视频免费午夜 | 亚洲精品午夜国产va久久成人 | 亚洲人成人无码网www国产 | 日本va欧美va欧美va精品 | 成人精品视频一区二区 | 欧美精品在线观看 | 日本一区二区更新不卡 | 亚洲国产精品美女久久久久 | 粗大的内捧猛烈进出视频 | 精品国产av色一区二区深夜久久 | 又大又硬又黄的免费视频 | 99久久亚洲精品无码毛片 | 亚洲人亚洲人成电影网站色 | 天堂а√在线地址中文在线 | 日日夜夜撸啊撸 | 妺妺窝人体色www婷婷 | 亚洲色欲久久久综合网东京热 | 欧美猛少妇色xxxxx | 亚洲欧美日韩综合久久久 | 性色欲网站人妻丰满中文久久不卡 | 色综合视频一区二区三区 | 桃花色综合影院 | 国产精品美女久久久久av爽李琼 | ass日本丰满熟妇pics | 国内老熟妇对白xxxxhd | 色窝窝无码一区二区三区色欲 | a在线观看免费网站大全 | 男人扒开女人内裤强吻桶进去 | 欧美精品无码一区二区三区 | 亚洲色www成人永久网址 | 国产色xx群视频射精 | 无码av岛国片在线播放 | 国产口爆吞精在线视频 | 一二三四在线观看免费视频 | 国产又爽又猛又粗的视频a片 | 成人精品视频一区二区 | 久久精品国产日本波多野结衣 | 日产精品高潮呻吟av久久 | 欧洲精品码一区二区三区免费看 | 国产乱人偷精品人妻a片 | 黑人巨大精品欧美黑寡妇 | 色综合久久久无码网中文 | 欧美喷潮久久久xxxxx | 色婷婷久久一区二区三区麻豆 | 2020最新国产自产精品 | 搡女人真爽免费视频大全 | 国产亚洲精品久久久ai换 | 国产精品久久久午夜夜伦鲁鲁 | 四虎影视成人永久免费观看视频 | 1000部夫妻午夜免费 | 国产成人综合在线女婷五月99播放 | 少妇性俱乐部纵欲狂欢电影 | 国产人妻精品一区二区三区不卡 | 伊在人天堂亚洲香蕉精品区 | 国产人妻精品一区二区三区 | 人妻天天爽夜夜爽一区二区 | 精品人人妻人人澡人人爽人人 | 国产婷婷色一区二区三区在线 | 亚洲热妇无码av在线播放 | 国产又爽又黄又刺激的视频 | 牲欲强的熟妇农村老妇女视频 | 日本一卡2卡3卡四卡精品网站 | 精品夜夜澡人妻无码av蜜桃 | 麻豆av传媒蜜桃天美传媒 | 日韩亚洲欧美精品综合 | 偷窥村妇洗澡毛毛多 | 成人无码精品一区二区三区 | 老熟妇乱子伦牲交视频 | 男女作爱免费网站 | 乱人伦人妻中文字幕无码久久网 | 欧美日韩视频无码一区二区三 | 日本欧美一区二区三区乱码 | 波多野结衣高清一区二区三区 | 色窝窝无码一区二区三区色欲 | 色狠狠av一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 人妻尝试又大又粗久久 | 青草青草久热国产精品 | 野狼第一精品社区 | 一本色道婷婷久久欧美 | 国产 浪潮av性色四虎 | 图片区 小说区 区 亚洲五月 | 曰本女人与公拘交酡免费视频 | 亚洲欧洲无卡二区视頻 | 国产精品美女久久久久av爽李琼 | 成人无码视频在线观看网站 | 两性色午夜免费视频 | 亚洲 a v无 码免 费 成 人 a v | 亚洲成a人片在线观看无码 | 成 人 免费观看网站 | 清纯唯美经典一区二区 | 色情久久久av熟女人妻网站 | 老熟女重囗味hdxx69 | 成人无码精品1区2区3区免费看 | 人妻无码αv中文字幕久久琪琪布 | 丰满肥臀大屁股熟妇激情视频 | 国产精品无码mv在线观看 | 少妇一晚三次一区二区三区 | 天天摸天天碰天天添 | 亚洲高清偷拍一区二区三区 | 又大又黄又粗又爽的免费视频 | 国产绳艺sm调教室论坛 | 日本xxxx色视频在线观看免费 | 国产内射爽爽大片视频社区在线 | 黄网在线观看免费网站 | 亚洲精品国偷拍自产在线观看蜜桃 | 成人无码精品一区二区三区 | 欧美色就是色 | 国产欧美精品一区二区三区 | 日本熟妇浓毛 | 国产精品-区区久久久狼 | 欧美阿v高清资源不卡在线播放 | 四虎国产精品免费久久 | 亚洲s色大片在线观看 | 国产特级毛片aaaaaa高潮流水 | 亚洲精品鲁一鲁一区二区三区 | 中文无码伦av中文字幕 | 亚洲色无码一区二区三区 | 久久久久久久久蜜桃 | 日本熟妇浓毛 | 久久久中文久久久无码 | 国产97在线 | 亚洲 | 国产肉丝袜在线观看 | 日韩精品乱码av一区二区 | 日韩无套无码精品 | 久久国语露脸国产精品电影 | 成人影院yy111111在线观看 | 人人妻人人澡人人爽欧美精品 | 色综合久久网 | 51国偷自产一区二区三区 | 欧美 亚洲 国产 另类 | www国产亚洲精品久久网站 | 精品无码一区二区三区的天堂 | 国产成人一区二区三区在线观看 | 四虎永久在线精品免费网址 | 国产一精品一av一免费 | aⅴ亚洲 日韩 色 图网站 播放 | 久久亚洲日韩精品一区二区三区 | 草草网站影院白丝内射 | 亚洲熟妇色xxxxx欧美老妇 | 国精品人妻无码一区二区三区蜜柚 | 久久精品99久久香蕉国产色戒 | 精品熟女少妇av免费观看 | 成人无码影片精品久久久 | 国产精品久久国产三级国 | 国产香蕉尹人综合在线观看 | 免费看男女做好爽好硬视频 | 狠狠亚洲超碰狼人久久 | 97资源共享在线视频 | 无码av免费一区二区三区试看 | 日本一区二区更新不卡 | 国产精品永久免费视频 | v一区无码内射国产 | 亚洲爆乳大丰满无码专区 | 伊人色综合久久天天小片 | 国产又爽又黄又刺激的视频 | 美女黄网站人色视频免费国产 | 国产午夜亚洲精品不卡 | 亚洲爆乳大丰满无码专区 | 久久人人爽人人爽人人片ⅴ | 国产黑色丝袜在线播放 | 中文精品无码中文字幕无码专区 | 性色av无码免费一区二区三区 | 国产成人无码av在线影院 | 99精品无人区乱码1区2区3区 | 国产无遮挡又黄又爽又色 | 国产精品沙发午睡系列 | 综合网日日天干夜夜久久 | 亚洲区欧美区综合区自拍区 | 欧美色就是色 | 白嫩日本少妇做爰 | 色欲人妻aaaaaaa无码 | 免费观看激色视频网站 | 国产午夜精品一区二区三区嫩草 | 精品aⅴ一区二区三区 | 色一情一乱一伦一区二区三欧美 | 久久精品无码一区二区三区 | 国产人妻人伦精品1国产丝袜 | 最近的中文字幕在线看视频 | 99久久99久久免费精品蜜桃 | 色诱久久久久综合网ywww | 水蜜桃亚洲一二三四在线 | 久久人妻内射无码一区三区 | 亚洲国产精品一区二区美利坚 | 国产三级精品三级男人的天堂 | 国产成人精品一区二区在线小狼 | 一个人看的视频www在线 | 欧美日韩在线亚洲综合国产人 | 给我免费的视频在线观看 | 人妻无码αv中文字幕久久琪琪布 | 国产成人无码av一区二区 | 国产乱人无码伦av在线a | 中文字幕精品av一区二区五区 | 国产一区二区不卡老阿姨 | 欧美兽交xxxx×视频 | 亚洲中文字幕久久无码 | 熟妇激情内射com | 亚洲国产精品毛片av不卡在线 | 中文字幕无码热在线视频 | 99久久久无码国产精品免费 | 香蕉久久久久久av成人 | 欧洲精品码一区二区三区免费看 | 免费无码一区二区三区蜜桃大 | 亚洲欧洲日本综合aⅴ在线 | 国语精品一区二区三区 | 欧美丰满少妇xxxx性 | 欧美人与善在线com | 欧美xxxxx精品 | 国语自产偷拍精品视频偷 | 国产xxx69麻豆国语对白 | 女高中生第一次破苞av | 国内揄拍国内精品少妇国语 | 高清国产亚洲精品自在久久 | 天天摸天天透天天添 | 鲁鲁鲁爽爽爽在线视频观看 | 国产精品无码一区二区三区不卡 | 扒开双腿吃奶呻吟做受视频 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲精品无码国产 | 麻花豆传媒剧国产免费mv在线 | 无码吃奶揉捏奶头高潮视频 | 亚洲a无码综合a国产av中文 | 午夜丰满少妇性开放视频 | 国产亚洲精品久久久久久大师 | 乱码午夜-极国产极内射 | 色欲久久久天天天综合网精品 | 久久午夜夜伦鲁鲁片无码免费 | 精品久久综合1区2区3区激情 | 高中生自慰www网站 | 日本护士xxxxhd少妇 | 成人亚洲精品久久久久 | 国产精品无套呻吟在线 | 国产乱人伦av在线无码 | 黑人粗大猛烈进出高潮视频 | 天天躁日日躁狠狠躁免费麻豆 | 国产成人综合美国十次 | 18禁黄网站男男禁片免费观看 | 国产黑色丝袜在线播放 | 97夜夜澡人人双人人人喊 | 亚洲 日韩 欧美 成人 在线观看 | 任你躁在线精品免费 | 丝袜足控一区二区三区 | 国产亚洲精品久久久ai换 | 4hu四虎永久在线观看 | 色情久久久av熟女人妻网站 | 国内精品一区二区三区不卡 | 清纯唯美经典一区二区 | 麻豆国产97在线 | 欧洲 | 久久久久免费精品国产 | 国产午夜福利100集发布 | 爽爽影院免费观看 | 中文精品久久久久人妻不卡 | 天堂а√在线地址中文在线 | 55夜色66夜色国产精品视频 | 欧洲美熟女乱又伦 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 色综合久久久无码中文字幕 | 成人欧美一区二区三区 | 四虎影视成人永久免费观看视频 | 少妇人妻av毛片在线看 | 亚洲自偷精品视频自拍 | 国产精品理论片在线观看 | 特级做a爰片毛片免费69 | 亚洲成av人影院在线观看 | 免费无码av一区二区 | 亚洲区欧美区综合区自拍区 | 六月丁香婷婷色狠狠久久 | 亚洲国产av精品一区二区蜜芽 | 久久人人爽人人爽人人片av高清 | 亚洲国产欧美在线成人 | 国产又爽又猛又粗的视频a片 | 国产麻豆精品精东影业av网站 | 欧美真人作爱免费视频 | 国产激情精品一区二区三区 | 久久久精品国产sm最大网站 | 久久综合色之久久综合 | 扒开双腿吃奶呻吟做受视频 | 无套内谢老熟女 | 国产一精品一av一免费 | 黑人巨大精品欧美一区二区 | 日日天日日夜日日摸 | 日韩欧美群交p片內射中文 | 在线播放无码字幕亚洲 | 久久精品女人的天堂av | 日日碰狠狠丁香久燥 | 免费观看黄网站 | 国产精品第一区揄拍无码 | 久久久久久久人妻无码中文字幕爆 | 欧美xxxxx精品 | 国产精品国产三级国产专播 | 日日躁夜夜躁狠狠躁 | 男人和女人高潮免费网站 | 国产xxx69麻豆国语对白 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 欧美大屁股xxxxhd黑色 | 欧美性黑人极品hd | 欧美刺激性大交 | 亚洲の无码国产の无码步美 | 久久99精品久久久久婷婷 | 久久久中文字幕日本无吗 | 久久精品国产亚洲精品 | 国产一区二区三区精品视频 | 亚洲欧洲日本无在线码 | 久久视频在线观看精品 | 性生交大片免费看女人按摩摩 | 中文字幕人妻无码一夲道 | 欧美人与善在线com | 国产区女主播在线观看 | 福利一区二区三区视频在线观看 | 亚洲成av人片在线观看无码不卡 | 骚片av蜜桃精品一区 | 一区二区三区乱码在线 | 欧洲 | 精品午夜福利在线观看 | 亚洲欧美色中文字幕在线 | 大屁股大乳丰满人妻 | 装睡被陌生人摸出水好爽 | 久久午夜无码鲁丝片午夜精品 | 六月丁香婷婷色狠狠久久 | 精品国产乱码久久久久乱码 | 日欧一片内射va在线影院 | 欧美精品国产综合久久 | 内射后入在线观看一区 | 午夜性刺激在线视频免费 | 欧美xxxx黑人又粗又长 | 午夜福利电影 | 激情人妻另类人妻伦 | 黑森林福利视频导航 | 大色综合色综合网站 | 国产av一区二区三区最新精品 | 亚洲午夜福利在线观看 | 久久久精品成人免费观看 | 国产精品va在线观看无码 | 久久无码专区国产精品s | 欧美性生交xxxxx久久久 | 国内精品人妻无码久久久影院蜜桃 | 在线精品亚洲一区二区 | 鲁一鲁av2019在线 | 狠狠色欧美亚洲狠狠色www | 中文字幕精品av一区二区五区 | 久久久久久久久蜜桃 | 丰满少妇熟乱xxxxx视频 | 婷婷丁香六月激情综合啪 | 男女猛烈xx00免费视频试看 | 少妇无码一区二区二三区 | 97久久精品无码一区二区 | 性开放的女人aaa片 | 亚洲中文字幕在线无码一区二区 | 国产美女极度色诱视频www | 久久久久亚洲精品中文字幕 | 乱人伦人妻中文字幕无码久久网 | 国产av剧情md精品麻豆 | 国产人妻精品一区二区三区 | 欧美野外疯狂做受xxxx高潮 | 少妇厨房愉情理9仑片视频 | 国内精品人妻无码久久久影院 | 永久免费精品精品永久-夜色 | www成人国产高清内射 | 丰满护士巨好爽好大乳 | 在线欧美精品一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产成人精品一区二区在线小狼 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲成a人片在线观看日本 | 午夜福利试看120秒体验区 | 无码人妻丰满熟妇区五十路百度 | 久久久久人妻一区精品色欧美 | 欧美日本精品一区二区三区 | 国产精品久久久久影院嫩草 | 超碰97人人射妻 | 久久熟妇人妻午夜寂寞影院 | 娇妻被黑人粗大高潮白浆 | 精品无码一区二区三区的天堂 | 日韩欧美成人免费观看 | 亚洲精品一区二区三区婷婷月 | 牛和人交xxxx欧美 | 中文亚洲成a人片在线观看 | 亚洲aⅴ无码成人网站国产app | 精品欧洲av无码一区二区三区 | 97久久精品无码一区二区 | 黑人巨大精品欧美一区二区 | 成人欧美一区二区三区黑人 | 又紧又大又爽精品一区二区 | 久久久婷婷五月亚洲97号色 | 综合网日日天干夜夜久久 | 六月丁香婷婷色狠狠久久 | 偷窥日本少妇撒尿chinese | 成人av无码一区二区三区 | 精品欧美一区二区三区久久久 | 无遮无挡爽爽免费视频 | 欧美成人午夜精品久久久 | 无码人妻av免费一区二区三区 | 亚洲国产精品无码一区二区三区 | 色情久久久av熟女人妻网站 | 欧美色就是色 | 色婷婷综合中文久久一本 | 国产免费久久精品国产传媒 | ass日本丰满熟妇pics | 国产在线aaa片一区二区99 | 一本一道久久综合久久 | 高潮毛片无遮挡高清免费视频 | 亚洲精品久久久久avwww潮水 | 久青草影院在线观看国产 | 亚洲欧美日韩成人高清在线一区 | 成人免费视频视频在线观看 免费 | 一本大道久久东京热无码av | 国产三级精品三级男人的天堂 | 黑人巨大精品欧美黑寡妇 | 亚洲国产欧美日韩精品一区二区三区 | 精品国产av色一区二区深夜久久 | 国产精品无套呻吟在线 | 中文字幕人妻无码一夲道 | 免费无码的av片在线观看 | 欧美老妇与禽交 | 无码人妻丰满熟妇区五十路百度 | 国产亚洲欧美在线专区 | 亚洲自偷精品视频自拍 | 国产人妻精品一区二区三区 | 四虎国产精品一区二区 | 久久久精品人妻久久影视 | 黑森林福利视频导航 | 理论片87福利理论电影 | 亚洲一区二区三区四区 | 伊在人天堂亚洲香蕉精品区 | 精品成在人线av无码免费看 | 国产三级精品三级男人的天堂 | 国产精品久免费的黄网站 | 天下第一社区视频www日本 | 日日橹狠狠爱欧美视频 | 久久亚洲国产成人精品性色 | 亚洲国产欧美在线成人 | 亚洲区欧美区综合区自拍区 | 99久久久无码国产精品免费 | 欧美阿v高清资源不卡在线播放 | 国产美女精品一区二区三区 | 一本久道高清无码视频 | 强奷人妻日本中文字幕 | 国产香蕉尹人视频在线 | 久久无码中文字幕免费影院蜜桃 | 麻豆国产丝袜白领秘书在线观看 | 无码毛片视频一区二区本码 | 67194成是人免费无码 | 亚洲а∨天堂久久精品2021 | www一区二区www免费 | 国产精品理论片在线观看 | 两性色午夜视频免费播放 | 久久精品国产99久久6动漫 | 蜜桃臀无码内射一区二区三区 | 99久久精品日本一区二区免费 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品国产青草久久久久福利 | 亚洲人交乣女bbw | 熟女少妇人妻中文字幕 | 2020最新国产自产精品 | 国产尤物精品视频 | 精品偷自拍另类在线观看 | 国产综合色产在线精品 | 久久国产精品二国产精品 | 国产成人无码av在线影院 | 自拍偷自拍亚洲精品10p | 亚洲va中文字幕无码久久不卡 | 久久久精品456亚洲影院 | 国产精品久久久久9999小说 | 四虎影视成人永久免费观看视频 | 亚洲色偷偷偷综合网 | 中文字幕乱码中文乱码51精品 | 亚洲码国产精品高潮在线 | www国产精品内射老师 | 国产午夜精品一区二区三区嫩草 | 免费无码的av片在线观看 | 丰满人妻翻云覆雨呻吟视频 | 欧美精品免费观看二区 | 十八禁视频网站在线观看 | 97久久超碰中文字幕 | 欧洲vodafone精品性 | 亚洲自偷精品视频自拍 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲高清偷拍一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 久久精品无码一区二区三区 | 天天摸天天透天天添 | 色综合久久久无码中文字幕 | 日产精品99久久久久久 | 亚洲精品综合一区二区三区在线 | 18黄暴禁片在线观看 | 婷婷五月综合激情中文字幕 | 欧美怡红院免费全部视频 | 亚洲一区av无码专区在线观看 | 成人无码精品一区二区三区 | 亚洲精品一区二区三区大桥未久 | 中文字幕av伊人av无码av | 无码吃奶揉捏奶头高潮视频 | 国产色xx群视频射精 | 天天拍夜夜添久久精品大 | 国产人妻人伦精品 | 乱人伦人妻中文字幕无码 | 成人性做爰aaa片免费看 | 亚洲精品久久久久久久久久久 | 人人妻人人澡人人爽欧美一区九九 | 无码国内精品人妻少妇 | 国产又爽又猛又粗的视频a片 | 久久亚洲日韩精品一区二区三区 | 美女扒开屁股让男人桶 | 欧美精品在线观看 | 亚洲成a人片在线观看无码3d | 日本一区二区更新不卡 | 老子影院午夜精品无码 | 欧美三级不卡在线观看 | 国产国产精品人在线视 | 欧美激情一区二区三区成人 | 精品久久久久久亚洲精品 | 亚洲aⅴ无码成人网站国产app | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 在线观看国产午夜福利片 | 老熟妇乱子伦牲交视频 | 国产成人无码一二三区视频 | 欧美放荡的少妇 | 亚洲成色在线综合网站 | 永久免费观看国产裸体美女 | 中文字幕日韩精品一区二区三区 | 精品国产麻豆免费人成网站 | 国产偷自视频区视频 | 久久综合给合久久狠狠狠97色 | 亚洲精品中文字幕乱码 | 国产亚洲人成a在线v网站 | 我要看www免费看插插视频 | 三上悠亚人妻中文字幕在线 | 亚拍精品一区二区三区探花 | 四虎国产精品免费久久 | 中国女人内谢69xxxx | 乱中年女人伦av三区 | 亚洲国产精品无码久久久久高潮 | 久久99精品久久久久久 | 国产精品第一区揄拍无码 | 成人欧美一区二区三区黑人免费 | 欧美老人巨大xxxx做受 | 国产免费久久久久久无码 | 久久亚洲精品中文字幕无男同 | 久久99精品久久久久久动态图 | 亚洲成熟女人毛毛耸耸多 | 男人的天堂2018无码 | 欧美变态另类xxxx | 久久亚洲a片com人成 | 国产精品久久福利网站 | 青春草在线视频免费观看 | 性欧美疯狂xxxxbbbb | 国产成人久久精品流白浆 | 人妻夜夜爽天天爽三区 | 中文字幕色婷婷在线视频 | 日产精品99久久久久久 | 少妇太爽了在线观看 | 久久精品国产一区二区三区 | 欧美一区二区三区视频在线观看 | 久久精品国产精品国产精品污 | 亚洲中文字幕在线无码一区二区 | аⅴ资源天堂资源库在线 | 激情爆乳一区二区三区 | 免费国产黄网站在线观看 | 亚洲小说春色综合另类 | 乌克兰少妇性做爰 | 亚洲a无码综合a国产av中文 | 巨爆乳无码视频在线观看 | 午夜精品久久久内射近拍高清 | 亚洲s码欧洲m码国产av | 亚洲国产欧美在线成人 | 波多野结衣乳巨码无在线观看 | 国产成人无码区免费内射一片色欲 | 无码成人精品区在线观看 | 亚洲欧美日韩综合久久久 | 纯爱无遮挡h肉动漫在线播放 | 亚洲成在人网站无码天堂 | 97久久精品无码一区二区 | 久久www免费人成人片 | 野外少妇愉情中文字幕 | 欧美猛少妇色xxxxx | 亚洲精品一区三区三区在线观看 | 在线看片无码永久免费视频 | 亚洲第一网站男人都懂 | 天下第一社区视频www日本 | 两性色午夜视频免费播放 | 扒开双腿吃奶呻吟做受视频 | 2020久久超碰国产精品最新 | 国产绳艺sm调教室论坛 | 一本一道久久综合久久 | 亚洲国产精品一区二区美利坚 | 国产在线精品一区二区高清不卡 | 色综合久久久无码中文字幕 | 亚洲欧美国产精品专区久久 | 无码人妻出轨黑人中文字幕 | 成人av无码一区二区三区 | 国产av剧情md精品麻豆 | 樱花草在线播放免费中文 | 久久久久亚洲精品中文字幕 | 精品久久久中文字幕人妻 | 亚洲精品成a人在线观看 | 久久精品国产一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产成人综合色在线观看网站 | 午夜性刺激在线视频免费 | 麻豆精产国品 | 亚洲 欧美 激情 小说 另类 | 男人扒开女人内裤强吻桶进去 | 精品夜夜澡人妻无码av蜜桃 | 红桃av一区二区三区在线无码av | 国产一区二区三区精品视频 | 欧美日韩精品 | 国精产品一品二品国精品69xx | 亚洲欧美日韩综合久久久 | 国产无套粉嫩白浆在线 | 综合激情五月综合激情五月激情1 | 欧美午夜特黄aaaaaa片 | 日韩精品无码免费一区二区三区 | 色综合久久中文娱乐网 | 美女毛片一区二区三区四区 | 天堂亚洲2017在线观看 | 中文字幕人成乱码熟女app | 日本精品高清一区二区 | 无码国产乱人伦偷精品视频 | 波多野结衣av在线观看 | 久久 国产 尿 小便 嘘嘘 | 国产精品久久久午夜夜伦鲁鲁 | 日本免费一区二区三区最新 | 国产肉丝袜在线观看 | 中文字幕中文有码在线 | 亚洲日韩av一区二区三区中文 | 亚洲а∨天堂久久精品2021 | 小鲜肉自慰网站xnxx | 国产区女主播在线观看 | 99久久精品日本一区二区免费 | 欧美第一黄网免费网站 | 成人一在线视频日韩国产 | 国产人妻精品午夜福利免费 | 欧美野外疯狂做受xxxx高潮 | 欧美激情一区二区三区成人 | 亚洲精品国产精品乱码不卡 | 俄罗斯老熟妇色xxxx | 国产成人精品必看 | 牲欲强的熟妇农村老妇女视频 | 男人扒开女人内裤强吻桶进去 | 色五月丁香五月综合五月 | 国产精品无码成人午夜电影 | 久久亚洲中文字幕精品一区 |