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

Go中這么多創(chuàng)建Error的方式,你真的了解它們各自的應(yīng)用場景嗎

開發(fā) 前端
本文從應(yīng)用場景的角度講解了各種創(chuàng)建錯誤方式的實際應(yīng)用場景。示例中的代碼盡量的選自golang源碼或開源項目。同時,每種的應(yīng)用場景并非絕對的,需要靈活應(yīng)用。希望本文對大家在實際使用中能夠有所幫助。

大家好,我是漁夫子。今天從應(yīng)用場景的角度來聊聊我對error的理解。

01 什么是Error

在Go中,error是一種內(nèi)建的數(shù)據(jù)類型,被定義為一個接口,定義如下:

// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
	Error() string
}

由此可知,該接口只有一個返回字符串的Error函數(shù),所有的類型只要實現(xiàn)了該函數(shù),就創(chuàng)建了一個錯誤類型。

02 創(chuàng)建error的方式

創(chuàng)建error的方式包括errors.New、fmt.Errorf、自定義實現(xiàn)了error接口的類型等。

2.1 通過errors.New方法創(chuàng)建

通過該方法創(chuàng)建的錯誤一般是可預(yù)知的錯誤。簡單來說就是調(diào)用者通過該錯誤信息就能明確的知道哪里出錯了,而不需要再額外的添加其他上下文信息,我們在下面的示例中詳細(xì)說明。

err := errors.New("this is error")

我們看New方法的實現(xiàn)可知,實際上是返回了一個errorString結(jié)構(gòu)體,該結(jié)構(gòu)體包含了一個字符串屬性,并實現(xiàn)了Error方法。代碼如下:

func New(text string) error {
	return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
	s string
}

func (e *errorString) Error() string {
	return e.s
}

error.New 使用場景1

通過errors.New函數(shù)創(chuàng)建局部變量或匿名變量,且不在調(diào)用函數(shù)中進(jìn)行值或類型判斷的處理,只打印或記錄錯誤日志的場景。

使用示例1

以下代碼節(jié)選自源碼/src/net/http/request.go中解析PostForm的部分。當(dāng)請求中的Body為nil時,返回的錯誤信息是"missing form body"。該信息已明確的說明錯誤是因為請求體為空造成的,所以不需要再額外的添加其他上下文信息。

func parsePostForm(r *Request) (vs url.Values, err error) {
	if r.Body == nil {
		err = errors.New("missing form body")
		return
	}
	ct := r.Header.Get("Content-Type")
	// 省略了后續(xù)的代碼...
	return
}

使用示例2

以下代碼節(jié)選自源碼/src/net/http/transport.go的部分,當(dāng)請求體中的url地址為nil返回的錯誤:"http: nil Request.URL" ,說明是請求中的URL字段為nil。以及當(dāng)Header為nil返回的錯誤:"http:nil Request.Header",說明請求體中的Header字段為nil。

func (t *Transport) roundTrip(req *Request) (*Response, error) {
	t.nextProtoOnce.Do(t.onceSetNextProtoDefaults)
	ctx := req.Context()
	trace := httptrace.ContextClientTrace(ctx)

	if req.URL == nil {
		req.closeBody()
		return nil, errors.New("http: nil Request.URL")
	}
	if req.Header == nil {
		req.closeBody()
		return nil, errors.New("http: nil Request.Header")
	}
	//省略后面的代碼...
}

error.New 使用場景2

將errors.New創(chuàng)建的錯誤賦值給一個全局的變量,我們稱該變量為哨兵錯誤,該哨兵錯誤變量可以在被處理的時候使用 == 或 errors.Is來進(jìn)行值的比較。

使用示例

在源碼/src/io/io.go中定義的代表文件末尾的哨兵錯誤變量EOF。

var EOF = errors.New("EOF")

在beego項目中,beego/core/utils/file.go文件中有這樣的應(yīng)用,當(dāng)讀取文件時,遇到的錯誤不是文件末尾的錯誤則直接返回,如果遇到的是文件末尾的錯誤,則中斷for循環(huán),說明文件已經(jīng)讀完文件中的所有內(nèi)容了。如下:

func GrepFile(patten string, filename string) (lines []string, err error) {
	//省略前面的代碼...
	
	fd, err := os.Open(filename)
	if err != nil {
		return
	}
	
	reader := bufio.NewReader(fd)
	for {
		byteLine, isPrefix, er := reader.ReadLine()
		if er != nil && er != io.EOF {
			return nil, er
		}
		if er == io.EOF {
			break
		}
		//省略后面的代碼...
	}

2.2 通過fmt.Errorf方法創(chuàng)建

該方法也有兩種形式,一種是帶%w占位符的,一種是不帶%w占位符的方式。

使用場景1:不帶%w占位符

在創(chuàng)建錯誤的時候,不能通過errors.New創(chuàng)建的字符串信息來描述錯誤,而需要通過占位符添加更多的上下文信息,即動態(tài)信息。

使用示例:不帶%w占位符

以下代碼節(jié)選自gorm/schema/relationship.go的部分代碼,當(dāng)外鍵不合法時,通過fmt.Errorf("invalid foreign key:%s", foreignKey)返回帶具體外鍵的錯誤。因為外鍵值是在運行時才能確定的。代碼如下:

func (schema *Schema) buildMany2ManyRelation(relation *Relationship, field *Field, many2many string) {
	//...
	
	if len(relation.foreignKeys) > 0 {
		ownForeignFields = []*Field{}
		for _, foreignKey := range relation.foreignKeys {
			if field := schema.LookUpField(foreignKey); field != nil {
				ownForeignFields = append(ownForeignFields, field)
			} else {
				schema.err = fmt.Errorf("invalid foreign key: %s", foreignKey)
				return
			}
		}
	}
	//...
}

使用場景2:帶%w占位符

在有些場景下,調(diào)用者需要知道原始錯誤信息,這時就需要使用帶%w占位符的fmt.Errorf方式來創(chuàng)建錯誤,使用這種方式,其實是形成了一個錯誤鏈。

其用法如下:

filename := "abc.webp"
fmt.Errorf("%w:%s", errors.New("unsupported extension"), filename)

我們再來看下源代碼:

func Errorf(format string, a ...interface{}) error {
	p := newPrinter()
	p.wrapErrs = true
	p.doPrintf(format, a)
	s := string(p.buf)
	var err error
	if p.wrappedErr == nil {
		err = errors.New(s)
	} else {
		err = &wrapError{s, p.wrappedErr}
	}
	p.free()
	return err
}

通過源碼可知,如果fmt.Errorf中包含%w占位符,創(chuàng)建的是一個wrapError結(jié)構(gòu)體類型的值。我們再來看下wrapError結(jié)構(gòu)體的定義:

type wrapError struct {
	msg string
	err error
}

字段err就是原始錯誤,msg是經(jīng)過格式化之后的錯誤信息。

使用示例:帶%w占位符

假設(shè)我們有一個從數(shù)據(jù)庫查詢合同的函數(shù),當(dāng)從數(shù)據(jù)庫中查詢到記錄為空時,會返回一個sql.ErrNoRows錯誤,我們用%w占位符來wrap該錯誤,并返回給調(diào)用者。

const query = "..."
func (s Store) GetContract(name string) (Contract, error) {
	id := getID(name)
	rows, err := s.db.Query(query, id)
	if err != nil {
		if err == sql.ErrNoRows {
			return Contract{},
			fmt.Errorf("no contract found for %s: %w", name, err) 
		}
		// ...
	}
	// ...
}

好了,現(xiàn)在GetContract的調(diào)用者可以知道原始的錯誤信息了。在調(diào)用者邏輯中我們可以使用errors.Is來判斷err中是否包含sql.ErrNoRows值了。我們看下調(diào)用者的代碼:

contract, err := store.GetContract("Raul Endymion")
if err != nil {
	if errors.Is(err, sql.ErrNoRows) { 
		// Do something specific
	}
}

2.3 自定義實現(xiàn)了error接口的結(jié)構(gòu)體

使用場景

這個是相對errors.New來說的,errors.New適用于對可預(yù)知的錯誤的定義。而當(dāng)發(fā)生了不可預(yù)知的錯誤時,就需要自定義錯誤類型了。

使用示例

我們以go中/src/io/fs/fs.go文件中的源碼為例,來看下自定義錯誤類型都需要包含哪些元素。

// PathError records an error and the operation and file path that caused it.
type PathError struct {
	Op   string
	Path string
	Err  error
}

func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }

func (e *PathError) Unwrap() error { return e.Err }

首先看結(jié)構(gòu)體,有一個error接口類型的Err,這個代表的是錯誤源,因為根據(jù)上面講解的,在錯誤層層傳遞返回給調(diào)用者時,我們需要追蹤每一層的原始錯誤信息,所以需要該字段對error進(jìn)行wrap,形成錯誤鏈。另外,有兩個字段Op和Path,分別代表是產(chǎn)生該錯誤的操作和操作的路徑。這兩個字段就是所謂的未預(yù)料到的錯誤:不確定是針對哪個路徑做了什么錯誤引發(fā)了該錯誤。

我們看下該錯誤類型在代碼中的應(yīng)用。

應(yīng)用1:在go的文件src/embed/embed.go中的代碼,當(dāng)讀取某目錄時返回的一個PathError類型的錯誤,代表讀取該目錄操作時,因為是一個目錄,所以不能直接讀取文件內(nèi)容。

func (d *openDir) Read([]byte) (int, error) {
	return 0, &fs.PathError{Op: "read", Path: d.f.name, Err: errors.New("is a directory")}
}

應(yīng)用2:在go的文件src/embed/embed.go中的代碼中,有文件讀取的函數(shù),當(dāng)offset小于0時,返回了一個PathError,代表是在讀取該文件的時候,參數(shù)不正確。

func (f *openFile) Read(b []byte) (int, error) {
	if f.offset >= int64(len(f.f.data)) {
		return 0, io.EOF
	}
	if f.offset < 0 {
		return 0, &fs.PathError{Op: "read", Path: f.f.name, Err: fs.ErrInvalid}
	}
	n := copy(b, f.f.data[f.offset:])
	f.offset += int64(n)
	return n, nil
}

fs.ErrInvalid的定義如下

ErrInvalid    = errors.New("invalid argument")

由此可見,PathError中的三個字段值都是不可預(yù)知的,都需要在程序運行時才能具體決定的,所以這種場景時,則需要自定義錯誤類型。

另外,我們還注意到該自定義的類型中有Unwrap函數(shù)的實現(xiàn),該函數(shù)主要是為了配合errors.Is和errors.As使用的,因為這兩個函數(shù)在使用時是將錯誤鏈層層解包一一比對的。

03 errors.Is和errors.As

根據(jù)上一節(jié)我們得到,通過%w占位符可以將錯誤組織成一個錯誤鏈。我們再來看看通過errors.Is和errors.As如何處理被wrap過的錯誤鏈。

errors.Is函數(shù)就是來判斷錯誤鏈中有沒有和指定的錯誤值相等的錯誤,相當(dāng)于 == 操作符。注意,這里是特定的錯誤值,就像gorm中定義的ErrRecordNotFound這樣:

var ErrRecordNotFound = errors.New("record not found")

那么我們就可以這樣使用errors.Is:

errors.Is(err, ErrRecordNotFound)

errors.As函數(shù),該函數(shù)是用來檢查錯誤鏈中的錯誤是否有指定的錯誤類型的。

如下代碼示例是節(jié)選自etcd項目etcd/server/embed/config_logging.go中的部分代碼,代表的是err鏈中有沒有能當(dāng)做json.SyntaxError類型的錯誤的,如果能,則將err中的錯誤值賦值到syntaxError變量上,代碼如下:

// setupLogRotation initializes log rotation for a single file path target.
func setupLogRotation(logOutputs []string, logRotateConfigJSON string) error {
	//...

	if err := json.Unmarshal([]byte(logRotateConfigJSON), &logRotationConfig); err != nil {
		var unmarshalTypeError *json.UnmarshalTypeError
		var syntaxError *json.SyntaxError
		switch {
		case errors.As(err, &syntaxError):
			return fmt.Errorf("improperly formatted log rotation config: %w", err)
		case errors.As(err, &unmarshalTypeError):
			return fmt.Errorf("invalid log rotation config: %w", err)
		}
	}
	zap.RegisterSink("rotate", func(u *url.URL) (zap.Sink, error) {
		logRotationConfig.Filename = u.Path[1:]
		return &logRotationConfig, nil
	})
	return nil
}

總結(jié)

本文從應(yīng)用場景的角度講解了各種創(chuàng)建錯誤方式的實際應(yīng)用場景。示例中的代碼盡量的選自golang源碼或開源項目。同時,每種的應(yīng)用場景并非絕對的,需要靈活應(yīng)用。希望本文對大家在實際使用中能夠有所幫助。

責(zé)任編輯:武曉燕 來源: Go學(xué)堂
相關(guān)推薦

2021-09-08 22:38:56

區(qū)塊鏈公有鏈網(wǎng)絡(luò)

2018-10-06 21:51:37

代碼SOLID編程

2023-04-28 07:49:13

Javawaitsleep

2022-01-05 16:16:02

查詢編程工程師

2018-08-28 16:10:36

2024-01-25 10:14:09

HashSetHashMapJava

2018-10-07 06:30:40

代碼設(shè)計模式面向?qū)ο笤瓌t

2021-11-26 08:07:16

MySQL SQL 語句數(shù)據(jù)庫

2021-03-24 08:44:11

代碼內(nèi)存消耗語言

2021-06-09 10:10:20

代碼內(nèi)存編程語言

2022-07-06 11:47:27

JAVAfor循環(huán)

2023-12-08 08:29:53

SpringAOP日志

2025-01-03 08:09:15

2020-12-21 14:42:42

大數(shù)據(jù)云計算人工智能

2024-10-16 17:10:41

2022-11-28 11:45:30

Go應(yīng)用場景

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

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

2018-12-21 11:24:55

Java時間處理編程語言

2020-12-31 05:49:44

FlinkSQL函數(shù)
點贊
收藏

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

精品人妻一区二区三区蜜桃视频| 久久99精品久久久久子伦 | 91一区二区三区在线播放| 亚洲2020天天堂在线观看| 无码 人妻 在线 视频| 二区三区精品| 91久久线看在观草草青青| 国产四区在线观看| 欧美777四色影视在线| 久久精品国产亚洲a| 久久久久久久久久久免费精品 | 亚洲人成伊人成综合网小说| 国产日韩精品久久| 一级黄色短视频| 国产欧美丝祙| 欧美美最猛性xxxxxx| 久久久久久久久久久久| 99精品中文字幕在线不卡| 欧美三级在线看| 国产精品999视频| 国产精品一区二区三区视频网站| 91亚洲国产成人精品一区二区三| 91久久久久久久一区二区| 日韩欧美高清在线观看| 亚洲精彩视频| 中文字幕精品视频| 亚洲av无码成人精品国产| 亚洲精品福利| 欧美一级片在线| 免费看涩涩视频| 欧美成人影院| 狠狠躁夜夜躁人人躁婷婷91| 精品少妇人欧美激情在线观看| 麻豆网站在线看| 国产日韩欧美高清| 免费精品视频一区二区三区| 日韩一级免费视频| 成人免费视频网站在线观看| 5566av亚洲| 国产婷婷在线视频| 国产原创一区二区| 国产噜噜噜噜久久久久久久久| 欧美性猛交bbbbb精品| 在线国产欧美| 97色在线视频| 久久久久久久黄色片| 激情欧美亚洲| 性欧美xxxx| 国产福利拍拍拍| 亚洲一区图片| 欧洲成人在线视频| 久久亚洲精品石原莉奈| 亚洲一区免费| 国产成人精品电影| 制服丝袜在线一区| 蜜臀av一区二区在线观看| 国产精品吊钟奶在线| 国产情侣免费视频| 九色综合狠狠综合久久| 91在线视频一区| 国产乱叫456在线| 国产乱子伦视频一区二区三区 | 国产精品久久久久久久久快鸭| 色综合电影网| 精品美女在线观看视频在线观看 | 国产69精品久久777的优势| 成人高清在线观看| 神马午夜电影一区二区三区在线观看 | 欧美久久综合网| 主播福利视频一区| 青草影院在线观看| 亚洲国产一区二区精品专区| 欧美中文在线免费| 中文字幕日本人妻久久久免费 | av激情在线| 亚洲动漫第一页| 国产精品亚洲αv天堂无码| 亚洲电影有码| 日韩一区二区电影在线| 欧美一区二区三区思思人| 97国产在线视频| 国产手机在线视频| 日一区二区三区| 国产日韩在线视频| 亚洲乱码在线观看| 久久综合久久鬼色| 中文字幕中文字幕一区三区| 欧美xxxx性xxxxx高清| 色又黄又爽网站www久久| 久久人人爽av| 精品无人区一区二区| 亚洲偷欧美偷国内偷| 97成人资源站| 亚洲欧美日本国产专区一区| 成人免费视频97| 四虎精品成人免费网站| 亚洲欧美另类久久久精品2019| 97在线国产视频| 久久久久久久性潮| 亚洲精品www久久久| 国产精品久久国产精麻豆96堂| 在线精品福利| 国产美女一区二区| 精品欧美一区二区久久久伦| 川上优的av在线一区二区| 一区二区欧美视频| 亚欧在线免费观看| 精品网站aaa| 久久视频免费在线播放| www.国产毛片| 成人午夜精品在线| 色呦呦网站入口| 国精产品一区二区三区有限公司| 精品国产乱码久久久久久闺蜜| 亚洲综合第一区| 99热这里只有成人精品国产| 91在线高清视频| 在线观看黄色av| 色天天综合久久久久综合片| 国产高潮失禁喷水爽到抽搐| 久久精品久久久| 国产精品精品久久久久久| 色欲av伊人久久大香线蕉影院| 综合自拍亚洲综合图不卡区| 亚洲成色www.777999| 真实原创一区二区影院| 久久久久久久香蕉网| 2019中文字幕免费视频| 日韩 中文字幕| 五月开心六月丁香综合色啪| 欧洲日韩成人av| 成人免费一级视频| 亚洲女性喷水在线观看一区| 91小视频网站| 国产精品三级| 国产成人鲁鲁免费视频a| 亚洲精品人妻无码| 亚洲精品免费在线播放| 午夜一级免费视频| 久久中文字幕av| 国产精品福利网| 国产在线观看网站| 色婷婷综合五月| 免费观看av网站| 亚洲免费网站| 欧美一区二区三区精美影视| 综合日韩av| 亚洲精品视频网上网址在线观看| 日韩毛片在线播放| 99视频超级精品| 精品无码一区二区三区在线| 国产精品一区二区三区美女| 欧美激情在线狂野欧美精品| 欧美性猛交 xxxx| 亚洲成人免费观看| 欧美 日本 国产| 亚洲欧美日韩精品一区二区| 欧美大香线蕉线伊人久久国产精品 | 亚洲精品在线观看www| 亚洲不卡视频在线观看| 久久青草欧美一区二区三区| 天天爱天天操天天干| 日韩欧美视频| 亚洲伊人一本大道中文字幕| 日本一级理论片在线大全| 亚洲成人亚洲激情| 成人公开免费视频| 中文字幕在线观看一区二区| 久久6免费视频| 伊人成人网在线看| 欧美精品一区在线| 色999久久久精品人人澡69 | 西游记1978| 精品入口麻豆88视频| 欧美第一黄网免费网站| 少妇人妻一区二区| 欧洲色大大久久| 91久久国产综合| 成人av资源站| 九色91popny| 欧美日韩免费观看一区=区三区| 国产亚洲福利社区| 亚洲成av在线| 久久91亚洲人成电影网站| 亚洲色大成网站www| 欧美剧在线免费观看网站 | 91成人在线观看喷潮| 欧美aaa级片| 成人免费电影视频| 黄色aaa级片| 亚洲国产清纯| 一本一生久久a久久精品综合蜜 | 亚洲精品福利在线| 中文字幕丰满人伦在线| 亚洲国产人成综合网站| 国产成人无码精品久久二区三| 国产麻豆一精品一av一免费| 好吊妞无缓冲视频观看| 五月天综合网站| 美媛馆国产精品一区二区| 国产精品日韩精品在线播放| 456亚洲影院| 亚洲婷婷噜噜| 中文字幕视频一区二区在线有码| 午夜精品久久久久久久第一页按摩| 在线免费亚洲电影| 久久精品这里有| 《视频一区视频二区| 一本色道综合久久欧美日韩精品| 国产一区二区看久久| 日韩中文字幕免费在线| 18成人免费观看视频| 在线观看成人一级片| 亚洲人成网站77777在线观看| 91久久精品www人人做人人爽 | 在线观看视频91| 国产对白videos麻豆高潮| 综合色天天鬼久久鬼色| 久久久久久国产免费a片| 99精品桃花视频在线观看| 国产一级片中文字幕| 日韩精品1区2区3区| 国产精品久久久久久久久电影网| 日韩a一区二区| 欧美裸体网站| 久久91麻豆精品一区| 狠狠综合久久av| 最新精品在线| 97自拍视频| 国产亚洲久久| 91午夜在线播放| 久久青草视频| 国产精品一区av| 精品日本视频| 国产精彩精品视频| 午夜精品成人av| 日韩美女主播视频| 中文字幕在线直播| 欧美在线观看网址综合| 蜜臀久久精品| 日本一欧美一欧美一亚洲视频| 密臀av在线播放| 欧美性在线视频| 亚洲欧美电影| 国产成人亚洲综合青青| av在线一区不卡| 国产精品久久久久久久久久尿| 亚洲精品一区| 国产精品久久久久久久久久三级| 不卡亚洲精品| 91九色综合久久| 视频精品一区二区三区| 成人xxxxx色| 美女主播精品视频一二三四| 国产在线精品一区| 香蕉久久夜色精品国产使用方法| 久久狠狠久久综合桃花| 国产一区国产二区国产三区| 亚洲成人18| 久久一区二区中文字幕| 99re8这里只有精品| 欧美视频官网| 一本大道熟女人妻中文字幕在线| 玖玖玖国产精品| 日韩成人精品视频在线观看| 国产suv精品一区二区三区| 亚洲欧美在线不卡| 国产女人18水真多18精品一级做| 99热这里只有精品4| 一区二区三区蜜桃| 毛片视频网站在线观看| 欧美性大战久久| 国产黄色一级大片| 亚洲精品久久久久中文字幕二区| 你懂的在线视频| www国产91| 77thz桃花论族在线观看| 国产成人精品免高潮费视频| www.久久热| 久久国产主播精品| 国产精品videosex性欧美| 欧美精品久久久久久久自慰| 日韩激情一二三区| 在线观看你懂的视频| 91在线看国产| 久久久久久久久久97| 亚洲妇熟xx妇色黄| 国产又粗又猛又黄又爽无遮挡| 精品国产免费一区二区三区四区| 国产日本在线| 欧美—级a级欧美特级ar全黄| 日韩美女在线看免费观看| 91视频免费在线| 国产乱码精品一区二区三区四区| 超碰97免费观看| 爽好久久久欧美精品| 真实乱偷全部视频| 国产午夜精品一区二区| 精品无码久久久久| 欧美三级电影在线观看| 欧美 日韩 国产 成人 在线 91| 国产一区二区三区在线播放免费观看| 日本成人不卡| 国产区精品在线观看| 欧美一级全黄| 欧美激情亚洲天堂| 免费xxxx性欧美18vr| 国产精品无码网站| 亚洲另类色综合网站| 中文字幕永久免费视频| 日韩电视剧在线观看免费网站| 很黄的网站在线观看| 国产精品久久激情| 色婷婷综合久久久久久| 国产精品无码免费专区午夜| 激情av综合网| 国产黄色录像视频| 狠狠色香婷婷久久亚洲精品| 免费观看国产精品| 久久国产精品影视| 日本亚洲欧洲无免费码在线| 日本不卡二区高清三区| 亚洲免费黄色| 欧美成人精品一区二区综合免费| 亚洲欧洲精品一区二区三区不卡| 亚洲免费黄色网址| 亚洲国产成人久久综合一区| 青草在线视频| 2019国产精品视频| 欧美成人一品| 中文 日韩 欧美| 亚洲视频一区二区免费在线观看| 中文字幕二区三区| 色偷偷av一区二区三区乱| 日韩天堂在线| 日本一区二区三区在线视频 | 国产精品va在线播放我和闺蜜| 免费福利视频一区| 日韩av一二三四区| 91玉足脚交白嫩脚丫在线播放| 亚洲综合一二三| 亚洲激情视频在线| 亚洲第一av| 免费中文日韩| 日本午夜一区二区| 日本美女xxx| 欧美日韩一级黄| 日本免费中文字幕在线| 成人欧美在线视频| 午夜欧美精品| 男人网站在线观看| 精品久久中文字幕| 视频一区二区三区在线看免费看| 91大神福利视频在线| 国产精品亚洲人成在99www| 免费在线观看毛片网站| 国产人成一区二区三区影院| 国产精品51麻豆cm传媒 | 精品制服美女久久| 国产精品久久久久久久精| 精品黑人一区二区三区久久| 国产精品vvv| 视频一区二区综合| 国内国产精品久久| 国产一级片播放| 亚洲免费视频在线观看| 国产精品99久久久久久董美香| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲天堂久久久久久久| 国产福利第一视频| 2023亚洲男人天堂| 波多野结衣在线观看一区二区三区| 亚洲高清免费在线观看| 一二三区精品视频| 天天插天天干天天操| 国产精品久久久久久久久久尿 | 热草久综合在线| 日韩精品91| 亚洲精品久久一区二区三区777| 都市激情亚洲色图| 免费a在线看| 精品久久久久久一区| 蜜臀精品一区二区三区在线观看| 久久久久久久黄色| 亚洲人成在线观看网站高清| 国产精品美女久久久久人| 好吊妞无缓冲视频观看| 国产精品乱码久久久久久| 好吊色在线观看| 国产精品视频区| 妖精视频成人观看www| 任你操精品视频| 日韩高清av一区二区三区| 亚洲伊人精品酒店| 亚洲自偷自拍熟女另类| 亚洲日本中文字幕区| 精品福利视频导航大全| 97超级碰碰| 美腿丝袜在线亚洲一区| 日韩精品视频播放|