国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Go 每日一庫之 fasttemplate

共 17071字,需瀏覽 35分鐘

 ·

2021-06-03 00:15

簡介

fasttemplate是一個比較簡單、易用的小型模板庫。fasttemplate的作者valyala另外還開源了不少優(yōu)秀的庫,如大名鼎鼎的fasthttp,前面介紹的bytebufferpool,還有一個重量級的模板庫quicktemplatequicktemplate比標(biāo)準(zhǔn)庫中的text/templatehtml/template要靈活和易用很多,后面會專門介紹它。今天要介紹的fasttemlate只專注于一塊很小的領(lǐng)域——字符串替換。它的目標(biāo)是為了替代strings.Replace、fmt.Sprintf等方法,提供一個簡單,易用,高性能的字符串替換方法。

本文首先介紹fasttemplate的用法,然后去看看源碼實現(xiàn)的一些細(xì)節(jié)。

快速使用

本文代碼使用 Go Modules。

創(chuàng)建目錄并初始化:

$ mkdir fasttemplate && cd fasttemplate
$ go mod init github.com/darjun/go-daily-lib/fasttemplate

安裝fasttemplate庫:

$ go get -u github.com/valyala/fasttemplate

編寫代碼:

package main

import (
  "fmt"

  "github.com/valyala/fasttemplate"
)

func main() {
  template := `name: {{name}}
age: {{age}}`

  t := fasttemplate.New(template, "{{", "}}")
  s1 := t.ExecuteString(map[string]interface{}{
    "name""dj",
    "age":  "18",
  })
  s2 := t.ExecuteString(map[string]interface{}{
    "name""hjw",
    "age":  "20",
  })
  fmt.Println(s1)
  fmt.Println(s2)
}
  • 定義模板字符串,使用{{}}表示占位符,占位符可以在創(chuàng)建模板的時候指定;
  • 調(diào)用fasttemplate.New()創(chuàng)建一個模板對象t,傳入開始和結(jié)束占位符;
  • 調(diào)用模板對象的t.ExecuteString()方法,傳入?yún)?shù)。參數(shù)中有各個占位符對應(yīng)的值。生成最終的字符串。

運(yùn)行結(jié)果:

name: dj
age: 18

我們可以自定義占位符,上面分別使用{{}}作為開始和結(jié)束占位符。我們可以換成[[]],只需要簡單修改一下代碼即可:

template := `name: [[name]]
age: [[age]]`

t := fasttemplate.New(template, "[[""]]")

另外,需要注意的是,傳入?yún)?shù)的類型為map[string]interface{},但是fasttemplate只接受類型為[]byte、stringTagFunc類型的值。這也是為什么上面的18要用雙引號括起來的原因。

另一個需要注意的點,fasttemplate.New()返回一個模板對象,如果模板解析失敗了,就會直接panic。如果想要自己處理錯誤,可以調(diào)用fasttemplate.NewTemplate()方法,該方法返回一個模板對象和一個錯誤。實際上,fasttemplate.New()內(nèi)部就是調(diào)用fasttemplate.NewTemplate(),如果返回了錯誤,就panic

// src/github.com/valyala/fasttemplate/template.go
func New(template, startTag, endTag string) *Template {
  t, err := NewTemplate(template, startTag, endTag)
  if err != nil {
    panic(err)
  }
  return t
}

func NewTemplate(template, startTag, endTag string) (*Template, error) {
  var t Template
  err := t.Reset(template, startTag, endTag)
  if err != nil {
    return nil, err
  }
  return &t, nil
}

這其實也是一種慣用法,對于不想處理錯誤的示例程序,直接panic有時也是一種選擇。例如html.template標(biāo)準(zhǔn)庫也提供了Must()方法,一般這樣用,遇到解析失敗就panic

t := template.Must(template.New("name").Parse("html"))

占位符中間內(nèi)部不要加空格?。?!

占位符中間內(nèi)部不要加空格!??!

占位符中間內(nèi)部不要加空格!!!

快捷方式

使用fasttemplate.New()定義模板對象的方式,我們可以多次使用不同的參數(shù)去做替換。但是,有時候我們要做大量一次性的替換,每次都定義模板對象顯得比較繁瑣。fasttemplate也提供了一次性替換的方法:

func main() {
  template := `name: [name]
age: [age]`

  s := fasttemplate.ExecuteString(template, "[""]"map[string]interface{}{
    "name""dj",
    "age":  "18",
  })
  fmt.Println(s)
}

使用這種方式,我們需要同時傳入模板字符串、開始占位符、結(jié)束占位符和替換參數(shù)。

TagFunc

fasttemplate提供了一個TagFunc,可以給替換增加一些邏輯。TagFunc是一個函數(shù):

type TagFunc func(w io.Writer, tag string) (int, error)

在執(zhí)行替換的時候,fasttemplate針對每個占位符都會調(diào)用一次TagFunc函數(shù),tag即占位符的名稱??聪旅娉绦颍?/p>

func main() {
  template := `name: {{name}}
age: {{age}}`

  t := fasttemplate.New(template, "{{", "}}")
  s := t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) {
    switch tag {
    case "name":
      return w.Write([]byte("dj"))
    case "age":
      return w.Write([]byte("18"))
    default:
      return 0nil
    }
  })

  fmt.Println(s)
}

這其實就是get-started示例程序的TagFunc版本,根據(jù)傳入的tag寫入不同的值。如果我們?nèi)ゲ榭丛创a就會發(fā)現(xiàn),實際上ExecuteString()最終還是會調(diào)用ExecuteFuncString()fasttemplate提供了一個標(biāo)準(zhǔn)的TagFunc

func (t *Template) ExecuteString(m map[string]interface{}) string {
  return t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { return stdTagFunc(w, tag, m) })
}

func stdTagFunc(w io.Writer, tag string, m map[string]interface{}) (int, error) {
  v := m[tag]
  if v == nil {
    return 0nil
  }
  switch value := v.(type) {
  case []byte:
    return w.Write(value)
  case string:
    return w.Write([]byte(value))
  case TagFunc:
    return value(w, tag)
  default:
    panic(fmt.Sprintf("tag=%q contains unexpected value type=%#v. Expected []byte, string or TagFunc", tag, v))
  }
}

標(biāo)準(zhǔn)的TagFunc實現(xiàn)也非常簡單,就是從參數(shù)map[string]interface{}中取出對應(yīng)的值做相應(yīng)處理,如果是[]bytestring類型,直接調(diào)用io.Writer的寫入方法。如果是TagFunc類型則直接調(diào)用該方法,將io.Writertag傳入。其他類型直接panic拋出錯誤。

如果模板中的tag在參數(shù)map[string]interface{}中不存在,有兩種處理方式:

  • 直接忽略,相當(dāng)于替換成了空字符串""。標(biāo)準(zhǔn)的stdTagFunc就是這樣處理的;
  • 保留原始tagkeepUnknownTagFunc就是做這個事情的。

keepUnknownTagFunc代碼如下:

func keepUnknownTagFunc(w io.Writer, startTag, endTag, tag string, m map[string]interface{}) (int, error) {
  v, ok := m[tag]
  if !ok {
    if _, err := w.Write(unsafeString2Bytes(startTag)); err != nil {
      return 0, err
    }
    if _, err := w.Write(unsafeString2Bytes(tag)); err != nil {
      return 0, err
    }
    if _, err := w.Write(unsafeString2Bytes(endTag)); err != nil {
      return 0, err
    }
    return len(startTag) + len(tag) + len(endTag), nil
  }
  if v == nil {
    return 0nil
  }
  switch value := v.(type) {
  case []byte:
    return w.Write(value)
  case string:
    return w.Write([]byte(value))
  case TagFunc:
    return value(w, tag)
  default:
    panic(fmt.Sprintf("tag=%q contains unexpected value type=%#v. Expected []byte, string or TagFunc", tag, v))
  }
}

后半段處理與stdTagFunc一樣,函數(shù)前半部分如果tag未找到。直接寫入startTag + tag + endTag作為替換的值。

我們前面調(diào)用的ExecuteString()方法使用stdTagFunc,即直接將未識別的tag替換成空字符串。如果想保留未識別的tag,改為調(diào)用ExecuteStringStd()方法即可。該方法遇到未識別的tag會保留:

func main() {
  template := `name: {{name}}
age: {{age}}`

  t := fasttemplate.New(template, "{{", "}}")
  m := map[string]interface{}{"name""dj"}
  s1 := t.ExecuteString(m)
  fmt.Println(s1)

  s2 := t.ExecuteStringStd(m)
  fmt.Println(s2)
}

參數(shù)中缺少age,運(yùn)行結(jié)果:

name: dj
age:
name: dj
age: {{age}}

io.Writer參數(shù)的方法

前面介紹的方法最后都是返回一個字符串。方法名中都有StringExecuteString()/ExecuteFuncString()。

我們可以直接傳入一個io.Writer參數(shù),將結(jié)果字符串調(diào)用這個參數(shù)的Write()方法直接寫入。這類方法名中沒有StringExecute()/ExecuteFunc()

func main() {
  template := `name: {{name}}
age: {{age}}`

  t := fasttemplate.New(template, "{{", "}}")
  t.Execute(os.Stdout, map[string]interface{}{
    "name""dj",
    "age":  "18",
  })

  fmt.Println()

  t.ExecuteFunc(os.Stdout, func(w io.Writer, tag string) (int, error) {
    switch tag {
    case "name":
      return w.Write([]byte("hjw"))
    case "age":
      return w.Write([]byte("20"))
    }

    return 0nil
  })
}

由于os.Stdout實現(xiàn)了io.Writer接口,可以直接傳入。結(jié)果直接寫到os.Stdout中。運(yùn)行:

name: dj
age: 18
name: hjw
age: 20

源碼分析

首先看模板對象的結(jié)構(gòu)和創(chuàng)建:

// src/github.com/valyala/fasttemplate/template.go
type Template struct {
  template string
  startTag string
  endTag   string

  texts          [][]byte
  tags           []string
  byteBufferPool bytebufferpool.Pool
}

func NewTemplate(template, startTag, endTag string) (*Template, error) {
  var t Template
  err := t.Reset(template, startTag, endTag)
  if err != nil {
    return nil, err
  }
  return &t, nil
}

模板創(chuàng)建之后會調(diào)用Reset()方法初始化:

func (t *Template) Reset(template, startTag, endTag string) error {
  t.template = template
  t.startTag = startTag
  t.endTag = endTag
  t.texts = t.texts[:0]
  t.tags = t.tags[:0]

  if len(startTag) == 0 {
    panic("startTag cannot be empty")
  }
  if len(endTag) == 0 {
    panic("endTag cannot be empty")
  }

  s := unsafeString2Bytes(template)
  a := unsafeString2Bytes(startTag)
  b := unsafeString2Bytes(endTag)

  tagsCount := bytes.Count(s, a)
  if tagsCount == 0 {
    return nil
  }

  if tagsCount+1 > cap(t.texts) {
    t.texts = make([][]byte0, tagsCount+1)
  }
  if tagsCount > cap(t.tags) {
    t.tags = make([]string0, tagsCount)
  }

  for {
    n := bytes.Index(s, a)
    if n < 0 {
      t.texts = append(t.texts, s)
      break
    }
    t.texts = append(t.texts, s[:n])

    s = s[n+len(a):]
    n = bytes.Index(s, b)
    if n < 0 {
      return fmt.Errorf("Cannot find end tag=%q in the template=%q starting from %q", endTag, template, s)
    }

    t.tags = append(t.tags, unsafeBytes2String(s[:n]))
    s = s[n+len(b):]
  }

  return nil
}

初始化做了下面這些事情:

  • 記錄開始和結(jié)束占位符;
  • 解析模板,將文本和tag切分開,分別存放在textstags切片中。后半段的for循環(huán)就是做的這個事情。

代碼細(xì)節(jié)點:

  • 先統(tǒng)計占位符一共多少個,一次構(gòu)造對應(yīng)大小的文本和tag切片,注意構(gòu)造正確的模板字符串文本切片一定比tag切片大 1。像這樣| text | tag | text | ... | tag | text |;
  • 為了避免內(nèi)存拷貝,使用unsafeString2Bytes讓返回的字節(jié)切片直接指向string內(nèi)部地址。

看上面的介紹,貌似有很多方法。實際上核心的方法就一個ExecuteFunc()。其他的方法都是直接或間接地調(diào)用它:

// src/github.com/valyala/fasttemplate/template.go
func (t *Template) Execute(w io.Writer, m map[string]interface{}) (int64, error) {
  return t.ExecuteFunc(w, func(w io.Writer, tag string) (int, error) { return stdTagFunc(w, tag, m) })
}

func (t *Template) ExecuteStd(w io.Writer, m map[string]interface{}) (int64, error) {
  return t.ExecuteFunc(w, func(w io.Writer, tag string) (int, error) { return keepUnknownTagFunc(w, t.startTag, t.endTag, tag, m) })
}

func (t *Template) ExecuteFuncString(f TagFunc) string {
  s, err := t.ExecuteFuncStringWithErr(f)
  if err != nil {
    panic(fmt.Sprintf("unexpected error: %s", err))
  }
  return s
}

func (t *Template) ExecuteFuncStringWithErr(f TagFunc) (string, error) {
  bb := t.byteBufferPool.Get()
  if _, err := t.ExecuteFunc(bb, f); err != nil {
    bb.Reset()
    t.byteBufferPool.Put(bb)
    return "", err
  }
  s := string(bb.Bytes())
  bb.Reset()
  t.byteBufferPool.Put(bb)
  return s, nil
}

func (t *Template) ExecuteString(m map[string]interface{}) string {
  return t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { return stdTagFunc(w, tag, m) })
}

func (t *Template) ExecuteStringStd(m map[string]interface{}) string {
  return t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { return keepUnknownTagFunc(w, t.startTag, t.endTag, tag, m) })
}

Execute()方法構(gòu)造一個TagFunc調(diào)用ExecuteFunc(),內(nèi)部使用stdTagFunc

func(w io.Writer, tag string) (int, error) {
  return stdTagFunc(w, tag, m)
}

ExecuteStd()方法構(gòu)造一個TagFunc調(diào)用ExecuteFunc(),內(nèi)部使用keepUnknownTagFunc

func(w io.Writer, tag string) (int, error) {
  return keepUnknownTagFunc(w, t.startTag, t.endTag, tag, m)
}

ExecuteString()ExecuteStringStd()方法調(diào)用ExecuteFuncString()方法,而ExecuteFuncString()方法又調(diào)用了ExecuteFuncStringWithErr()方法,ExecuteFuncStringWithErr()方法內(nèi)部使用bytebufferpool.Get()獲得一個bytebufferpoo.Buffer對象去調(diào)用ExecuteFunc()方法。所以核心就是ExecuteFunc()方法:

func (t *Template) ExecuteFunc(w io.Writer, f TagFunc) (int64, error) {
  var nn int64

  n := len(t.texts) - 1
  if n == -1 {
    ni, err := w.Write(unsafeString2Bytes(t.template))
    return int64(ni), err
  }

  for i := 0; i < n; i++ {
    ni, err := w.Write(t.texts[i])
    nn += int64(ni)
    if err != nil {
      return nn, err
    }

    ni, err = f(w, t.tags[i])
    nn += int64(ni)
    if err != nil {
      return nn, err
    }
  }
  ni, err := w.Write(t.texts[n])
  nn += int64(ni)
  return nn, err
}

整個邏輯也很清晰,for循環(huán)就是Write一個texts元素,以當(dāng)前的tag執(zhí)行TagFunc,索引 +1。最后寫入最后一個texts元素,完成。大概是這樣:

| text | tag | text | tag | text | ... | tag | text |

注:ExecuteFuncStringWithErr()方法使用到了前面文章介紹的bytebufferpool,感興趣可以回去翻看。

總結(jié)

可以使用fasttemplate完成strings.Replacefmt.Sprintf的任務(wù),而且fasttemplate靈活性更高。代碼清晰易懂,值得一看。

吐槽:關(guān)于命名,Execute()方法里面使用stdTagFunc,ExecuteStd()方法里面使用keepUnknownTagFunc方法。我想是不是把stdTagFunc改名為defaultTagFunc好一點?

大家如果發(fā)現(xiàn)好玩、好用的 Go 語言庫,歡迎到 Go 每日一庫 GitHub 上提交 issue??

參考

  1. fasttemplate GitHub:github.com/valyala/fasttemplate
  2. Go 每日一庫 GitHub:https://github.com/darjun/go-daily-lib


推薦閱讀


福利

我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號 「polarisxu」,回復(fù) ebook 獲??;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

瀏覽 20
點贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 爱爱一区| 伊人久久大香蕉国产| 另类国产| 在线免费观看无码| 国产A片免费看| 午夜福利av在线| 久久AV无码| 久久新视频| 国模精品无码一区二区免费蜜桃| 亚洲特黄| 97人人操人人干| 色婷婷久久综合| 国产欧美综合一区二区三区 | 91免费成人电影| www.黄色片| 人妻人人爽| 在线免费黄色网址| 性无码一区二区三区在线观看 | 国产亲子乱XXXXimim/| 91豆花成人网站| 韩国色情中文字幕| 大香蕉伊人色| 五月天婷婷av| 大奶一区二区| 久草国产在线视频| 狠狠干影院| 九九r在线精品观看视频| 一区二区三区四区| 大香蕉在线伊| 天天玩夜夜玩天天玩国产99| www.xxx国产| 亚洲AV无码成人精品区| 亚洲AV无码第一区二区三区蜜桃| 91精品久久久久久综合五月天| 亲子伦一区二区三区观看方式| 国产卡一卡二| 视频一区中文字幕| 9无码| 亚洲无码一二区| 亚洲AV无码国产精品| 免费福利视频网站| 日本亚洲黄色视频| 91羞射短视频在线观看| 久久免费视频,久久免费视频 | 无码中文字幕在线观看| 免费国产精品视频| 高清无码自拍| 北条麻妃无码在线视频| 亚洲V无码| 无码午夜| 日韩精品极品视频在线观看免费| 亚洲黄色视频免费看| 99热在线播放| 色黄视频在线观看| 国产ts在线| 东京热av一区二区| 久草久| 国产在线观看97| 少妇人妻精品| 国产三级电影| 国产乱伦毛片| 久草91| 色婷婷成人网| 2017人人操| 免费国产精品视频| 五月婷婷深深爱| 亚洲AV秘无码一区在线| 亚洲日韩视频在线| 98无码人妻精品一区二区三区| 久久久久久五月天| 亚洲无码三级| 动漫精品一区二区| 牛牛在线视频| 免费毛片在线| 北条麻妃视频在线观看| 亚洲AV无码国产精品久久不卡| 麻豆成人无码精品视频| 囯产伦精一区二区三区四区| 色婷婷久综合久久一本国产AV | 逼逼AV网站-日韩电影| 搡老熟女-91Porn| 国产黄色视频网站| 无码AV动漫| 苍井空亚洲精品AA片在线播放| 国产在线拍揄自揄拍无码男男| 伊人大香蕉电影| 尤物一区二区| 久久久久久久精| 久久成人在线视频| 成人亚洲AV日韩AV无码| 人妻体内射精| 日本成人中文字幕| 一级二级三级毛片| 91丨国产丨精品丨丝袜| 久久久在线视频| 在线观看者亚洲| 欧美亚洲国产一区二区三区| 婷婷色在线| 黄色A片免费视频| 欧美操屄视频| 色综合天天综合成人网| 黄片免费无码| 亚洲欧美在线播放| 国产成人h| 亚洲免费观看视频| 国产内射网站| 天天爽爽爽爽爽成人片| 丰满人妻精品一区二区在线| 69激情网| 狠狠色婷婷7777| 吹潮喷水高潮HD| 短发妹子双人啪啪秀| 91丨牛牛丨国产| 国产人妻精品一区二区三区不卡 | 亚洲第一伊人| 大香蕉网在线| 蜜臀久久99精品久久一区二区| 亚洲国产成人无码a在线播放| 国产精品国产精品国产专区不片 | 久操视频在线观看| 五月天婷婷丁香综合视频| 日韩AV无码专区亚洲AV紧身裤| 欧美成人超碰| 久久久无码电影| 人人爽人人干| 中文在线一区| JIZZJIZZ国产精品喷水| 91麻豆福利视频| 日本人妻在线播放| 国产精品无码一区二区三区| 免费黄色av网址| 欧美日韩成人| 亚洲精品999| 骚逼日本| 99久久99久国产黄毛片| 操逼视频免费播放| 无码砖区| 看毛片视频| 久久午夜福利| AV福利在线观看| 国产伦子伦一级A片免费看老牛 | 大香蕉尹人在线| www.91熊猫成人网| 親子亂子倫XXXX| 在线国产小视频| 国产内射网站| 成人一区二区电影| 日韩一级片在线观看| 无码一区二区三区四区五区六区| 成人777777| 国产成人视频在线观看| 粉嫩小泬BBBB免费看-百度 | 久久伊人综合| 国产美女做爱| 日本黄色A片| a4yy午夜福利| 五月丁香婷婷啪啪| 人人爱人人爽人人操| 精品国产无码怀孕| 成人午夜黄片| 亚洲成年网| 亚洲中文字幕日韩在线| 91蜜桃视频| 日韩毛片在线播放| 日韩视频91| 日屄在线观看| 91无码人妻一区二区三区| 午夜成人网站| 精品码产区一区二亚洲国产| 日欧一级片| 成人大战香蕉最新视频| 一本色道久久综合亚洲二区三区| 国产亚洲精品成人a| 国产一级A片视频| 成人三级片在线观看| 日本a片在线观看| 人人操人人干人人看| 久久久精品淫秽色情| 久久久久亚洲AV成人片| 91成人影片| 中文字幕AⅤ在线| 超碰人人网| 久久久久久少妇| 亚洲自拍天堂| 狠狠的操| 777777国产77777777| 亚洲视频中文字幕在线观看| 啪一啪操一操| 一级AV在线| 内射日韩| 久久久久久无码日韩欧美电影| 天天看天天日| 久草国产视频| 亚久久久| 美女一级A片| 亚洲日韩精品欧美一区二区yw| 国产成人a| 特級西西444WWw高清大膽 | 很很日| 久久国产AV| 免费操B视频| 91丝袜一区在线观看| 国产乱伦内射视频| 超碰人妻人人操| 日韩激情视频| 3D动漫精品啪啪一区二区免费| 京熱大亂交无碼大亂交| 99久re热视频精品98| 日日骚影院| 亚洲天堂网2025| 麻豆videos| 日韩精品在线免费视频| 黄色福利视频| 欧美日韩黄| 黄色资源在线观看| 日韩无码黄片| 91色在线| 一级无码视频| 天天干视频在线| 欧美三级推荐| 一级Av| 艹逼中文字幕| 五月天在线电影| 婬乱欧美一二三区| 国产无码在线影院| 韩国毛片基地久久| 国产AV18岁| 日韩gay| 波多野结衣视频在线播放| 黄色片视频网站| 麻豆亚洲AV成人无码久久精品 | 韩国一区二区三区在线观看| 免费AV网站观看| 91东热激情| 一级A片视频免费看| 日本久久久久久久久视频在线观看| 蜜桃精品在线| 亚洲AV无码成人精品区国产| 欧美日韩A| 亚洲欧美另类在线| 91在线无码精品秘入口动作| 激情五月丁香婷婷| 日韩成人无码一区二区| 亚洲日本在线观看| www.91爱爱,com| 日韩视频免费在线观看| 日韩成人视频在线观看| 老骚老B老太太BBW| 中文字幕第一页在线| 日韩在线一区二区| 初学影院WWWBD英语完整版在线观看 | 午夜AV福利| 日韩欧美国产精品综合嫩V| 亚洲九九视频| 九九九精品在线| 久久久精品免费| 影音先锋av中文字幕| 国产一级a毛一级a做免费图片| 精品无码一区二区三区的天堂| 日韩精品丰满无码一级A片∴| 手机看片1024你懂的| 亚洲无码av网站| 亚洲最大网站| 一本无码中文字幕| 特写毛茸茸BBwBBwBBw| 中文字幕牛牛婷婷| 西西444WWW无码大胆知乎| 亚洲av网站在线观看| 天天撸在线| 老熟妇搡BBBB搡BBBB| 亲子伦视频一区二区三区| 免费观看黄色小视频| 亚洲精品在线看| 九色PORNY自拍视频| 91成人亚洲| 亚洲色情网站| 中文字幕网在线| 最新激情网站| 91久久超碰| 北条麻妃AV在线播放| 亚洲a级| 午夜av福利| 奇米av| 91麻豆精品| 婷婷色色五月天图片| 成人影片在线观看18| 日韩成人无码精品| 不卡成人| 色秘乱码一区二区三区唱戏| 日韩中文字幕电影| 无码人妻一区二区三区免费九色| 午夜精品久久久久久久99老熟妇| 99精品视频免费观看| 国产精品18进进出出17c| 久久久久久一区| 日韩加勒比在线| www.a片| 久久精品中文| 婷婷五月在线视频| 亚洲福利视频97| 亚洲中文字幕无码爆乳av| 色婷婷色婷婷| 亚洲午夜在线| h片在线观看免费| 中文无码字幕| 吴梦梦一区二区在线观看| 99热精品免费| 人人操人人操人人操人人| 亚洲av电影网| 好吊视频一区二区三区| 3DAV一区二区三区动漫| 亚洲人免费视频| va在线| 日本成人中文字幕| 99性视频| 国产色婷婷精品综合在线播放 | 成人日韩精品| 久久成人福利| 草莓视频在线播放| 黄片免费大全| 免费黄色Av| 久久久久久伊人| 日韩AV片| 午夜婷婷| 波多野结衣无码AV专区| 在线观看免费黄色| 九九九亚洲| 久久成人A片| 韩国无码视频在线观看| 日韩欧美视频在线| 日本黄色A片| 黄色一级片免费在线观看| 免费成人高清视频| 良妇露脸15P| 色人阁人妻中文字幕| 国产美女免费视频| 国产无套免费网站69| 无码黑人| 97香蕉久久夜色精品国产| 91丨九色丨蝌蚪丨丝袜| 亚洲国产婷婷| 国产精品成人3p一区二区三区| 久久久久久久久久久久高清毛片一级 | 淫荡少妇美红久久久久久久久久 | 97人人澡| 69人妻人人澡人人爽人人精品| 奇米影视亚洲春色| 亚洲无码十八禁| 香蕉AV777XXX色综合一区| 麻豆AV96熟妇人妻| 在线日韩| 黄片无码免费观看| 亚洲色图在线观看| 在线观看国产一级片| 日批视频在线观看| 在线一区| 91久久无码一区人妻A片蜜桃| 午夜69成人做爱视频网站| 国产AV一级| 日韩AV免费网站| 成人精品一区二区无码| 免费操B视频| 蝌蚪九色啦403| 国产av网站大全| 九九九精彩视频| 中文字幕成人网站中文字幕| 欧美国产日韩在线观看| 欧美九九| 黄色免费无码| 国产性爱av| 日韩欧美a片| www.天天射| 91精品婷婷国产| 二区三区免费| 亚洲天堂偷拍| 18禁网站免费观看| 伊人五月天激情| 91探花足浴店按摩店| 国产A片电影| 熟女人妻人蜜桃视频| 亚洲色伦| 西西人体大胆ww4444多少集 | 水蜜桃一曲二区| 91三级片在线播放| 一区二区三区无码免费| 老熟女AV| 97在线视频免费观看| 青操av| 无码免费毛片| 国产视频无码| 欧美综合区| 色色毛片| 在线观看中文字幕亚洲| 免费无码进口视频| 男女做爱无码| 免费高潮视频| 91操视频| 五月天婷婷基地| 国产婷婷精品| 狠狠撸狠狠操| 国产精品黄视频| 国产成人AV在线播放| 亚洲经典免费视频| 无码精品视频在线观看| 97免费在线视频| 日韩人妻视频| 日韩午夜无码| 婷婷三级片| 日产久久久久久| 日韩在线成人| 大香蕉99热| 国产精品A片守望| 91在线无码精品国产三年| 天天爱综合| 亚洲黄色无码视频| 天天日天天添| 干妞网免费视频| 欧美精品一二三| 国产www视频| 东京热精品视频| 亚洲中文字幕在线视频播放| 亚洲中文字幕电影| 日本女人牲交视频| 人人操人人操人人操人人操人人操| 天天天天天天天天操| 久久久久久国际四虎免费精品视频 | 中文字幕东京热加勒比| 超碰性爱| 国产特黄级AAAAA片免| 一级黄色电影免费看| 精品人妻一区二区三区蜜桃| 天天干天天添| 激情综合网站| 国产成人97精品免费看片| 亚洲精品无码视频在线观看| 狼人综合视频| 黄色小电影在线观看| 国产精品乱子伦| 不卡一二三区| 刘玥91精一区二区三区| 一区二区三区四区| 蜜桃传媒一区二区| 青青草手机在线观看| 免费看黄片视频| 香蕉视频91| 日产精品久久久一区二区| 蝌蚪九色啦403| 97视频在线免费观看| a黄色视频| 在线观看免费黄色视频| 91超碰人人操| 乱伦一区二区三区| 91AV电影| 国产精品国产精品| 欧美A视频在线观看| 91精品国产综合久久蜜臀使用方法| 久久高清亚洲| 97精品| 密臀av在线| 欧美日韩视频一区二区| 亚洲视频区| 91成人国产| 国产伦精品一级A片视频夜夜| 电影91久久久| 久久福利社| 日韩porn| 亚洲天媒在线播放| 亚洲无码成人在线| 国产成人亚洲精品| 人人妻人人澡人人爽久久| 伊人9999| 处破女初破全过免费看| 2021狠狠操| 国产小视频在线| 欧美一级大香蕉| 日本免费黄色小视频| 免费无码A片在线观看全| 51午夜| 亚洲一区二区三区在线视频| 成人中文字幕无码| 黄色三级网站| 国产乱伦自拍| 久久久久99精品成人片三人毛片| 色a视频| 婷婷av在线| 丁香五月网站| 蜜芽成人精品久久久视频| 国产操穴视频| 国产一级婬片A片| 91狠狠综| 中文字幕av免费在线观看| 国产一区免费视频| 国产成人高清| 天天人人精品| 人人澡超碰碰| 无码在线专区| 亚洲区无码| 国产高清视频在线| 日韩午夜成人电影| 青青草日逼视频| 国产无码操逼视频| 日本黄在线播放| 97人人操| 三级AV在线| 国产精品无码ThePorn| AV大片在线观看| 婷婷五月天免费视频| 成人黄色网| 婷婷久久综合久色综| 午夜福利免费| 成人aV无码精品国产一区二区| 中文字幕在线欧美| 成人免费观看的毛视频| 青青草99| 国产一级a毛一级a做免费图片| 亚洲色图欧美在线| 国产精品欧美性爱| 97久久精品国产熟妇高清网| www天天干| 亚洲中文字幕不卡| 国产无遮挡又黄又爽又色视频 | 欧美在线播放| 色五月视频| 国产熟妇毛多久久久久一区| 成人黄色免费看| 国产在线播放av| 动漫人物插画动漫人物的视频软件 | 国产熟女一区二区视频网站| 丁香六月婷婷综合| 中文丰满亲子伦| 天天撸天天干| 日本五十路熟女视频| 日韩一级片免费看| 免费性爱网站| 在线观看一区二区三区四区 | 青青草免费在线视频| 特级西西人体大胆无码| 91女人18毛片水多的意思| 成人黄色免费观看| 日本三级黄色| 成人午夜福利视频| 婷婷五月成人| 日韩AV中文字幕在线播放| 水蜜桃一区二区三区| 中文字幕北条麻妃| 国产一区视频18| 日韩色小说| 一区二区三区视屏| 亚洲日韩乱码在线| 淫荡少妇美红久久久久久久久久| 免费在线观看黄色| 日本一区二区三区在线视频| 特级西西44www无码| 欧美三级毛片| 国产熟女在线| 精品国产免费无码久久噜噜噜AV | 国产熟女自拍| 亚洲精品日韩综合观看成人91| xxx国产精品| 巨い巨乳の少妇あジed2k| 婷婷五月在线| 黄色电影免费看| 日逼视频| 美国一级A片草草视频| 99在线观看视频| 蜜桃秘一二三区最新| 久久成人123| 国产中文字幕在线观看| 日本免费高清视频在线观看一区| 中文字幕亚洲有码| 久久久精品电影| 天天射视频| 波多野结衣无码高清| 欧美日韩黄片| 黄色操逼视频| 天堂网址激情网址| 新狠狠干| 国产天堂视频| 免费+无码+精品| 国产性受XXXXXYX性爽| 韩国成人免费无码免费视频| 亚洲黄色在线播放| 日韩三级精品| 撸一撸在线观看| www.五月丁香| 西西444WWW无码精品| 亚洲中文字幕网站| 91久久国产综合久| 操屄视频在线观看| 中文字幕视频在线| 日韩大香蕉| 国产偷拍精品视频| 成人影片亚洲| 久久久久久亚洲AV黄床| 国产精品在线看| 日韩免费不卡| 亚洲中文字幕不卡| 天天骑夜夜操| 欧美日韩国产高清| 黄色成人18| 蜜桃秘一二三区最新| 国产一级性爱视频| 亚洲国产精品尤物yw在线观看| 无码欧美人XXXXX日本无码| 激情小说在线观看| 四虎成人电影| 神马午夜| 西西人体大胆ww4444| 国产伦子伦一级A片免费看小说| 成人精品免费| 国产熟妇码视频户外直播| AV网站入口| 日p视频在线观看| 伊人影院99| 国产成人无码精品久在线观看| 精品日韩一区二区三区| 少妇视频一区| 农村A片婬片AAA毛片| 4444操| 国产欧美精品AAAAAA片| 伊人大香蕉精品| 亚洲久久在线| 99在线精品视频免费观看软件| 人妻综合网| 亚洲色无码人妻激情| 黄色一级片在线看| 国内精品久久久久久久久久| 色婷婷激情视频| 中文字幕第98页| 亚洲字幕在线播放| 日韩操比视频| 天堂网在线播放| 黄片一区二区三区| 中文字幕无码AV| 日韩高清精品在线| 亚洲免费天堂| AV大全在线观看| 三级片欧美| 中文字幕免| 粉嫩99精品99久久久久久特污 | 免费v片在线观看| 99热在线免费观看| 日韩欧美国产成人| www.日韩一区| 一级黄色片在线观看| 欧美一级在线| 手机看片福利视频| 亚洲视频无码在线| 操B网址| 日本特级黄色毛片| 日韩黄色片在线观看| 国产精品秘久久久久久1-~/\v7-/| 内射91| 97福利| 久久蜜桃成人| 超碰在线网站| 国产精品一区在线观看| 99精品一区二区| 一级黄影| 成人性爱在线观看| 伊人性视频| 成人毛片18女人毛片真水| 无码群交| 天天日天天日天天日| 中文字幕在线观看有码| 少妇人妻无码| 一品国精和二品国精的文化意义| 伊人日逼| 91视频www| 亚洲视频在线观看免费| 伊人色色色| 国产三级AV在线| 亚洲无码免费看| 欧美日韩在线观看一区二区三区| 亚洲黄色免费观看| 一区亚洲| 亚洲一级av无码毛片精品| 中国熟女HD| 亚洲欧美视频在线观看| 北岛玲视频在线| 中国一级黄色毛片| 99热在线免费观看| 国产成人h| 999久久久| 強暴人妻一区二区三区| 怡春院久久| 男女激情网站| 亚洲国产精品尤物yw在线观看 | 日韩中文字幕在线高清| 日本親子亂子倫XXXX50路| 欧美AAAAAA视频| 成人美女视频| 亚洲成人在线免费观看| 欧美一区二区三区四| 成人a片在线观看| 神马午夜av| 中文字幕亚洲无码视频| 韩国毛片| 国内无码自拍| 黄色av免费在线观看| 欧美成人精品一级| 精品成人A片久久久久久不卡三区 免费看成人A片无码照片88hⅤ | 久久精品99| 黄色一级片在线| 无码免费婬AV片在线观看| 日欧视频| 99色色网| 调教人妻视频| 97精品人人妻人人| 午夜午夜福利理论片在线播放| 狠狠干2024| 自拍偷拍视频网址| 欧美成人综合色| 操BAV| 亚洲综合图色40p| 午夜高清无码视频| 国产黄色电影在线| 国产成人精品电影| 丰满的人妻一区二区10| 搡bbb| 人人爱人人看| 台湾成人在线| 国产免费av在线观看| 天天视频黄色| 国产成人在线精品| 三级在线观看视频| 午夜成人一区二区| 欧洲操逼视频| 性欧美丰满熟妇XXXX性久久久 | 一个人看的www日本高清视频| 俄女兵一级婬片A片| 欧美AAAAA| 日逼大片| 亚洲高清视频在线播放| 狼人久久| 婷婷午夜精品久久久久久性色| 熟女人妻人蜜桃视频| 精品1区2区| 亚洲无码视频播放| 色小说在线| 伊人色女操穴综合网| 天天干天天色| 伊人蕉| 色婷婷Av| 久久久极品| 亚洲日韩中文字幕| 久久免费视频,久久免费视频| 日韩人妻精品中文字幕| 中字无码制服| 欧美成人视频电影无码高清| 日本A在线观看| AV无码资源| 男人天堂无码| 久久婷婷网站| 亚洲黄色av| 久久久久亚洲AV无码麻豆| 电家庭影院午夜| 黄片视频网站| 精品无码视频在线| 韩国中文字幕HD久久| 亚洲一级AV| 男女草比视频| 日韩小视频| 一区二区三区四区免费看| 亚州一级二级| 国产美女自慰网站| 亚洲尤物在线| 无码伦理电影| 香蕉伊人| 日韩三级在线播放| 天天操嫩逼无套视频| 91探花视频| 黄色一级大片在线免费看产| 日韩综合色视频导航| AV在线免费观看网址| 日韩无码人妻一区| 日韩黄色电影| 天天骑夜夜操| 国产1级片| 操美女影院| 成人网站免费在线观看| 大香蕉75在线| 欧美精品无码一区二区| 一区二区三区四区久久| 免费成人三级片| 麻豆91精品91久久久停运原因| 国产又爽又黄免费网站在线看 | 亚洲精品国偷拍自产在线观看蜜桃| 国产激情在线| 亚洲熟妇无码| 国产成人无码一区二区在线播放| 高清无码毛片| 国产aⅴ激情无码久久久无码| 欧美成人精品一级| 国产成人视频在线观看| 家庭乱伦av| 亚洲日本三级| 成人免费区一区二区三区| 怡红院男人天堂| 国产探花| 91av在线观看视频| 国产免费精彩视频| 中文字幕亚洲日韩| 特级西西444www精品视频 | 大奶AV| 91大神在线免费观看| 日韩综合色视频导航| 天天干天天拍| 国产99久久九九精品无码免费| 中文原创麻豆传媒md0052| 五月丁香综合网| 国产综合久久久7777777| 桃花岛tⅴ+亚洲品质| 国产欧美精品AAAAAA片| 国产高清自拍| 亚洲成人日韩| 久久久久无码国产精品不卡| 黄色国产视频在线观看| 在线免费人成视频| 婷婷五月天激情四射| 蜜桃AV在线播放| 青娱乐精品在线| 免费观看A级毛片| 国产三级AV在线观看| 免费一级黄色电影| 黄色小视频在线免费观看| 日韩91在线| 草草影院CCYYCOM屁屁影院合集限制影院 | 91视频国产精品| 色鬼综合网| 欧美日韩a片| 欧美一区三区视频z| 伊人成人在线视频| 欧美成人自拍| 亚洲免费成人视频| 亚洲欧美国产高清vA在线播放| 91丨豆花丨国产极品| 天天天天干| 黄色亚洲| 青青艹在线视频| 久青草资源福利视频| 精品动漫一区二区三区| 亚洲精品福利视频导航| 91麻豆精品在线| 黃色一级A片一級片| 亚洲视频在线免费播放| 中文字幕国产精品| 91成人网站| 国产午夜精品一区二区三区四区| AV电影免费看| 国产又粗又大又爽91嫩草| 免费A级毛片在线播放不收费| 国产又爽又黄免费网站在线| 韩国成人无码| 亚洲国产精品VA在线看黑人| 午夜无码久久| 日韩不卡高清在线观看视频| AV三级无码| 色婷婷在线视频| 九九99久久| 91色色色| 水蜜桃一曲二区| 成人激情综合网| 国产真实乱婬A片三区高清蜜臀| 日韩操片| 亚洲AV无码秘翔田| 色先锋资源站| 2021天天夜日| 狠狠艹狠狠干| 操逼地址| 色97| 大学生18一19GAY169| 中文字幕亚洲中文字幕| 午夜大黄片| 亚洲欧美婷婷五月色综合| av不卡免费观看| 国精产品秘一区二区| 久久人搡人人玩人妻精AV香蕉| 日韩无码国产精品| 亚洲97| 丁香五月中文字幕| 韩国成人啪啪无码高潮| 无码AV在线播放| 91无码在线观看| 国产一级无码| 婷婷色在线| 成人精品在线| 中文字幕成人在线| 99免费视频在线观看| 久热中文字幕| 高清无码一区| 狠狠的操| 澳门av| 亚欧成人在线视频| 涩久久久| 欧美日韩一区二区三区四区五区六区 | 俺也色俺也干| 韩国无码AV| 日韩在线视频二区| 天天日天天综合|