亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言interface詳解

2020-04-01 19:24:39
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Go語言interface詳解,本文講解了什么是interface、interface類型、interface值、空interface、interface函數(shù)參數(shù)等內(nèi)容,需要的朋友可以參考下
 

interface

Go語言里面設(shè)計最精妙的應(yīng)該算interface,它讓面向?qū)ο?,?nèi)容組織實現(xiàn)非常的方便,當(dāng)你看完這一章,你就會被interface的巧妙設(shè)計所折服。

什么是interface

簡單的說,interface是一組method的組合,我們通過interface來定義對象的一組行為。

我們前面一章最后一個例子中Student和Employee都能SayHi,雖然他們的內(nèi)部實現(xiàn)不一樣,但是那不重要,重要的是他們都能say hi

讓我們來繼續(xù)做更多的擴展,Student和Employee實現(xiàn)另一個方法Sing,然后Student實現(xiàn)方法BorrowMoney而Employee實現(xiàn)SpendSalary。

這樣Student實現(xiàn)了三個方法:SayHi、Sing、BorrowMoney;而Employee實現(xiàn)了SayHi、Sing、SpendSalary。

上面這些方法的組合稱為interface(被對象Student和Employee實現(xiàn))。例如Student和Employee都實現(xiàn)了interface:SayHi和Sing,也就是這兩個對象是該interface類型。而Employee沒有實現(xiàn)這個interface:SayHi、Sing和BorrowMoney,因為Employee沒有實現(xiàn)BorrowMoney這個方法。

interface類型

interface類型定義了一組方法,如果某個對象實現(xiàn)了某個接口的所有方法,則此對象就實現(xiàn)了此接口。詳細的語法參考下面這個例子

復(fù)制代碼代碼如下:

type Human struct {
    name string
    age int
    phone string
}

 

type Student struct {
    Human //匿名字段Human
    school string
    loan float32
}

type Employee struct {
    Human //匿名字段Human
    company string
    money float32
}

//Human對象實現(xiàn)Sayhi方法
func (h *Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s/n", h.name, h.phone)
}

// Human對象實現(xiàn)Sing方法
func (h *Human) Sing(lyrics string) {
    fmt.Println("La la, la la la, la la la la la...", lyrics)
}

//Human對象實現(xiàn)Guzzle方法
func (h *Human) Guzzle(beerStein string) {
    fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
}

// Employee重載Human的Sayhi方法
func (e *Employee) SayHi() {
    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s/n", e.name,
        e.company, e.phone) //此句可以分成多行
}

//Student實現(xiàn)BorrowMoney方法
func (s *Student) BorrowMoney(amount float32) {
    s.loan += amount // (again and again and...)
}

//Employee實現(xiàn)SpendSalary方法
func (e *Employee) SpendSalary(amount float32) {
    e.money -= amount // More vodka please!!! Get me through the day!
}

// 定義interface
type Men interface {
    SayHi()
    Sing(lyrics string)
    Guzzle(beerStein string)
}

type YoungChap interface {
    SayHi()
    Sing(song string)
    BorrowMoney(amount float32)
}

type ElderlyGent interface {
    SayHi()
    Sing(song string)
    SpendSalary(amount float32)
}

 

通過上面的代碼我們可以知道,interface可以被任意的對象實現(xiàn)。我們看到上面的Men interface被Human、Student和Employee實現(xiàn)。同理,一個對象可以實現(xiàn)任意多個interface,例如上面的Student實現(xiàn)了Men和YoungChap兩個interface。

最后,任意的類型都實現(xiàn)了空interface(我們這樣定義:interface{}),也就是包含0個method的interface。

interface值

那么interface里面到底能存什么值呢?如果我們定義了一個interface的變量,那么這個變量里面可以存實現(xiàn)這個interface的任意類型的對象。例如上面例子中,我們定義了一個Men interface類型的變量m,那么m里面可以存Human、Student或者Employee值。

因為m能夠持有這三種類型的對象,所以我們可以定義一個包含Men類型元素的slice,這個slice可以被賦予實現(xiàn)了Men接口的任意結(jié)構(gòu)的對象,這個和我們傳統(tǒng)意義上面的slice有所不同。

讓我們來看一下下面這個例子:

復(fù)制代碼代碼如下:

package main
import "fmt"

 

type Human struct {
    name string
    age int
    phone string
}

type Student struct {
    Human //匿名字段
    school string
    loan float32
}

type Employee struct {
    Human //匿名字段
    company string
    money float32
}

//Human實現(xiàn)SayHi方法
func (h Human) SayHi() {
    fmt.Printf("Hi, I am %s you can call me on %s/n", h.name, h.phone)
}

//Human實現(xiàn)Sing方法
func (h Human) Sing(lyrics string) {
    fmt.Println("La la la la...", lyrics)
}

//Employee重載Human的SayHi方法
func (e Employee) SayHi() {
    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s/n", e.name,
        e.company, e.phone)
    }

// Interface Men被Human,Student和Employee實現(xiàn)
// 因為這三個類型都實現(xiàn)了這兩個方法
type Men interface {
    SayHi()
    Sing(lyrics string)
}

func main() {
    mike := Student{Human{"Mike", 25, "222-222-XXX"}, "MIT", 0.00}
    paul := Student{Human{"Paul", 26, "111-222-XXX"}, "Harvard", 100}
    sam := Employee{Human{"Sam", 36, "444-222-XXX"}, "Golang Inc.", 1000}
    Tom := Employee{Human{"Tom", 37, "222-444-XXX"}, "Things Ltd.", 5000}

    //定義Men類型的變量i
    var i Men

    //i能存儲Student
    i = mike
    fmt.Println("This is Mike, a Student:")
    i.SayHi()
    i.Sing("November rain")

    //i也能存儲Employee
    i = Tom
    fmt.Println("This is Tom, an Employee:")
    i.SayHi()
    i.Sing("Born to be wild")

    //定義了slice Men
    fmt.Println("Let's use a slice of Men and see what happens")
    x := make([]Men, 3)
    //這三個都是不同類型的元素,但是他們實現(xiàn)了interface同一個接口
    x[0], x[1], x[2] = paul, sam, mike

    for _, value := range x{
        value.SayHi()
    }
}

 

通過上面的代碼,你會發(fā)現(xiàn)interface就是一組抽象方法的集合,它必須由其他非interface類型實現(xiàn),而不能自我實現(xiàn), Go通過interface實現(xiàn)了duck-typing:即"當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子"。

空interface

空interface(interface{})不包含任何的method,正因為如此,所有的類型都實現(xiàn)了空interface??読nterface對于描述起不到任何的作用(因為它不包含任何的method),但是空interface在我們需要存儲任意類型的數(shù)值的時候相當(dāng)有用,因為它可以存儲任意類型的數(shù)值。它有點類似于C語言的void*類型。

復(fù)制代碼代碼如下:

// 定義a為空接口
var a interface{}
var i int = 5
s := "Hello world"
// a可以存儲任意類型的數(shù)值
a = i
a = s

 

一個函數(shù)把interface{}作為參數(shù),那么他可以接受任意類型的值作為參數(shù),如果一個函數(shù)返回interface{},那么也就可以返回任意類型的值。是不是很有用啊!

interface函數(shù)參數(shù)

interface的變量可以持有任意實現(xiàn)該interface類型的對象,這給我們編寫函數(shù)(包括method)提供了一些額外的思考,我們是不是可以通過定義interface參數(shù),讓函數(shù)接受各種類型的參數(shù)。

舉個例子:fmt.Println是我們常用的一個函數(shù),但是你是否注意到它可以接受任意類型的數(shù)據(jù)。打開fmt的源碼文件,你會看到這樣一個定義:

復(fù)制代碼代碼如下:

type Stringer interface {
     String() string
}

也就是說,任何實現(xiàn)了String方法的類型都能作為參數(shù)被fmt.Println調(diào)用,讓我們來試一試
復(fù)制代碼代碼如下:

package main
import (
    "fmt"
    "strconv"
)

 

type Human struct {
    name string
    age int
    phone string
}

// 通過這個方法 Human 實現(xiàn)了 fmt.Stringer
func (h Human) String() string {
    return "?"+h.name+" - "+strconv.Itoa(h.age)+" years -  ? " +h.phone+"?"
}

func main() {
    Bob := Human{"Bob", 39, "000-7777-XXX"}
    fmt.Println("This Human is : ", Bob)
}

 

現(xiàn)在我們再回顧一下前面的Box示例,你會發(fā)現(xiàn)Color結(jié)構(gòu)也定義了一個method:String。其實這也是實現(xiàn)了fmt.Stringer這個interface,即如果需要某個類型能被fmt包以特殊的格式輸出,你就必須實現(xiàn)Stringer這個接口。如果沒有實現(xiàn)這個接口,fmt將以默認的方式輸出。

 

復(fù)制代碼代碼如下:

//實現(xiàn)同樣的功能
fmt.Println("The biggest one is", boxes.BiggestsColor().String())
fmt.Println("The biggest one is", boxes.BiggestsColor())

 

注:實現(xiàn)了error接口的對象(即實現(xiàn)了Error() string的對象),使用fmt輸出時,會調(diào)用Error()方法,因此不必再定義String()方法了。

interface變量存儲的類型

我們知道interface的變量里面可以存儲任意類型的數(shù)值(該類型實現(xiàn)了interface)。那么我們怎么反向知道這個變量里面實際保存了的是哪個類型的對象呢?目前常用的有兩種方法:

Comma-ok斷言

Go語言里面有一個語法,可以直接判斷是否是該類型的變量: value, ok = element.(T),這里value就是變量的值,ok是一個bool類型,element是interface變量,T是斷言的類型。

如果element里面確實存儲了T類型的數(shù)值,那么ok返回true,否則返回false。

讓我們通過一個例子來更加深入的理解。

 

復(fù)制代碼代碼如下:

package main

 

import (
    "fmt"
    "strconv"
)

type Element interface{}
type List [] Element

type Person struct {
    name string
    age int
}

//定義了String方法,實現(xiàn)了fmt.Stringer
func (p Person) String() string {
    return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)"
}

func main() {
    list := make(List, 3)
    list[0] = 1 // an int
    list[1] = "Hello" // a string
    list[2] = Person{"Dennis", 70}

    for index, element := range list {
        if value, ok := element.(int); ok {
            fmt.Printf("list[%d] is an int and its value is %d/n", index, value)
        } else if value, ok := element.(string); ok {
            fmt.Printf("list[%d] is a string and its value is %s/n", index, value)
        } else if value, ok := element.(Person); ok {
            fmt.Printf("list[%d] is a Person and its value is %s/n", index, value)
        } else {
            fmt.Println("list[%d] is of a different type", index)
        }
    }
}

 

是不是很簡單啊,同時你是否注意到了多個if里面,還記得我前面介紹流程時講過,if里面允許初始化變量。

也許你注意到了,我們斷言的類型越多,那么if else也就越多,所以才引出了下面要介紹的switch。

switch測試

最好的講解就是代碼例子,現(xiàn)在讓我們重寫上面的這個實現(xiàn)

 

復(fù)制代碼代碼如下:

package main

 

import (
    "fmt"
    "strconv"
)

type Element interface{}
type List [] Element

type Person struct {
    name string
    age int
}

//打印
func (p Person) String() string {
    return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)"
}

func main() {
    list := make(List, 3)
    list[0] = 1 //an int
    list[1] = "Hello" //a string
    list[2] = Person{"Dennis", 70}

    for index, element := range list{
        switch value := element.(type) {
            case int:
                fmt.Printf("list[%d] is an int and its value is %d/n", index, value)
            case string:
                fmt.Printf("list[%d] is a string and its value is %s/n", index, value)
            case Person:
                fmt.Printf("list[%d] is a Person and its value is %s/n", index, value)
            default:
                fmt.Println("list[%d] is of a different type", index)
        }
    }
}

 

這里有一點需要強調(diào)的是:element.(type)語法不能在switch外的任何邏輯里面使用,如果你要在switch外面判斷一個類型就使用comma-ok。

嵌入interface

Go里面真正吸引人的是它內(nèi)置的邏輯語法,就像我們在學(xué)習(xí)Struct時學(xué)習(xí)的匿名字段,多么的優(yōu)雅啊,那么相同的邏輯引入到interface里面,那不是更加完美了。如果一個interface1作為interface2的一個嵌入字段,那么interface2隱式的包含了interface1里面的method。

我們可以看到源碼包container/heap里面有這樣的一個定義

 

復(fù)制代碼代碼如下:

type Interface interface {
    sort.Interface //嵌入字段sort.Interface
    Push(x interface{}) //a Push method to push elements into the heap
    Pop() interface{} //a Pop elements that pops elements from the heap
}

 

我們看到sort.Interface其實就是嵌入字段,把sort.Interface的所有method給隱式的包含進來了。也就是下面三個方法:

 

復(fù)制代碼代碼如下:

type Interface interface {
    // Len is the number of elements in the collection.
    Len() int
    // Less returns whether the element with index i should sort
    // before the element with index j.
    Less(i, j int) bool
    // Swap swaps the elements with indexes i and j.
    Swap(i, j int)
}

 

另一個例子就是io包下面的 io.ReadWriter ,它包含了io包下面的Reader和Writer兩個interface:

 

復(fù)制代碼代碼如下:

// io.ReadWriter
type ReadWriter interface {
    Reader
    Writer
}

 

反射

Go語言實現(xiàn)了反射,所謂反射就是能檢查程序在運行時的狀態(tài)。我們一般用到的包是reflect包。如何運用reflect包,官方的這篇文章詳細的講解了reflect包的實現(xiàn)原理,laws of reflection

使用reflect一般分成三步,下面簡要的講解一下:要去反射是一個類型的值(這些值都實現(xiàn)了空interface),首先需要把它轉(zhuǎn)化成reflect對象(reflect.Type或者reflect.Value,根據(jù)不同的情況調(diào)用不同的函數(shù))。這兩種獲取方式如下:

復(fù)制代碼代碼如下:

t := reflect.TypeOf(i)    //得到類型的元數(shù)據(jù),通過t我們能獲取類型定義里面的所有元素
v := reflect.ValueOf(i)   //得到實際的值,通過v我們獲取存儲在里面的值,還可以去改變值

轉(zhuǎn)化為reflect對象之后我們就可以進行一些操作了,也就是將reflect對象轉(zhuǎn)化成相應(yīng)的值,例如
復(fù)制代碼代碼如下:

tag := t.Elem().Field(0).Tag  //獲取定義在struct里面的標簽
name := v.Elem().Field(0).String()  //獲取存儲在第一個字段里面的值

獲取反射值能返回相應(yīng)的類型和數(shù)值
復(fù)制代碼代碼如下:

var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())

 

最后,反射的話,那么反射的字段必須是可修改的,我們前面學(xué)習(xí)過傳值和傳引用,這個里面也是一樣的道理。反射的字段必須是可讀寫的意思是,如果下面這樣寫,那么會發(fā)生錯誤

復(fù)制代碼代碼如下:

var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1)

如果要修改相應(yīng)的值,必須這樣寫
復(fù)制代碼代碼如下:

var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()
v.SetFloat(7.1)

上面只是對反射的簡單介紹,更深入的理解還需要自己在編程中不斷的實踐。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
天天干在线视频论坛| 一本大道久久精品| 欧美激情午夜| 亚洲激情综合| 亚洲成人av在线| 亚洲激情图片| 国产精品自拍av| 亚洲综合欧美色图| 宅男噜噜噜66国产精品免费| 亚洲女人18毛片水真多| 亚洲大尺度在线观看| 国产chinese男男gaygay网站| 性欧美xxxx大乳国产app| 人妻少妇无码精品视频区| 成人国产一区二区三区精品麻豆| 先锋在线资源一区二区三区| 成人观看高清在线观看免费| 中文字幕观看av| 成年人在线观看视频免费| 五月婷婷深爱五月| 波多野结衣在线一区二区| 欧美亚洲一区二区三区四区| 免费在线观看h片| 性人久久久久| 毛片在线播放网站| 日本一级大毛片a一| 播金莲一级淫片aaaaaaa| 自拍偷拍亚洲天堂| 亚洲欧美色图小说| 国产欧美日韩久久| 欧美黄色三级网站| www污污网站在线看| 手机电影在线观看| av网站免费看| 亚洲国产精一区二区三区性色| 国产精久久久久| 日韩欧美一级精品久久| 欧美日韩一区二区三区视频播放| av网站在线免费看| 国产精品xxx| 中文字幕一区三区| 中文字幕亚洲情99在线| 91蜜桃臀久久一区二区| 亚洲国产一区二区三区在线| 成人免费图片免费观看| 91视视频在线观看入口直接观看www| 久久久视频免费观看| 久草这里只有精品视频| 日韩av免费看| av免费在线播放网站| 777亚洲妇女| 国产视频在线观看网站| 国产精品久久久久久69| 91av一区| 日韩电影天堂视频一区二区| 国产一区二区三区黄片| 国产免费视频在线| 老司机在线免费视频| 精品国产一区二区三区四区四| 久久精品亚洲乱码伦伦中文| 天堂在线亚洲视频| 精品麻豆视频| 久久久亚洲精品视频| 亚洲AV成人无码精电影在线| 成人精品国产免费网站| av一本久道久久波多野结衣| 中文字幕欧美日韩一区二区三区| 中文在线第一页| 天天综合成人网| 欧美性大战久久久久| 中文字幕欧美在线| 男女爱爱福利视频| 欧美一区二区三区久久| 欧美亚洲专区| 四虎影视一区二区| 日欧美一区二区| 国产免费黄网站| 深夜爽爽视频| 99成人国产精品视频| 97碰碰视频| 久草资源在线视频| 麻豆一二三区精品蜜桃| 91精品一区二区三区蜜桃| 福利一区福利二区| 亚洲男人第一天堂| 2025国产精品自拍| 国产精品黄色影片导航在线观看| 久久综合九色综合久久久精品综合| 国产真实伦在线观看| 亚洲影视一区二区| 天干天干啦夜天天天视频| 中文字幕在线永久在线视频2020| 国产成人精品优优av| 国产99999| **亚洲第一综合导航网站| 日韩欧美亚洲系列| 天天做天天爱天天高潮| 亚洲区中文字幕| av先锋下载| 色视频www在线播放国产| 一区二区三区在线观看动漫| 亚洲理论在线观看| 一区二区三区欧洲区| 国风产精品一区二区| www.尤物.com| 国产精品视频一二三四区| 黄网在线免费| 91超碰在线电影| 午夜精品一区二区三区在线视| 国产吧在线视频| 综合图区亚洲白拍在线| 无码少妇一区二区三区| 久热久热免费视频中文字幕777| 一区二区成人网| 在线观看免费国产小视频| 国产一区二区自拍视频| www.99re.av| 欧美超强性xxxxx| 97超碰成人| 欧美日韩视频专区在线播放| 青青草成人免费视频| 99免费在线视频观看| 114国产精品久久免费观看| 成人午夜电影在线播放| av网址在线观看免费| 久久综合在线观看| 黄色在线免费看| a4yy在线播放免费观看视频| 在线看污网站| 国产小视频在线看| 精品无码人妻一区二区免费蜜桃| 一级α片免费看刺激高潮视频| 一区二区三区日| 国产黄色网页| 午夜精品久久久久久毛片| 成人美女在线视频| 久久九九国产精品| 久久久久久久高清| 91久久奴性调教| 国产亚洲精品免费| 国产精品美女一区二区在线观看| 国内不卡的二区三区中文字幕| www.com.av| 欧美极品在线观看| 精品久久一区| 99re6在线精品视频免费播放| 国产黄色免费网站| 99re热精品视频| 久久久久久久久久国产精品| 91精品婷婷国产综合久久| 综合自拍亚洲综合图不卡区| 日韩国产高清污视频在线观看| 伊人久久综合视频| 粉嫩av一区二区三区| 亚洲专区欧美专区| 久久精品青草| 日韩专区在线播放| 一本久久a久久精品亚洲| h在线观看免费| 国产丝袜一区二区| 国产 日韩 欧美大片| 国产精品99久久久久久动医院| 粉嫩aⅴ一区二区三区四区五区| 亚洲综合自拍一区| 51精品免费网站| sese久久| 美女色狠狠久久| 国产欧美日韩亚洲精品| 99精品视频在线免费播放| 成年人在线视频免费观看| 国产日本欧美一区二区三区在线| 国内精品久久久久久野外| 精品中文字幕一区二区三区| 中文字幕中文字幕在线一区| 男人天堂网页| 鲁一鲁一鲁一鲁一澡| 久草视频国产| 欧美不卡在线播放| 免费国产a级片| 欧美偷窥清纯综合图区| 9191国产精品| 国产精品午夜剧场| 免费一级特黄特色毛片久久看| 国产精品sss| 国产成人精品久久二区二区| 亚洲精品国产一区二| 亚洲天堂影院在线观看| av在线www| 亚洲图中文字幕| 日韩三级精品电影久久久| 欧美日韩一区在线| 欧美一级电影久久| 国产91精品一区二区绿帽| 一级aaaa毛片| 日韩激情一区二区| 老司机精品视频在线| 色婷婷久久av| 中文字幕免费精品一区高清| 久久99影院| 青草视频在线观看视频| 日本欧洲国产一区二区| 欧美激情久久久久久久久久久| 中文字幕在线亚洲| 精品乱码一区二区三四区视频| 成人做爰www免费看视频网站| 日韩欧美中文免费| 日本一区二区视频在线| 中文字幕在线网址| 99久久精品国产成人一区二区| 99在线精品视频免费观看20| 精品粉嫩aⅴ一区二区三区四区| 天天色天天干天天| 黄色工厂在线观看| 精品五月天堂| 秋霞国产午夜精品免费视频| 久久精品女人的天堂av| 国产91在线播放精品| 国产mv免费观看入口亚洲| 久久不卡国产精品一区二区| 精品国产制服丝袜高跟| 萌白酱国产一区二区| 色爱av美腿丝袜综合粉嫩av| 国产高清中文字幕在线| 男生操女生视频在线观看| 国产欧美日本在线| 狠狠热免费视频| 国产高清精品久久久久| 国产美女精品写真福利视频| 一区二区三区四区欧美| 欧美精品一区二区三区在线看午夜| 视频一区视频二区视频三区高| 中文字幕在线视频精品| huan性巨大欧美| 天天操天天爽天天射| 精品一区中文字幕| 日韩精品久久久久久久软件91| 一本色道久久综合狠狠躁篇怎么玩| 久久av一区二区| 凹凸日日摸日日碰夜夜爽1| 国产一二三精品| 亚洲午夜视频| 图片区 小说区 区 亚洲五月| 亚洲人成在线影院| 香蕉网在线播放| 欧美成人观看免费全部完小说| 大陆极品少妇内射aaaaa| 成人区一区二区| 国内精品不卡一区二区三区| 色婷婷久久一区二区三区麻豆| 丁香婷婷成人| 欧美全黄视频| 一区二区久久精品66国产精品| 欧美浪妇xxxx高跟鞋交| 国产农村妇女精品一二区| 99精品中文字幕| 老色鬼精品视频在线观看播放| 亚洲精品视频一二三| 久久人人爽国产| 91黄色免费网站| 99免在线观看免费视频高清| 欧美三级电影精品| 中文字幕佐山爱一区二区免费| 日本在线免费网| 精品国产乱码久久久久| 国产三级在线观看视频| 欧美又大又硬又粗bbbbb| 日韩美女视频在线观看| 中文字幕人妻一区二区| www.xxx黄| 亚洲福利电影网| 国产亚洲精品午夜高清影院| 国产一级电影网| 鲁丝一区二区三区免费| 国产精品剧情| 波多野结衣家庭教师| 九色porny91| 丰满少妇高潮久久三区| 在线观看免费观看在线91| 国产精品久久久久一区二区| 777精品久无码人妻蜜桃| 久久成人国产精品入口| 欧美xxxx黑人又粗又长精品| 日韩免费看片| 91video| 性猛交ⅹxxx富婆video| 97精品国产综合久久久动漫日韩| 国产视频一区在线观看一区免费| 精品国产乱码久久久久久蜜坠欲下| 美女看a上一区| 国产日韩欧美高清在线| 精品视频在线播放一区二区三区| 韩国一区二区三区四区| 999精品视频在线观看播放| 亚洲国产精彩中文乱码av在线播放| 九一国产精品视频| 在线欧美不卡| 欧美国产日韩综合| 国产一区二区三区在线视频| 欧美日韩情趣电影| 日韩欧美天堂| 成人免费毛片在线观看| 欧美三区在线| 都市激情亚洲色图| 五月婷婷导航| 天天射综合网站| 日本少妇性高潮| 色综合欧美在线视频区| 免费高清在线观看免费| 色播亚洲视频在线观看| 国产a√精品区二区三区四区| 精品999在线播放| 93久久精品日日躁夜夜躁欧美| 国产精品狼人久久影院观看方式| 同产精品九九九| 粉嫩av一区二区三区在线播放| 国产一区二区日韩精品欧美精品| 哺乳挤奶一区二区三区免费看| 97在线影院| 国产午夜精品视频| 欧美在线一级va免费观看| 风间由美性色一区二区三区四区| 久久精品国产亚洲a∨麻豆| 丁香综合av| 要久久爱电视剧全集完整观看| 中文字幕在线观看播放| 国产日韩一区在线| 性欧美xxxx视频在线观看| 成年人三级黄色片|