日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Go 語言中 enum 實(shí)現(xiàn)方式有哪些?一定要絕對(duì)類型安全嗎?

來源: 責(zé)編: 時(shí)間:2024-02-02 17:01:25 322觀看
導(dǎo)讀嗨!大家好,本文 Go 語言小技巧系列的第十二篇,往期文章查看:Go 語言小技巧。你是否了解過 Go 中的枚舉呢?枚舉,即 enum,可用于表示一組范圍固定的值,它能助我們寫出清晰、安全的代碼。以編寫游戲程序?yàn)橐粋€(gè)簡(jiǎn)單案例:游戲中的角

嗨!大家好,本文 Go 語言小技巧系列的第十二篇,往期文章查看:Go 語言小技巧。ni028資訊網(wǎng)——每日最新資訊28at.com

你是否了解過 Go 中的枚舉呢?ni028資訊網(wǎng)——每日最新資訊28at.com

枚舉,即 enum,可用于表示一組范圍固定的值,它能助我們寫出清晰、安全的代碼。ni028資訊網(wǎng)——每日最新資訊28at.com

以編寫游戲程序?yàn)橐粋€(gè)簡(jiǎn)單案例:游戲中的角色有如戰(zhàn)士、法師或者弓箭手,這種范圍固定的值,就可以用枚舉來表示。ni028資訊網(wǎng)——每日最新資訊28at.com

但 Go 中,枚舉的表現(xiàn)方式不像在某些其他語言中那樣直接。我們要想在 Go 中用好枚舉,就要了解 Go 中枚舉的不同表示形式和使用注意點(diǎn)。ni028資訊網(wǎng)——每日最新資訊28at.com

使用 iota 和常量

在 Go 中,使用 iota 和常量是最常見的表示枚舉的方式。ni028資訊網(wǎng)——每日最新資訊28at.com

什么是 iota?ni028資訊網(wǎng)——每日最新資訊28at.com

iota 是 Go 中是一個(gè)非常特別的 Keyword,它可以幫助我們按一定規(guī)則創(chuàng)建一系列相關(guān)的常量,而無需手動(dòng)為每個(gè)變量單獨(dú)賦值。這一點(diǎn)與枚舉的用途天然契合。ni028資訊網(wǎng)——每日最新資訊28at.com

不了解上面文字的含義?ni028資訊網(wǎng)——每日最新資訊28at.com

讓我們來看一個(gè)例子,基于 iota 快速創(chuàng)建特定規(guī)則的常量。ni028資訊網(wǎng)——每日最新資訊28at.com

示例代碼,如下所示:ni028資訊網(wǎng)——每日最新資訊28at.com

type Weekday intconst (    Sunday    Weekday = iota // 0    Monday                   // 1    Tuesday                  // 2    Wednesday                // 3    Thursday                 // 4    Friday                   // 5    Saturday                 // 6)

例子中,Weekday 類型有 7 個(gè)值,分別代表一周的七天。內(nèi)部值從 0 開始,iota 自動(dòng)增加賦值給每個(gè)常量,從 Sunday 到 Saturday 分別賦值 0-6。ni028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ni028資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,我們就不用手動(dòng)給每個(gè)常量賦值。ni028資訊網(wǎng)——每日最新資訊28at.com

iota 還有很多騷操作,本文目標(biāo)不在此,就不展開了。ni028資訊網(wǎng)——每日最新資訊28at.com

這種方法的優(yōu)點(diǎn)是簡(jiǎn)單,提供了一定程度上類型安全,但它也有局限性。ni028資訊網(wǎng)——每日最新資訊28at.com

我覺得主要是兩點(diǎn)不足。ni028資訊網(wǎng)——每日最新資訊28at.com

首先,對(duì)比其他語言的枚舉,它不能直接從字符串轉(zhuǎn)換到枚舉類型,以上面代碼為例,它不能從 "Sunday" 字符串轉(zhuǎn)為 Sunday 枚舉值。ni028資訊網(wǎng)——每日最新資訊28at.com

其次,它的類型安全不是絕對(duì)安全。ni028資訊網(wǎng)——每日最新資訊28at.com

如上的 Weekday 類型,我們雖不能將一個(gè)明確類型的變量賦值給 Weekday 類型變量:ni028資訊網(wǎng)——每日最新資訊28at.com

day := 0 // int// compiler: cannot use day (variable of type int) // as Weekday value in variable declaration [IncompatibleAssign]var sunday Weekday = day

但卻可以將一個(gè)非 Weekday 類的字面量賦值給它。ni028資訊網(wǎng)——每日最新資訊28at.com

// 字面量 10 賦值給類型為 Weekday 的 day 變量var day Weekday = 10

很明顯,10 這個(gè)數(shù)字并不在 Weekday 的有效范圍,但卻可以有效賦值而并沒有報(bào)錯(cuò)。ni028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ni028資訊網(wǎng)——每日最新資訊28at.com

如果是其他枚舉機(jī)制完善的 enum 類型的語言,肯定是無法編譯通過的。ni028資訊網(wǎng)——每日最新資訊28at.com

除了最基礎(chǔ)的實(shí)現(xiàn)方式,我們繼續(xù)看看還有哪些其他表示形式吧。ni028資訊網(wǎng)——每日最新資訊28at.com

支持字符串轉(zhuǎn)化的枚舉值

我們?cè)陂_發(fā) Web 應(yīng)用時(shí),常會(huì)遇到要將枚舉值以字符串形式表示的需求,特別是在與前端對(duì)接時(shí)。那么,就讓我們先嘗試實(shí)現(xiàn)這一個(gè)需求,string 變量與枚舉變量相互轉(zhuǎn)化。ni028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ni028資訊網(wǎng)——每日最新資訊28at.com

這個(gè)問題說來簡(jiǎn)單,Go 語言中,我們可采用字符串常量作為枚舉值。ni028資訊網(wǎng)——每日最新資訊28at.com

示例代碼,如下所示:ni028資訊網(wǎng)——每日最新資訊28at.com

type HttpMethod stringconst (    Get    HttpMethod = "GET"    Post   HttpMethod = "POST"    Put    HttpMethod = "PUT"    Delete HttpMethod = "DELETE")

這種方法簡(jiǎn)單直觀,而且也易于與 JSON 等數(shù)據(jù)格式轉(zhuǎn)換。ni028資訊網(wǎng)——每日最新資訊28at.com

type Request struct {    Method HttpMethod    URL    string}func main() {    r := Request{Method: Get, URL: "https://zhihu.com"}    result, _ := json.Marshal(r)    fmt.Printf("%s/n", result)}

輸出:ni028資訊網(wǎng)——每日最新資訊28at.com

{"Method":"GET","URL":"https://zhihu.com"}

當(dāng)如果我們還想保留原始的 iota 的整型枚舉值,畢竟它更輕量,占用內(nèi)存空少。這是否可以實(shí)現(xiàn)呢?我們嘗試一下吧。ni028資訊網(wǎng)——每日最新資訊28at.com

定義如下:ni028資訊網(wǎng)——每日最新資訊28at.com

type HttpMethod intconst (    Get    HttpMethod = iota    Post    Put    Delete)

只要在枚舉類型上增加整型值與字符串兩者間相互轉(zhuǎn)化的方法即可。ni028資訊網(wǎng)——每日最新資訊28at.com

代碼如下所示:ni028資訊網(wǎng)——每日最新資訊28at.com

// 從 string 轉(zhuǎn)為 HttpMethodfunc NewFromString(method string) HttpMethod {  switch h {  case "Get":    // 省略 ...  case "Delete":  default:    return Get // default is Get or error, panic  }}// 從 HttpMethod 轉(zhuǎn)為 stringfunc (h HttpMethod) String() string {  switch h {  case Get:    return "Get"    // 省略 ...  default:    return "Unknown" // or error, panic  }}

我們實(shí)現(xiàn)從 string 構(gòu)造 enum 方法,和從 enum 類型轉(zhuǎn)為 string 的 String 方法。ni028資訊網(wǎng)——每日最新資訊28at.com

這里存在的一個(gè)問題,如果希望支持友好的 JSON 序列化反序列化的話,即枚舉用字符串表示,則需要為 HttpMethod 新增方法,實(shí)現(xiàn) json.Marshaler和json.Unmarshaler接口,自定義這個(gè)轉(zhuǎn)化過程。ni028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ni028資訊網(wǎng)——每日最新資訊28at.com

代碼如下:ni028資訊網(wǎng)——每日最新資訊28at.com

// MarshalJSON 實(shí)現(xiàn) json.Marshaler 接口func (h HttpMethod) MarshalJSON() ([]byte, error) {    return json.Marshal(h.String())}// UnmarshalJSON 實(shí)現(xiàn) json.Unmarshaler 接口func (h *HttpMethod) UnmarshalJSON(data []byte) error {    var method string    if err := json.Unmarshal(data, &method); err != nil {        return err    }    *h = NewFromString(method)    return nil}

如果去找一些開源項(xiàng)目,可能會(huì)發(fā)現(xiàn)一些實(shí)現(xiàn)了這種 enum 的包,你只要通過 iota 定義枚舉類型,從字符串和枚舉間轉(zhuǎn)化的代碼可通過命令直接生成。ni028資訊網(wǎng)——每日最新資訊28at.com

robpike 開發(fā)過一個(gè)工具名為 stringer[1],可直接基于類似如上 HttpMethod 定義生成 String() 方法,不過它不是完整的 enum 支持。ni028資訊網(wǎng)——每日最新資訊28at.com

//go:generate stringer -type=HttpMethodtype HttpMethod intconst (    Get    HttpMethod = iota    Post    Put    Delete)

我們執(zhí)行 go generate 即可為 HttpMethod 類型生成 String 方法。ni028資訊網(wǎng)——每日最新資訊28at.com

go generate

這里有個(gè)提前,要單獨(dú)安裝下 stringer 命令。ni028資訊網(wǎng)——每日最新資訊28at.com

不過,即使到現(xiàn)在,依然存在類型安全的問題,類似 var Hello HttpMethod = 10 這樣的代碼依然有效。ni028資訊網(wǎng)——每日最新資訊28at.com

繼續(xù)吧!ni028資訊網(wǎng)——每日最新資訊28at.com

結(jié)構(gòu)體枚舉值

GO 中可基于結(jié)構(gòu)體類型,實(shí)現(xiàn)枚舉效果。ni028資訊網(wǎng)——每日最新資訊28at.com

舉例說明,我們創(chuàng)建一個(gè)顏色的枚舉,要求不僅有顏色的名字,還有顏色的 RGB 值。同時(shí),為了方便記錄,我們可以給它加上一個(gè)枚舉整型值。ni028資訊網(wǎng)——每日最新資訊28at.com

type Color struct {    Index int    Name  string    RGB   string}

這樣我們就有了一個(gè)顏色的枚舉,每個(gè)顏色都有一個(gè)索引、名字和 RGB 值。ni028資訊網(wǎng)——每日最新資訊28at.com

如何使用呢?ni028資訊網(wǎng)——每日最新資訊28at.com

類似于前面的方式,我們直接定義,如下所示:ni028資訊網(wǎng)——每日最新資訊28at.com

var (      Red   = Color{0, "Red", "#FF0000"}      Green = Color{1, "Green", "#00FF00"}      Blue  = Color{2, "Blue", "#0000FF"})

這種方法比較靈活,但也相對(duì)復(fù)雜。ni028資訊網(wǎng)——每日最新資訊28at.com

好處也比較明顯,如現(xiàn)在能存儲(chǔ)的信息也更加豐富,前面類似于整型與字符串的各種轉(zhuǎn)化都變的輕而易舉了。我們直接整型數(shù)值 Color.Index、字符串 Color.Name。ni028資訊網(wǎng)——每日最新資訊28at.com

不過,如果要最大化與其他庫結(jié)合,如自定義 JSON 轉(zhuǎn)化規(guī)則,要實(shí)現(xiàn) JSON 序列和反序列接口,字符串格式化要實(shí)現(xiàn) Stringer 接口等。ni028資訊網(wǎng)——每日最新資訊28at.com

還有,這種結(jié)構(gòu)其實(shí)不是常量類型的,就存在數(shù)據(jù)可更改的問題。不過,有這個(gè)安全需求的話,可考慮將成員字段私有化,通過方法變更即可。ni028資訊網(wǎng)——每日最新資訊28at.com

結(jié)構(gòu)體類似命名空間效果

在網(wǎng)上看到個(gè)有點(diǎn)傻的設(shè)計(jì),順便也提一下吧。ni028資訊網(wǎng)——每日最新資訊28at.com

假設(shè),我們有很多枚舉類型,擔(dān)心可能會(huì)出現(xiàn)命名沖突,可以用結(jié)構(gòu)體來創(chuàng)建一個(gè)“命名空間”,把相關(guān)的枚舉值組織在一起:ni028資訊網(wǎng)——每日最新資訊28at.com

示例代碼如下所示:ni028資訊網(wǎng)——每日最新資訊28at.com

var Colors = struct {    Red, Green, Blue Color}{      Red   = Color{0, "Red", "#FF0000"}      Green = Color{1, "Green", "#00FF00"}      Blue  = Color{2, "Blue", "#0000FF"}}

上面的例子中定義了 Colors 變量,它是匿名結(jié)構(gòu)體類型,字段名表示顏色,我們可通過 Colors.xxx 形式調(diào)用顏色。ni028資訊網(wǎng)——每日最新資訊28at.com

我初期看到這個(gè)寫法,還以為限定了類型可定義的枚舉值范圍。發(fā)現(xiàn)其實(shí)不是,我依然可使用 Color 類型定義新值。ni028資訊網(wǎng)——每日最新資訊28at.com

這很不優(yōu)雅,也很雞肋,其實(shí)我完全可以新建 package 實(shí)現(xiàn)。不過既然發(fā)現(xiàn)了這個(gè)方案,就寫到這里吧。ni028資訊網(wǎng)——每日最新資訊28at.com

類型安全?

到這里,其實(shí)所有實(shí)現(xiàn)方式都沒有解決一個(gè)問題,那就是定義完枚舉后,依然繼續(xù)添加新的枚舉值。ni028資訊網(wǎng)——每日最新資訊28at.com

我真的想實(shí)現(xiàn)這樣的能力呢?該如何做呢?ni028資訊網(wǎng)——每日最新資訊28at.com

以前面 HttpMethod 為例,我要做的就是禁止通過 HttpMethod(1) 創(chuàng)建新枚舉值。ni028資訊網(wǎng)——每日最新資訊28at.com

這不是很簡(jiǎn)單嗎?ni028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ni028資訊網(wǎng)——每日最新資訊28at.com

我們只要將枚舉實(shí)現(xiàn)封裝成一個(gè) package,將類型小寫,如 httpMethod,暴露它的類似 FromString 和其它函數(shù),實(shí)現(xiàn)強(qiáng)制通過轉(zhuǎn)化函數(shù)它。ni028資訊網(wǎng)——每日最新資訊28at.com

package httpmethodtype httpmethod stringconst (  Get  = "Get"  Post = "Post")func FromString(method string) httpmethod {  switch method {  case "Get":    return Get  case "Post":    return Post  }}

現(xiàn)在,枚舉創(chuàng)建必須通過方法,我們就可以在其中實(shí)現(xiàn)限定創(chuàng)建規(guī)則。ni028資訊網(wǎng)——每日最新資訊28at.com

方法可能挺好,但好像沒見到這么玩的?ni028資訊網(wǎng)——每日最新資訊28at.com

為什么呢?ni028資訊網(wǎng)——每日最新資訊28at.com

我的猜想是,開發(fā)時(shí)我們不會(huì)隨意創(chuàng)建新的枚舉值,對(duì)于邊界數(shù)據(jù)的傳遞,確保通過轉(zhuǎn)化函數(shù)處理不就行了嗎?ni028資訊網(wǎng)——每日最新資訊28at.com

真實(shí)場(chǎng)景

對(duì)真實(shí)場(chǎng)景下枚舉的使用,有價(jià)值之處主要在與其他系統(tǒng)的對(duì)接。ni028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ni028資訊網(wǎng)——每日最新資訊28at.com

舉例而言,如來自前端 API 或數(shù)據(jù)庫,有時(shí)可能出現(xiàn)一些異常值。對(duì)這類場(chǎng)景,通過前面介紹,可提供轉(zhuǎn)化函數(shù),在其中設(shè)置檢查規(guī)則。如果發(fā)現(xiàn)異常選擇丟棄,執(zhí)行如 error 或 panic。ni028資訊網(wǎng)——每日最新資訊28at.com

而對(duì)于內(nèi)部系統(tǒng),如果使用類似于 protobuffer 協(xié)議,可在協(xié)議上限定好枚舉范圍,標(biāo)記異常數(shù)據(jù)等。ni028資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,可能出現(xiàn)因?yàn)榘l(fā)布時(shí)間次序或者兄弟團(tuán)隊(duì)忘記通知等,導(dǎo)致系統(tǒng)間枚舉值對(duì)不齊的情況,也會(huì)按上面的邏輯丟棄、error 等,便于即使發(fā)現(xiàn)。ni028資訊網(wǎng)——每日最新資訊28at.com

對(duì)于團(tuán)隊(duì)合作這類場(chǎng)景,最好的解決方式,還是要在設(shè)計(jì)系統(tǒng)時(shí),考慮上下游的兼容性,而不是每當(dāng)有變動(dòng),全員亂糟糟,這最容易導(dǎo)致生產(chǎn)事故了。ni028資訊網(wǎng)——每日最新資訊28at.com

其實(shí)無論哪一種情況,重點(diǎn)在于保證進(jìn)入系統(tǒng)的數(shù)據(jù)是否可通過轉(zhuǎn)化檢測(cè),而不是多此一舉,限制類似于 HttpMethod("Get") 的類型轉(zhuǎn)化,因?yàn)闆]有人會(huì)這么寫代碼。ni028資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

Go 語言中,枚舉的表達(dá)方式多種多樣。從簡(jiǎn)單的 iota 到復(fù)雜的結(jié)構(gòu)體方式,每種方法都有其適用場(chǎng)景。作為開發(fā)者,最好是根據(jù)自己的具體需求,選擇合適的實(shí)現(xiàn)方式。ni028資訊網(wǎng)——每日最新資訊28at.com

最后,希望這篇文章能幫助你在使用 Go 語言時(shí),更加靈活且游刃有余地使用枚舉 enum。ni028資訊網(wǎng)——每日最新資訊28at.com

博客地址:Go語言中 enum 實(shí)現(xiàn)方式有哪些?一定要類型安全嗎?[2]ni028資訊網(wǎng)——每日最新資訊28at.com

引用鏈接

[1] stringer: https://pkg.go.dev/golang.org/x/tools/cmd/stringerni028資訊網(wǎng)——每日最新資訊28at.com

[2] Go語言中 enum 實(shí)現(xiàn)方式有哪些?一定要類型安全嗎?: https://www.poloxue.com/posts/2024-02-02-how-to-use-enums-type-in-golang/ni028資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-71945-0.htmlGo 語言中 enum 實(shí)現(xiàn)方式有哪些?一定要絕對(duì)類型安全嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Nodejs - 九步開啟JWT身份驗(yàn)證

下一篇: 歐盟反壟斷「撬開」蘋果,結(jié)果坑苦了開發(fā)者

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产伦精品一区二区三区四区免费 | 亚洲欧美日本视频在线观看| 日韩一区二区精品葵司在线| 亚洲一区二区三区四区五区午夜| 久久国产精品72免费观看| 久久综合999| 欧美日韩在线播放三区| 国产美女精品人人做人人爽| 亚洲国产乱码最新视频| 亚洲一区二区三区四区中文| 久久免费精品日本久久中文字幕| 欧美激情一区二区三区在线视频观看| 国产精品热久久久久夜色精品三区| 国内精品久久久久久久影视蜜臀 | 欧美日本一区二区高清播放视频| 国产精品免费久久久久久| 在线精品视频一区二区三四| 一区二区三区日韩| 久久久天天操| 国产精品国产三级国产普通话蜜臀 | 国产一区二区日韩精品欧美精品| 亚洲国产高清一区| 欧美精品播放| 国产欧美日韩精品一区| 91久久久在线| 欧美一区二区女人| 欧美精品在线视频观看| 国产精品夜夜夜一区二区三区尤| 亚洲国产精品久久久久婷婷老年 | 欧美久久一级| 狠狠色噜噜狠狠色综合久| 一区二区冒白浆视频| 久久婷婷久久| 国产精品久久9| 亚洲人成人一区二区三区| 欧美在线视频一区二区| 欧美日韩视频在线第一区| 狠狠操狠狠色综合网| 亚洲一区二区精品| 欧美激情精品久久久久久大尺度| 国产亚洲精品久久久久婷婷瑜伽| 中文亚洲视频在线| 欧美a级片网站| 国产主播一区二区三区| 亚洲一区二三| 欧美日韩网站| 亚洲精品免费网站| 美女图片一区二区| 狠狠久久亚洲欧美| 午夜在线精品偷拍| 国产精品国产福利国产秒拍| 亚洲人成艺术| 女人色偷偷aa久久天堂| 黄色综合网站| 久久狠狠亚洲综合| 国产视频一区在线观看| 亚洲男人av电影| 欧美视频在线观看| av成人福利| 欧美精品日韩www.p站| 亚洲高清不卡av| 久久综合色婷婷| 黄网动漫久久久| 久色婷婷小香蕉久久| 校园春色国产精品| 欧美另类视频| 亚洲国产精品久久久久婷婷884| 欧美一级网站| 欧美视频网址| 日韩视频久久| 欧美护士18xxxxhd| 亚洲国产欧美国产综合一区| 久久九九99| 国产视频亚洲精品| 欧美一区二区大片| 国产毛片久久| 欧美一区二区三区在线免费观看| 国产精品黄视频| 亚洲一区二区三区中文字幕| 欧美日韩综合在线免费观看| 一区二区三区www| 欧美日韩性视频在线| 99在线观看免费视频精品观看| 欧美高清免费| 亚洲激情午夜| 欧美精品国产| 一本色道精品久久一区二区三区| 欧美女同视频| 亚洲色无码播放| 国产精品日本| 欧美一区二区三区免费看| 国产亚洲精品久久久久动| 久久久久国产精品www| 极品少妇一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频 | 免播放器亚洲一区| 最新中文字幕一区二区三区| 欧美激情影院| 欧美日韩综合久久| 一本色道久久综合精品竹菊| 国产精品成人国产乱一区 | 欧美视频官网| 亚洲一区在线播放| 国产丝袜美腿一区二区三区| 久久久久久久999| 亚洲国产另类久久久精品极度| 欧美高清视频在线播放| 一区二区免费在线播放| 国产精品一区二区视频| 久久久久国产精品一区二区| 亚洲成色777777在线观看影院| 欧美高清视频| 一区二区三区产品免费精品久久75 | 曰本成人黄色| 欧美巨乳波霸| 亚洲欧美日韩精品久久奇米色影视 | 国产精品尤物福利片在线观看| 久久久久国产精品一区三寸| 亚洲人成在线免费观看| 国产精品久久久久久久第一福利| 久久精品国产亚洲一区二区三区 | 亚洲一区二区三区精品动漫| 国模私拍视频一区| 欧美理论片在线观看| 午夜精品久久| 亚洲国产天堂网精品网站| 国产精品高精视频免费| 久久午夜色播影院免费高清| 一本到12不卡视频在线dvd| 国产亚洲精品7777| 欧美久久久久免费| 久久精品综合一区| 一区二区三区欧美日韩| 国产综合久久久久久鬼色| 欧美精品午夜视频| 欧美一级理论片| 日韩性生活视频| 国内精品久久久久久久97牛牛| 欧美日本国产一区| 久久国产色av| 在线视频日本亚洲性| 在线不卡a资源高清| 国产精品久久久久高潮| 麻豆精品传媒视频| 午夜精品久久久久久久久久久 | 午夜精品美女久久久久av福利| 亚洲欧洲日产国产网站| 国产丝袜一区二区| 欧美视频中文字幕| 男同欧美伦乱| 欧美在线播放| 亚洲私拍自拍| 亚洲人体1000| 激情六月综合| 国产精品一区二区三区观看| 欧美精品99| 另类图片国产| 久久狠狠久久综合桃花| 亚洲一区二区三区三| 亚洲精品欧美精品| 韩国久久久久| 国产精品系列在线播放| 欧美日韩精品在线观看| 免费国产一区二区| 久久福利资源站| 中文高清一区| 91久久在线视频| 精品福利av| 韩国精品在线观看| 国产情侣一区| 国产精品久久久久久久久免费桃花 | 亚洲图片欧美一区| 亚洲精品日产精品乱码不卡| 激情亚洲成人| 国产在线视频欧美| 国产亚洲成精品久久| 国产精品日韩高清| 国产精品v欧美精品∨日韩| 欧美日韩国产不卡| 欧美激情精品久久久久久蜜臀| 久久综合一区| 久久综合999| 久久频这里精品99香蕉| 久久国产主播| 久久精品亚洲热| 久久精品日韩一区二区三区| 国产精品久久久一区二区三区 | 国产一区二区三区高清播放| 国产亚洲激情在线| 国产日韩精品久久| 国产伦精品一区二区三区在线观看| 欧美天堂亚洲电影院在线播放| 欧美日韩国产综合一区二区| 欧美精品在欧美一区二区少妇| 欧美电影美腿模特1979在线看 | 国产精品乱子乱xxxx| 国产精品观看| 国产精品一级| 国产精品午夜国产小视频| 国产精品你懂得| 国产麻豆精品theporn| 国产女优一区| 国内成人自拍视频| 在线精品福利|