午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Go語言中讀取命令參數的幾種方法總結

Go語言中讀取命令參數的幾種方法總結

熱門標簽:鄭州亮點科技用的什么外呼系統 汕頭小型外呼系統 釘釘有地圖標注功能嗎 建造者2地圖標注 阿里云ai電話機器人 惠州電銷防封電話卡 浙江高頻外呼系統多少錢一個月 濱州自動電銷機器人排名 黃岡人工智能電銷機器人哪個好

前言

對于一名初學者來說,想要盡快熟悉 Go 語言特性,所以以操作式的學習方法為主,比如編寫一個簡單的數學計算器,讀取命令行參數,進行數學運算。

本文講述使用三種方式講述 Go 語言如何接受命令行參數,并完成一個簡單的數學計算,為演示方便,最后的命令行結果大概是這樣的:

# input 
./calc add 1 2
# output
3

# input
./calc sub 1 2
# out
-1

# input
./calc mul 10 20
# out
200

使用的三種方式是:

  • 內置 os 包讀取命令參數
  • 內置 flag 包讀取命令參數
  • cli 框架讀取命令參數

0. 已有歷史經驗

如果你熟悉 Python 、Shell 腳本,你可以比較下:

Python

import sys

args = sys.argv

# args 是一個列表
# 第一個值表示的是 文件名
# 除第一個之外,其他的值是接受的參數

Shell

if [ $# -ne 2 ]; then
 echo "Usage: $0 param1 pram2"
 exit 1
fi
name=$1
age=$2

echo $name
echo $age
# `$0` 表示文件名
# `$1` 表示第一個參數
# `$2` 表示第二個參數

能看出一些共性,接收參數,一般解析出來都是一個數組(列表、切片), 第一個元素表示的是文件名,剩余的參數表示接收的參數。

好,那么為了實現 “簡單數學計算” 這個功能,讀取命令行參數:比如 ./calc add 1 2

除文件名之外的第一個元素:解析為 進行數學運算的 操作,比如: add、sub、mul、sqrt
其余參數表示:進行操作的數值

注意:命令行讀取的參數一般為字符串,進行數值計算需要進行數據類型轉換

大概思路就是這樣。

1. OS 獲取命令行參數

os.Args

# 為接受的參數,是一個切片

strconv.Atoi 

# 將字符串數值轉換為整型

strconv.Itoa

# 將整型轉換為字符串

strconv.ParseFloat

# 將字符串數值轉換為浮點型
var help = func () {
 fmt.Println("Usage for calc tool.")
 fmt.Println("====================================================")
 fmt.Println("add 1 2, return 3")
 fmt.Println("sub 1 2, return -1")
 fmt.Println("mul 1 2, return 2")
 fmt.Println("sqrt 2, return 1.4142135623730951")
}


func CalcByOs() error {
 args := os.Args
 if len(args)  3 || args == nil {
 help()
 return nil
 }
 operate := args[1]
 switch operate {
 case "add":{
  rt := 0
  number_one, err1 := strconv.Atoi(args[2])
  number_two, err2 := strconv.Atoi(args[3])
  if err1 == nil  err2 == nil {
  rt = number_one + number_two
  fmt.Println("Result ", rt)
  }
 }
 case "sub":
 {
  rt := 0
  number_one, err1 := strconv.Atoi(args[2])
  number_two, err2 := strconv.Atoi(args[3])
  if err1 == nil  err2 == nil {
  rt += number_one - number_two
  fmt.Println("Result ", rt)
  }
 }
 case "mul":
 {
  rt := 1
  number_one, err1 := strconv.Atoi(args[2])
  number_two, err2 := strconv.Atoi(args[3])
  if err1 == nil  err2 == nil {
  rt = number_one * number_two
  fmt.Println("Result ", rt)
  }
 }
 case "sqrt":
 {
  rt := float64(0)
  if len(args) != 3 {
  fmt.Println("Usage: sqrt 2, return 1.4142135623730951")
  return nil
  }
  number_one, err := strconv.ParseFloat(args[2], 64)
  if err == nil {
  rt = math.Sqrt(number_one)
  fmt.Println("Result ", rt)
  }
 }
 default:
 help()

 }
 return nil
}

最后的效果大概是:

./calc add 1 2
Result 3

====================

./calc sub 1 2
Result -1

====================

./calc mul 10 20
Result 200

===================

./calc sqrt 2
Result 1.4142135623730951

2. flag 獲取命令行參數

flag 包比 os 讀取參數更方便。可以自定義傳入的參數的類型:比如字符串,整型,浮點型,默認參數設置等

基本的使用方法如下:

var operate string

flag.StringVar(operate,"o", "add", "operation for calc")

# 解釋

綁定 operate 變量, name="o", value="add" , usage="operation for calc"

也可以這樣定義為指針變量

var operate := flag.String("o", "add", "operation for calc")

同時還可以自定義 flag 類型

所有變量注冊之后,調用 flag.Parse() 來解析命令行參數, 如果是綁定變量的方式,直接使用變量進行操作,
如果使用指針變量型,需要 *operate 這樣使用。

flag.Args() 表示接收的所有命令行參數集, 也是一個切片

for index, value := range flag.Args {
 fmt.Println(index, value)
}
func CalcByFlag() error {
 var operation string
 var numberone float64
 var numbertwo float64
 flag.StringVar(operation, "o", "add", "operation for this tool")
 flag.Float64Var(numberone, "n1", 0, "The first number")
 flag.Float64Var(numbertwo, "n2", 0, "The second number")
 flag.Parse()
 fmt.Println(numberone, numbertwo)
 if operation == "add" {
 rt := numberone + numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sub" {
 rt := numberone - numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "mul" {
 rt := numberone * numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sqrt" {
 rt := math.Sqrt(numberone)
 fmt.Println("Result ", rt)
 } else {
 help()
 }
 return nil
}

最后的結果效果如下:

./calc -o add -n1 1 -n2 2
Result 3

=============================

./calc -o sub -n1 2 -n2 3
Result -1

============================

./calc -o mul -n1 10 -n2 20
Result 200

===========================

./calc -o sqrt -n1 2
Result 1.4142135623730951

3. CLI 框架

cli 是一款業界比較流行的命令行框架。

所以你首先需要安裝:

go get github.com/urfave/cli
# 一個簡單的示例如下:
package main

import (
 "fmt"
 "os"

 "github.com/urfave/cli"
)

func main() {
 app := cli.NewApp()
 app.Name = "boom"
 app.Usage = "make an explosive entrance"
 app.Action = func(c *cli.Context) error {
 fmt.Println("boom! I say!")
 return nil
 }

 app.Run(os.Args)
}

好,為實現 “簡單數學計算” 的功能,我們應該怎么實現呢?

主要是 使用 框架中的 Flag 功能,對參數進行設置

app.Flags = []cli.Flag {
 cli.StringFlag{
 Name: "operation, o",
 Value: "add",
 Usage: "calc operation",
 },
 cli.Float64Flag{
 Name: "numberone, n1",
 Value: 0,
 Usage: "number one for operation",
 },
 cli.Float64Flag{
 Name: "numbertwo, n2",
 Value: 0,
 Usage: "number two for operation",
 },
}

能看出,我們使用了三個參數:operation、numberone、numbertwo

同時定義了參數的類型,默認值,以及別名(縮寫)

那么在這個框架中如何實現參數的操作呢:主要是重寫app.Action 方法

app.Action = func(c *cli.Context) error {
 operation := c.String("operation")
 numberone := c.Float64("numberone")
 numbertwo := c.Float64("numbertwo")
 //fmt.Println(operation, numberone, numbertwo)
 if operation == "add" {
 rt := numberone + numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sub" {
 rt := numberone - numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "mul" {
 rt := numberone * numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sqrt" {
 rt := math.Sqrt(numberone)
 fmt.Println("Result ", rt)
 } else {
 help()
 }
 return nil
}

# 對 operation 參數進行判斷,執行的是那種運算,然后編寫相應的運算操作
func CalcByCli(){
 app := cli.NewApp()
 app.Name = "calc with go"
 app.Usage = "calc tool operate by go"
 app.Version = "0.1.0"
 app.Flags = [] cli.Flag {
  cli.StringFlag{
   Name: "operation, o",
   Value: "add",
   Usage: "calc operation",
  },
  cli.Float64Flag{
   Name: "numberone, n1",
   Value: 0,
   Usage: "number one for operation",
  },
  cli.Float64Flag{
   Name: "numbertwo, n2",
   Value: 0,
   Usage: "number two for operation",
  },
 }
 app.Action = func(c *cli.Context) error {
  operation := c.String("operation")
  numberone := c.Float64("numberone")
  numbertwo := c.Float64("numbertwo")
  //fmt.Println(operation, numberone, numbertwo)
  if operation == "add" {
   rt := numberone + numbertwo
   fmt.Println("Result ", rt)
  } else if operation == "sub" {
   rt := numberone - numbertwo
   fmt.Println("Result ", rt)
  } else if operation == "mul" {
   rt := numberone * numbertwo
   fmt.Println("Result ", rt)
  } else if operation == "sqrt" {
   rt := math.Sqrt(numberone)
   fmt.Println("Result ", rt)
  } else {
   help()
  }
  return nil
 }
 app.Run(os.Args)
}

調用這個函數的最終效果如下:

./calc -o add --n1 12 --n2 12
Result 24

===================================

./calc -o sub --n1 100 --n2 200
Result -100

===================================

./calc -o mul --n1 10 --n2 20
Result 200

===================================

./calc -o sqrt --n1 2
Result 1.4142135623730951

4 其他

知道如何讀取命令行參數,就可以實現一些更有意思的事。

比如網上有許多免費的 API 接口,比如查詢天氣,查詢農歷的API 接口。

還有一些查詢接口,比如有道云翻譯接口,你可以實現翻譯的功能。

或者扇貝的接口,實現查詢單詞的功能。

再比如一些音樂接口,實現音樂信息查詢。

不一一列了。

下面實現一個調用免費的查詢天氣的接口實現命令行查詢天氣。

GO 如何進行 HTTP 訪問?內置的 net/http 可以實現

一個簡易的GET 操作如下:

func Requests(url string) (string, error) {
 response, err := http.Get(url)
 if err != nil {
  return "", err
 }
 defer response.Body.Close()
 body, _ := ioutil.ReadAll(response.Body)
 return string(body), nil
}

免費的 API URL 如下:

http://www.sojson.com/open/api/weather/json.shtml?city=北京

返回的結果是一個Json 格式的數據

{
 "status": 200,
 "data": {
  "wendu": "29",
  "ganmao": "各項氣象條件適宜,發生感冒機率較低。但請避免長期處于空調房間中,以防感冒。",
  "forecast": [
   {
    "fengxiang": "南風",
    "fengli": "3-4級",
    "high": "高溫 32℃",
    "type": "多云",
    "low": "低溫 17℃",
    "date": "16日星期二"
   },
   {
    "fengxiang": "南風",
    "fengli": "微風級",
    "high": "高溫 34℃",
    "type": "晴",
    "low": "低溫 19℃",
    "date": "17日星期三"
   },
   {
    "fengxiang": "南風",
    "fengli": "微風級",
    "high": "高溫 35℃",
    "type": "晴",
    "low": "低溫 22℃",
    "date": "18日星期四"
   },
   {
    "fengxiang": "南風",
    "fengli": "微風級",
    "high": "高溫 35℃",
    "type": "多云",
    "low": "低溫 22℃",
    "date": "19日星期五"
   },
   {
    "fengxiang": "南風",
    "fengli": "3-4級",
    "high": "高溫 34℃",
    "type": "晴",
    "low": "低溫 21℃",
    "date": "20日星期六"
   }
  ],
  "yesterday": {
   "fl": "微風",
   "fx": "南風",
   "high": "高溫 28℃",
   "type": "晴",
   "low": "低溫 15℃",
   "date": "15日星期一"
  },
  "aqi": "72",
  "city": "北京"
 },
 "message": "OK"
}

所以我們的任務就是傳入 “城市” 的名稱,再對返回的 Json 數據解析。

package main

import (
  "fmt"
  "os"
 "encoding/json"
  "github.com/urfave/cli"
  "net/http"
  "io/ioutil"
  //"github.com/modood/table"
)
type Response struct {
  Status int `json:"status"`
  CityName string `json:"city"`
  Data  Data `json:"data"`
  Date  string `json:"date"`
  Message string `json:"message"`
  Count int `json:"count"`
}

type Data struct {
  ShiDu  string `json:"shidu"`
  Quality string `json:"quality"`
  Ganmao string `json:"ganmao"`
  Yesterday Day `json:"yesterday"`
  Forecast []Day `json:"forecast"`
}

type Day struct {
  Date string `json:"date"`
  Sunrise string `json:"sunrise"`
  High string `json:"high"`
  Low  string `json:"low"`
  Sunset string `json:"sunset"`
  Aqi  float32 `json:"aqi"`
  Fx  string `json:"fx"`
  Fl  string `json:"fl"`
  Type string `json:"type"`
  Notice string `json:"notice"`
}

func main() {
  const apiURL = "http://www.sojson.com/open/api/weather/json.shtml?city="
  app := cli.NewApp()
  app.Name = "weather-cli"
  app.Usage = "天氣預報小程序"

  app.Flags = []cli.Flag{
    cli.StringFlag{
      Name: "city, c",
      Value: "上海",
      Usage: "城市中文名",
    },
    cli.StringFlag{
      Name: "day, d",
      Value: "今天",
      Usage: "可選: 今天, 昨天, 預測",
    },
    cli.StringFlag{
      Name: "Author, r",
      Value: "xiewei",
      Usage: "Author name",
    },
  }

  app.Action = func(c *cli.Context) error {
    city := c.String("city")
    day := c.String("day")

    var body, err = Requests(apiURL + city)
    if err != nil {
      fmt.Printf("err was %v", err)
      return nil
    }

    var r Response
    err = json.Unmarshal([]byte(body), r)
    if err != nil {
      fmt.Printf("\nError message: %v", err)
      return nil
    }
    if r.Status != 200 {
      fmt.Printf("獲取天氣API出現錯誤, %s", r.Message)
      return nil
    }
    Print(day, r)
    return nil
  }
  app.Run(os.Args)

}


func Print(day string, r Response) {
  fmt.Println("城市:", r.CityName)
  if day == "今天" {
    fmt.Println("濕度:", r.Data.ShiDu)
    fmt.Println("空氣質量:", r.Data.Quality)
    fmt.Println("溫馨提示:", r.Data.Ganmao)
  } else if day == "昨天" {
    fmt.Println("日期:", r.Data.Yesterday.Date)
    fmt.Println("溫度:", r.Data.Yesterday.Low, r.Data.Yesterday.High)
    fmt.Println("風量:", r.Data.Yesterday.Fx, r.Data.Yesterday.Fl)
    fmt.Println("天氣:", r.Data.Yesterday.Type)
    fmt.Println("溫馨提示:", r.Data.Yesterday.Notice)
  } else if day == "預測" {
    fmt.Println("====================================")
    for _, item := range r.Data.Forecast {
      fmt.Println("日期:", item.Date)
      fmt.Println("溫度:", item.Low, item.High)
      fmt.Println("風量:", item.Fx, item.Fl)
      fmt.Println("天氣:", item.Type)
      fmt.Println("溫馨提示:", item.Notice)
      fmt.Println("====================================")
    }
  } else {
    fmt.Println("...")
  }

}
func Requests(url string) (string, error) {
  response, err := http.Get(url)
  if err != nil {
    return "", err
  }
  defer response.Body.Close()
  body, _ := ioutil.ReadAll(response.Body)
  return string(body), nil
}

最終的效果大概如下:

./weather -c 上海

城市: 上海
濕度: 80%
空氣質量: 輕度污染
溫馨提示: 兒童、老年人及心臟、呼吸系統疾病患者人群應減少長時間或高強度戶外鍛煉


================================
./weaather -c 上海 -d 昨天

城市: 上海
日期: 28日星期二
溫度: 低溫 12.0℃ 高溫 19.0℃
風量: 西南風 3級
天氣: 小雨
溫馨提示: 霧蒙蒙的雨天,最喜歡一個人聽音樂

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Go語言中使用flag包對命令行進行參數解析的方法
  • Go語言中一些不常見的命令參數詳解

標簽:瀘州 阿壩 泰安 晉中 滄州 駐馬店 東營 昭通

巨人網絡通訊聲明:本文標題《Go語言中讀取命令參數的幾種方法總結》,本文關鍵詞  語,言中,讀取,命令,參數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言中讀取命令參數的幾種方法總結》相關的同類信息!
  • 本頁收集關于Go語言中讀取命令參數的幾種方法總結的相關信息資訊供網民參考!
  • 推薦文章
    国产又色又爽又高潮免费| 欧美三级视频在线播放| 北条麻妃99精品青青久久| 一区二区三区四区五区精品| 久久久久久久久久91| 久久先锋资源网| 亚洲国产天堂网精品网站| 欧洲一区二区在线| 丰满少妇被猛烈进入一区二区| 久久在线免费观看| 欧美丰满少妇xxxxx| 国产九九在线观看| 秋霞成人午夜伦在线观看| 精品国产99国产精品| 中文字幕av久久| 中文字幕手机在线视频| 一区二区在线看| 国产伊人精品在线| 久久久久无码精品国产sm果冻| 成人动漫一区二区三区| 久久中文字幕国产| 天堂在线中文在线| 国产精一区二区三区| xxxx欧美18另类的高清| 看欧美ab黄色大片视频免费| 久久九九99| 国产视频久久久| ww国产内射精品后入国产| 国产视频aaa| 精品国产乱码久久久久久久| 青青在线视频免费观看| 性生活三级视频| 亚洲级视频在线观看免费1级| 国产妇女馒头高清泬20p多| 亚洲经典一区二区三区| 欧美精品一区二区三区视频| 狠狠97人人婷婷五月| 免费一区二区视频| 久久成人综合视频| 亚洲 欧美 日韩在线| 久久久精品一品道一区| 成人性生交大片免费看视频直播| 人人澡人人澡人人看| 黄色成人av网| 亚洲国产精品一区二区第一页| 一区二区国产欧美| 亚洲国产婷婷香蕉久久久久久| 成年人免费在线播放| 国产在线精品一区二区不卡了 | 日一区二区三区| 神马国产精品影院av| 成人高清在线观看视频| 国产欧美日韩精品一区| 99精品在线直播| 国产精品成人久久久| 精品国产一区二区亚洲人成毛片| 三级在线免费看| 99久久精品国产导航| 国产欧美精品在线| 六月丁香激情综合| 亚洲第一精品福利| 国模大尺度视频| 自拍偷拍亚洲欧美日韩| 日本一区视频在线| 污污网站在线免费观看| 欧美激情极品视频| 亚洲波多野结衣| 欧美日韩小视频| 97公开免费视频| 久久久久久夜精品精品免费| 久久精品国产精品国产精品污| 亚洲精品久久久久久无码色欲四季| 中文字幕在线观看日韩| 少妇愉情理伦三级| 欧美日韩www| 在线黄色免费看| 依依成人综合视频| 人妻无码久久一区二区三区免费| 高清不卡一二三区| 99久久99| 亚洲欧美综合一区二区| 欧亚精品中文字幕| 国产成人av免费| www.欧美精品| 久久艹精品视频| 精品视频久久久久久| 国产福利短视频| 欧美日韩国产美| 黄页网站在线看| 一本一道波多野结衣一区二区| 成人在线观看黄| |精品福利一区二区三区| 国产91porn| 91麻豆精品秘密| 伊人久久大香线蕉精品| 成人sese在线| 亚洲欧洲三级| 92精品国产成人观看免费| 日韩色妇久久av| 国产91精品在线观看| 免费99视频| 大胆亚洲人体视频| 亚洲国产成人不卡| 成人精品免费视频| 尤物国产精品| 日本一区二区三区在线观看| 欧美黄网在线观看| 国产精品久久久久9999吃药| 少妇无码av无码专区在线观看| 国产精品嫩草影院com| 国产深夜男女无套内射| 亚洲一区日韩精品中文字幕| 日韩中文字幕a| 在线观看国产精品网站| 好吊色视频一区二区三区| 日韩午夜激情av| 国产麻豆a毛片| 日韩在线视频国产| 又污又黄的网站| 国产精品嫩草影院久久久| 亚洲区小说区图片区| 成人做爰66片免费看网站| 国产高清无密码一区二区三区| 久久免费看毛片| 亚洲欧美日韩国产一区二区三区| 中文字幕天天干| 91精品国产入口在线| 三级黄色片在线观看| 日韩三级影视基地| 国产精品久久久久久69| 97视频热人人精品| 99久久99精品久久久久久| 日本在线xxx| 91福利区一区二区三区| 国产精品久久久久久成人| 中文字幕最新精品| 国产裸体无遮挡| 国产有色视频色综合| 成人看片黄a免费看在线| 99久久免费观看| 色综合中文字幕国产| 高清国产在线观看| 精品少妇v888av| 亚洲 欧美 激情 另类| 四虎影院一区二区三区| 一区二区三区 在线观看视频 | 91高清视频在线| 久久视频精品在线观看| 美女久久久久久久| 无码国产精品一区二区色情男同| 亚洲高清资源综合久久精品| 亚洲va欧美va国产va天堂影院| 中文字幕一二三四区| 久久电影一区二区| 日韩电影免费在线观看网站| 成人免费a级片| 在线欧美日韩国产| 国产亚洲欧美精品久久久久久| 国产精品久久久999| 成人美女在线观看| 91小视频在线播放| 日韩毛片在线观看| 丰满人妻一区二区| 六月婷婷激情网| 欧美日韩国产综合一区二区三区| 日本熟妇成熟毛茸茸| 91一区二区三区| 国产精品乱码一区二区三区软件| 在线视频 日韩| 久久久久久久久久久成人| 看国产成人h片视频| 日韩毛片在线免费看| 日韩精品在线播放| 蜜臀av中文字幕| 免费在线看黄色片| 欧美成人aa大片| www日本在线| av片在线免费| 亚洲精品二三区| 污视频在线免费| 奇米精品一区二区三区| 亚洲午夜av久久乱码| 丝袜美腿亚洲一区二区图片| 国产精品无码专区av在线播放 | 久久成人国产精品入口| 懂色中文一区二区三区在线视频| 一区二区在线看| 欧美一级视频免费观看| 鲁丝一区鲁丝二区鲁丝三区| 在线欧美小视频| 国产又粗又猛视频| 日韩 欧美 视频| 亚洲人永久免费| 蜜桃视频一区二区三区在线观看| 欧美午夜精品理论片| 久久久亚洲影院你懂的| 国产偷v国产偷v亚洲高清| 久久久久久久久福利| av免费精品一区二区三区| 欧美性黄网官网| 在线观看亚洲一区二区| 日韩人妻无码精品久久久不卡| 亚洲色图欧美制服丝袜另类第一页| 六月丁香综合在线视频| 国产亚洲精品成人a| 国产精品美乳在线观看| 亚洲成人午夜影院| 这里只有精品999| 久久国产亚洲精品无码| 欧美乱妇40p| 国产精品无码永久免费888| 精品亚洲乱码一区二区 | 999国内精品视频在线| 日韩人体视频一二区| 亚洲爱情岛论坛永久| 黄色手机在线视频| 国产成人精品久久久| 亚洲高清免费一级二级三级| 中国一级片黄色一级片黄| 欧美s码亚洲码精品m码| 久久久久久久一| 一区二区三区在线影院| 国产精品玖玖玖| 国产乱女淫av麻豆国产| 国产欧美精品一区二区| 欧美三级日韩三级| 视频一区欧美日韩| 精品少妇一区二区三区免费观| 国产免费一区二区| 精品国产亚洲一区二区三区在线观看 | 一区二区的视频| 国产一线二线三线在线观看| 日韩av观看网址| 在线精品视频小说1| 肉肉av福利一精品导航| 国产在线综合视频| 亚洲天堂电影网| 久久精品小视频| 亚洲综合在线五月| 日日夜夜精品免费| 亚洲熟妇一区二区三区| 亚洲二区三区四区| 欧美精品第一页在线播放| 午夜国产精品一区| 黄色aaa毛片| 女尊高h男高潮呻吟| 日韩精品久久久| 久久久999国产| 精品国产成人在线| 久99久精品视频免费观看| 午夜免费激情视频| 国产精品久久久久久久久电影网| 欧美日韩国产成人在线观看| 欧美性色xo影院| 国产精品一区一区三区| 九九热国产精品视频| 久热免费在线观看| 91精品免费| 亚洲无av在线中文字幕| 午夜伦欧美伦电影理论片| 美日韩一区二区三区| 精品无码久久久久| 日韩一级理论片| 精品麻豆av| 欧美国产精品va在线观看| 欧美在线免费播放| eeuss影院一区二区三区| 在线观看黄色国产| 99久久人妻无码精品系列| www婷婷av久久久影片| 国产精品丝袜一区二区三区| 精品偷拍各种wc美女嘘嘘| 综合久久给合久久狠狠狠97色 | 亚洲AV无码精品国产| 香蕉久久久久久久| 日韩免费高清在线| 热re99久久精品国99热蜜月| 秋霞成人午夜鲁丝一区二区三区| 精品国产乱码久久久久久夜甘婷婷| 1024成人网| 看片的网站亚洲| 一级黄色片在线观看| 国产又粗又长又黄的视频| 日韩亚洲在线视频| 日本欧美精品久久久| 国产精品久久av| 中文字幕日韩在线播放| 欧美这里有精品| 国产精品伦一区| 国产成人精品午夜视频免费| 亚洲精品久久久狠狠狠爱 | 成人黄色激情网| 久久中文精品视频| 欧美va在线播放| 日韩欧美aⅴ综合网站发布| 久久亚洲春色中文字幕久久久| 五月婷婷免费视频| 69xxxx国产| 一区二区国产精品精华液| 久久久久亚洲av无码专区首jn| www.成年人视频| 日韩欧美三级电影| 亚洲影院在线看| 欧美亚洲国产成人精品| 亚洲人午夜精品| 欧美va亚洲va国产综合| 一本一道波多野结衣一区二区| 中文字幕一区二区三区视频 | 男人的天堂成人| 国产另类自拍| 国产精品手机播放| 91国产精品视频在线| 精品国产一区二区三区久久狼黑人| 日韩欧美aaaaaa| 欧美日韩免费不卡视频一区二区三区| 国产精品免费久久久久| 成人一区二区三区视频在线观看| 久久午夜激情| 日韩在线视频观看免费| 亚洲综合网av| 波多野结衣电影在线播放| 国产精品99无码一区二区| 国产精品久久久精品四季影院| 久久久久久久久免费看无码| 免费黄色在线播放| 视频一区中文字幕| 欧美夜福利tv在线| av中文字幕免费在线观看| 91精品国产777在线观看| 三级网站在线播放| 久久91精品国产91久久久| www色aa色aawww| 在线观看视频一区| 少妇高潮大叫好爽喷水| 在线能看的av| 欧美精品亚洲一区二区在线播放| 日韩一区二区三区高清| 免费观看久久久4p| 久久影视电视剧免费网站| 日韩一级性生活片| 一二三区中文字幕| 日本韩国精品一区二区在线观看| 中文在线观看免费视频| 日韩三区在线观看| 青青在线免费观看视频| 成人18视频日本| 国产久一道中文一区| 国产专区综合网| 91一区二区三区| 久久久久久久毛片| 在线免费观看日本一区| 欧美性猛交xxx乱久交| 一区二区三区在线观看欧美| 中文字幕第4页| 国产91久久婷婷一区二区| 久久午夜羞羞影院免费观看| 波多野结衣一本| 国产精品国语对白| 国产精品99久久久久| 婷婷丁香激情网| 这里是久久伊人| 91人人澡人人爽人人精品| 亚洲免费在线电影| 久久国产精品 国产精品| 99精品视频一区二区| 一区二区视频在线播放| 97久久精品人人澡人人爽| 日韩视频在线免费看| 美国欧美日韩国产在线播放| av资源一区二区| 日本在线观看不卡视频| 国产精品久久亚洲| 国产女主播一区| av直播在线观看| 欧美日韩不卡一区二区| 91精品人妻一区二区三区蜜桃欧美| 精品丝袜一区二区三区| 日本韩国欧美中文字幕| 国产美女精品在线观看| 日本一区二区不卡在线| 亚洲国产精品字幕| 亚洲香蕉在线视频| 欧美日韩在线观看一区| 99精品视频一区| 91香蕉视频污在线观看| 精品一卡二卡三卡四卡日本乱码| 亚洲精品97久久| 蜜臀久久99精品久久久久久9| 欧美熟妇一区二区| 国产精品久久久av久久久| 亚洲国产色一区| 国产乱国产乱老熟300| 国产91在线高潮白浆在线观看| 日本中文在线一区| 日韩欧美猛交xxxxx无码| 亚洲男帅同性gay1069| 亚洲欧美卡通动漫| 欧美诱惑福利视频| 韩国精品在线观看| 久久99国产精品| 成人av午夜电影| 在线观看三级网站| 色综合久久久久综合体| 日本少妇在线观看| 日韩欧美国产二区| 亚洲人精品午夜在线观看| 99久久免费精品高清特色大片| 免费在线观看日韩av| 亚洲一区第一页| 日韩激情一区二区|