婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang: 內建容器的用法

Golang: 內建容器的用法

熱門標簽:評價高的400電話辦理 壽光微信地圖標注 外呼系統用什么卡 百度地圖標注后傳給手機 外呼系統顯本地手機號 電話機器人軟件免費 涿州代理外呼系統 excel地圖標注分布數據 阿克蘇地圖標注

1.數組

數組是值類型

[10]int 和 [20]int是不同類型

調用func(arr [10]int)會拷貝數組

在go語言中一般不直接使用數據

package main
import "fmt"
func updateArr(arr *[5]int) {
	arr[0] = 100
}
func updateArrThroughSlice(arr []int)  {
	arr[0] = 100
}
func main() {
	//創建一個數據
	var arr [5]int
	arr2 := [5]int{1, 2, 3, 4, 5}
	//長度讓編譯器來數
	arr3 := [...]int{1, 2, 3, 4, 5}
	//[0 0 0 0 0] [1 2 3 4 5] [1 2 3 4 5]
	fmt.Println(arr, arr2, arr3)
	//定義二維數組 4行5列
	var arr4 [4][5]int
	//[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
	fmt.Println(arr4)
	//遍歷數據
	//for i:=0;ilen(arr3);i++{
	//	fmt.Println(arr3[i])
	//}
	for num, v := range arr2 {
		fmt.Printf("第%d個元素為:%d\n", num, v)
	}
	//數據是值類型,通過指針可以改變值的大小
	fmt.Println("update before")
	fmt.Println(arr2)
	updateArr(arr2) //傳入arr3的地址
	fmt.Println("update after")
	fmt.Println(arr2)
	
	//通過Slice改變數據
	fmt.Println("update before")
	fmt.Println(arr3)
	updateArrThroughSlice(arr3[:]) //傳入Slice
	fmt.Println("update after")
	fmt.Println(arr3)
}

2.Slice(切片)

2.1 Slice的實現

Slice本身沒有數據,是對底層array的一個view

Slice內部有個指針(ptr)指向開頭的元素,Slice有長度(len),容量(cap);cap代表從指針(ptr)開始到數組(arr)末尾的長度,Slice在擴展的時候不能超過cap.

package main
import "fmt"
func updateSlice(s []int) {
	s[0] = 100
}
func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	//創建一個Slice
	s1 := arr[:]
	s2 := arr[2:6]
	fmt.Printf("s1:%v\ns2:%v\n", s1, s2)
	//改變Slice內部元素
	updateSlice(s2)
	fmt.Println(s2)
	//ReSlice:對Slice再進行一次Slice操作
	s3 := s1[:5]
	fmt.Println(s3)
	s3 = s3[:2]
	fmt.Println(s3)
}

2.2 Slice的擴展

s[i]不可以超越len(i),向后擴展不可以超過底層數組cap(s)

package main
import "fmt"
func updateSlice(s []int) {
	s[0] = 100
}
func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Printf("arr=%v\n", arr)
	//Extending Slice 不能超過cap(s)
	s1 := arr[2:6]
	fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
	s2 := s1[3:5]
	fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2, len(s2), cap(s2))
	// s[i]不能超過len(s)
	fmt.Printf("get Slice element:%v",s2[1])
	//panic: runtime error: index out of range [2] with length 2
	//fmt.Printf("get Slice element:%v",s2[2])
}

2.2 Slice的其它操作

向Slice添加元素

package main
import "fmt"
//查看操作系統怎么擴充Slice的cap
func printSlice(s []int) {
	fmt.Printf("%v, len=%d, cap=%d\n", s, len(s), cap(s))
}
func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	//添加元素時如果超越cap,系統會重新分配更大的底層數組
	//由于值傳遞的關系,必須接收append的返回值
	// s = append(s,val)
	s1 := arr[2:]
	fmt.Printf("s1=%v\n", s1)
	s2 := s1[3:5] //[s1[3], s1[4]]
	fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2, len(s2), cap(s2))
	s3 := append(s2, 10)
	s4 := append(s3, 11)
	s5 := append(s4, 12)
	fmt.Printf("s3=%v, s4=%v, s5=%v\n", s3, s4, s5)
	// s4 and s5 no longer view arr
	fmt.Printf("arr=%v\n", arr)
	//創建一個Slice
	var s []int
	//Zero value for slice is nil
	for i := 0; i  100; i++ {
		printSlice(s)
		s = append(s, i*2+1)
	}
	fmt.Println(s)
}

Slice的copy,添加,刪除元素操作

package main
import (
	"fmt"
)
//查看操作系統怎么擴充Slice的cap
func printSlice(str string, s []int) {
	fmt.Printf("%s=%v, len=%d, cap=%d\n", str, s, len(s), cap(s))
}
func main() {
	//初始化slice
	s1 := []int{2, 4, 6, 8}
	fmt.Println(s1)
	//[2 4 6 8]
	//創建一個len為16的Slice
	s2 := make([]int, 16)
	//創建一個len為10,cap為32的Slice
	s3 := make([]int, 10, 32)
	printSlice("s2", s2)
	//[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16
	printSlice("s3", s3)
	//[0 0 0 0 0 0 0 0 0 0], len=10, cap=32
	//拷貝Slice
	fmt.Println("Copying Slice")
	//dst src
	copy(s2, s1)
	printSlice("s2", s2)
	//[2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16
	//刪除Slice中的元素
	fmt.Println("Deleting element from slice")
	//刪除下標為3的元素
	//通過...append s2下標為4后的元素
	s2 = append(s2[:3], s2[4:]...)
	printSlice("s2", s2)
	//刪除頭尾元素
	fmt.Println("Popping from front")
	front := s2[0]
	s2 = s2[1:]
	fmt.Println(front)
	fmt.Println(s2)
	fmt.Println("Popping from back")
	tail := s2[len(s2)-1]
	s2 = s2[:len(s2)-1]
	fmt.Println(tail)
	fmt.Println(s2)
}

3.Map

3.1 Map的操作

創建: make(map[string]int)

獲取元素:m[key]

key不存在時,獲得Value類型的初始值

用value,ok := m[key]來判斷是否存在key

用delete刪除一個key

使用range遍歷key,或者遍歷key, value對

不保證遍歷順序,如需順序,需手動對key排序

使用len獲得元素個數

package main
import "fmt"
func main() {
	//創建一個map
	//map中的key是無序的,是一個HashMap
	m := map[string]string{
		"name":    "Cocktail_py",
		"course":  "golang",
		"site":    "CSDN",
		"quality": "pretty well",
	}
	m2 := make(map[string]int) // m2 = empty map
	var m3 map[string]int      // m3 == nil
	fmt.Println(m, m2, m3)
	fmt.Println("Traversing map")
	for k, v := range m {
		fmt.Println(k, v)
	}
	//map 操作
	//獲取元素:m[key]
	fmt.Println("Getting values")
	courseName, ok := m["course"]
	fmt.Println(courseName, ok)
	
	//當key不存在
	if courName, ok := m["courName"]; ok {
		fmt.Println(courName) // Zero value
	} else {
		fmt.Println("key does not exist")
	}
	
	fmt.Println("Deleting values")
	delete(m, "name")
	name, ok := m["name"]
	fmt.Println(name, ok)
}

3.2 Map的key

map使用哈希表,必須可以比較相等

除了Slice,map,function的內建類型都可以作為key

Struct類型不包含上述字段,也可作為key

3.3 Map的例題:尋找最長不含有重復字符的子串

/*
當前一個字符串,從左往后開始掃描,只要掃描一遍就可以,如果掃到X的位置,看到一個字母X應該怎么做呢
首先,記錄一個start表示當前找到的最長不含有重復字符的子串的開始,保證start到X之前的子串是不含有重復字符的,
之后,需要查看從start到X-1這個位置之間有沒有X,使用一個叫lastOccurred[x]記錄X最后出現的位置在哪里,使用map會有三種情況:1.x重來沒有出現過,或者x出現在start之前,若x出現在start之前,最長的子串+1; 2.lastOccurred[x]出現在start到X中間,更新start位置,start指向lastOccurred[x+1]的位置
*/
package main
import "fmt"
func lengthOfNonRepeatingSubStr(s string)int  {
	lastOccurred := make(map[byte]int)
	start := 0
	maxLength := 0
	//遍歷字符串 go語言中char類型是使用了一種rune(32位)類型
	for x, ch := range []byte(s){
		//lastOccurred[ch]有可能不存在;若不存在出現0,會影響運算
		if lastl, ok:= lastOccurred[ch];ok  lastl >= start{
			start = lastl + 1
		}
		//stat到i結束
		if x-start + 1 > maxLength{
			maxLength = x -start + 1
		}
		lastOccurred[ch] = x
	}
	return maxLength
}
func main() {
	fmt.Println(lengthOfNonRepeatingSubStr("hellohello"))
}

4.rune

rune相當于go的char

使用range遍歷pos,rune對

使用utf8.RuneCountlnString獲得字符數量

使用len獲得字節長度

使用[]byte獲得字節

package main
import (
	"fmt"
	"unicode/utf8"
)
func main() {
	//英文占一個字節,中文占三個字節
	s := "yes我愛CSDN!"
	fmt.Println(len(s)) // 14
	//%X十六進制,大寫字符,每個字節兩個字符
	//796573E68891E788B14353444E21
	fmt.Printf("%X\n",[]byte(s))
	//%T 相應值的類型
	//使用for range遍歷字符串時,會默認將byte(int8)類型轉化為rune(int32)類型,因為go采用UTF-8編碼 可變長的編碼
	for _,b := range s{
		fmt.Printf("%T %X\n",b,b)
	}
	for _,b := range []byte(s){
		fmt.Printf("%T %X\n",b,b)
	}
	//打印字符的個數
	fmt.Println("Rune count:",utf8.RuneCountInString(s))
	bytes := []byte(s)
	fmt.Println(bytes)
	for len(bytes) > 0{
		ch,size := utf8.DecodeRune(bytes)
		bytes = bytes[size:]
		//相應Unicode碼點所表示的字符
		fmt.Printf("%c",ch)
	}
	//獲取第幾個字符是誰
	for i, ch := range []rune(s) {
		fmt.Printf("(%d %c) ", i, ch)
	}
	fmt.Println()
}

4.1 Map的例題:尋找最長不含有重復字符的子串(國際版)

//國際版
func lengthOfNonRepeatingSubStr(s string) int {
	lastOccurred := make(map[rune]int)
	start := 0
	maxLength := 0
	//遍歷字符串 go語言中char類型是使用了一種rune(32位)
	//for i, ch := range s{
	for i, ch := range []rune(s) {
		//lastOccurred[ch]有可能不存在;若不存在出現0,會影響運算
		if lastI, ok := lastOccurred[ch]; ok  lastI >= start {
			start = lastI + 1
		}
		//start到i結束
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
	}
	return maxLength
}

補充:Golang 容器的學習與實踐

Golang 提供了幾個簡單的容器供我們使用,本文在介紹幾種 Golang 容器的基礎上,實現一個基于 Golang 容器的LRU算法。

容器介紹

Golang 容器位于 container 包下,提供了三種包供我們使用,heap、list、ring. 下面我們分別學習。

heap

heap 是一個堆的實現。一個堆正常保證了獲取/彈出最大(最小)元素的時間為log n、插入元素的時間為 log n.

Golang堆實現接口如下:

// src/container/heap.go
type Interface interface {
 sort.Interface
 Push(x interface{}) // add x as element Len()
 Pop() interface{} // remove and return element Len() - 1.
}

heap 是基于 sort.Interface 實現的。

// src/sort/
type Interface interface {
 Len() int
 Less(i, j int) bool
 Swap(i, j int)
}

因此,如果要使用官方提供的 heap,需要我們實現如下幾個接口:

Len() int {} // 獲取元素個數
Less(i, j int) bool  {} // 比較方法
Swap(i, j int) // 元素交換方法
Push(x interface{}){} // 在末尾追加元素
Pop() interface{} // 返回末尾元素

然后在使用時,我們可以使用如下幾種方法:

// 初始化一個堆
func Init(h Interface){}
// push一個元素倒堆中
func Push(h Interface, x interface{}){}
// pop 堆頂元素
func Pop(h Interface) interface{} {}
// 刪除堆中某個元素,時間復雜度 log n
func Remove(h Interface, i int) interface{} {}
// 調整i位置的元素位置(位置I的數據變更后)
func Fix(h Interface, i int){}

list 鏈表

list 實現了一個雙向鏈表,鏈表不需要實現 heap 類似的接口,可以直接使用。

鏈表的構造:

// 返回一個鏈表對象
  func New() *List {}

官方提供了豐富的方法供我們操作列表,方法如下:

// 返回鏈表的長度
func (l *List) Len() int {}
// 返回鏈表中的第一個元素
func (l *List) Front() *Element {}
// 返回鏈表中的末尾元素
func (l *List) Back() *Element {}
// 移除鏈表中的某個元素
func (l *List) Remove(e *Element) interface{} {}
// 在表頭插入值為 v 的元素
func (l *List) PushFront(v interface{}) *Element {}
// 在表尾插入值為 v 的元素
func (l *List) PushBack(v interface{}) *Element {}
// 在mark之前插入值為v 的元素
func (l *List) InsertBefore(v interface{}, mark *Element) *Element {}
// 在mark 之后插入值為 v 的元素
func (l *List) InsertAfter(v interface{}, mark *Element) lement {}
// 移動e某個元素到表頭
func (l *List) MoveToFront(e *Element) {}
// 移動e到隊尾
func (l *List) MoveToBack(e *Element) {}
// 移動e到mark之前
func (l *List) MoveBefore(e, mark *Element) {}
// 移動e 到mark 之后
func (l *List) MoveAfter(e, mark *Element) {}
// 追加到隊尾
func (l *List) PushBackList(other *List) {}
// 將鏈表list放在隊列前
func (l *List) PushFrontList(other *List) {}

我們可以通過 Value 方法訪問 Element 中的元素。除此之外,我們還可以用下面方法做鏈表遍歷:

// 返回下一個元素
func (e *Element) Next() *Element {}
// 返回上一個元素
func (e *Element) Prev() *Element {}
下面是隊列的遍歷的例子:
// l 為隊列,
for e := l.Front(); e != nil; e = e.Next() {
  //通過 e.Value 做數據訪問
}

ring 循環列表

container 中的循環列表是采用鏈表實現的。

// 構造一個包含N個元素的循環列表
func New(n int) *Ring {}
// 返回列表下一個元素
func (r *Ring) Next() *Ring {}
// 返回列表上一個元素
func (r *Ring) Prev() *Ring {}
// 移動n個元素 (可以前移,可以后移)
func (r *Ring) Move(n int) *Ring {}
// 把 s 鏈接到 r 后面。如果s 和r 在一個ring 里面,會把r到s的元素從ring 中刪掉
func (r *Ring) Link(s *Ring) *Ring {}
// 刪除n個元素 (內部就是ring 移動n個元素,然后調用Link)
func (r *Ring) Unlink(n int) *Ring {}
// 返回Ring 的長度,時間復雜度 n
func (r *Ring) Len() int {}
// 遍歷Ring,執行 f 方法 (不建議內部修改ring)
func (r *Ring) Do(f func(interface{})) {}

訪問 Ring 中元素,直接 Ring.Value 即可。

容器的使用

下面,我們通過 map 和 官方包中的雙向鏈表實現一個簡單的 lru 算法,用來熟悉golang 容器的使用。

LRU 算法 (Least Recently Used),在做緩存置換時用的比較多。逐步淘汰最近未使用的 cache,而使我們的緩存中持續保持著最近使用的數據。

package main 
import "fmt"
import "container/list"
 
// lru 中的數據
type Node struct {
  K, V interface{}
}
 
// 鏈表 + map
type LRU struct {
  list *list.List
  cacheMap map[interface{}]*list.Element
  Size int
}
 
// 初始化一個LRU
func NewLRU(cap int) *LRU {
  return LRU{
    Size: cap,
    list: list.New(),
    cacheMap: make(map[interface{}]*list.Element, cap),
  }
}
 
// 獲取LRU中數據
func (lru *LRU) Get(k interface{}) (v interface{}, ret bool) {
  // 如果存在,則把數據放到鏈表最前面
  if ele, ok := lru.cacheMap[k]; ok {
    lru.list.MoveToFront(ele)
    return ele.Value.(*Node).V, true
  }
  return nil, false
}
// 設置LRU中數據
func (lru *LRU) Set(k, v interface{}) {
  // 如果存在,則把數據放到最前面
  if ele, ok := lru.cacheMap[k]; ok {
    lru.list.MoveToFront(ele)
    ele.Value.(*Node).V = v // 更新數據值
    return
  }
  // 如果數據是滿的,先刪除數據,后插入
  if lru.list.Len() == lru.Size {
    last := lru.list.Back()
    node := last.Value.(*Node)
    delete(lru.cacheMap, node.K)
    lru.list.Remove(last)
  }  ele := lru.list.PushFront(Node{K: k, V: v})
  lru.cacheMap[k] = ele
}

注意事項

上述的容器都不是 goroutines 安全的

1、上面的lr 也不是 goroutines 安全的

2、Ring 中不建議在 Do 方法中修改 Ring 的指針,行為是未定義的

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang中switch語句和select語句的用法教程
  • Golang 編譯成DLL文件的操作
  • golang調用c實現的dll接口細節分享
  • Golang如何調用windows下的dll動態庫中的函數
  • golang實踐-第三方包為私有庫的配置方案
  • 完美解決golang go get私有倉庫的問題
  • golang gopm get -g -v 無法獲取第三方庫的解決方案
  • golang switch語句的靈活寫法介紹

標簽:銅川 欽州 重慶 吐魯番 蘭州 梅河口 雞西 汕頭

巨人網絡通訊聲明:本文標題《Golang: 內建容器的用法》,本文關鍵詞  Golang,內建,容器,的,用法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang: 內建容器的用法》相關的同類信息!
  • 本頁收集關于Golang: 內建容器的用法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲综合色区另类av| 成人短视频下载| 亚洲视频你懂的| 在线亚洲一区观看| 日本欧洲一区二区| 亚洲欧美视频一区| 国产视频一区不卡| 欧美疯狂性受xxxxx喷水图片| 精品一区二区三区久久| 亚洲自拍都市欧美小说| 亚洲欧美日韩国产综合在线| 欧美久久一二区| 色中色一区二区| 丁香网亚洲国际| 国产精品白丝jk白祙喷水网站| 麻豆精品一区二区三区| 亚洲一区二区三区四区五区中文| 色噜噜久久综合| 日日夜夜免费精品| 天堂一区二区在线| 亚洲综合视频网| 一区二区三区免费| 一区二区三国产精华液| 一区二区三区免费看视频| 一区二区三区在线观看国产| 亚洲毛片av在线| 一区二区三区日韩| 天堂蜜桃91精品| 久久机这里只有精品| 免费观看日韩电影| 美女脱光内衣内裤视频久久影院| 舔着乳尖日韩一区| 日韩精品一级二级 | 中文字幕一区二区三区精华液| 久久久亚洲国产美女国产盗摄| 久久午夜羞羞影院免费观看| 国产午夜精品一区二区| 国产精品午夜电影| 亚洲激情自拍视频| 日本aⅴ免费视频一区二区三区| 另类小说色综合网站| 国产高清不卡一区| 91麻豆精品视频| 中文字幕字幕中文在线中不卡视频| 亚洲人成人一区二区在线观看| 亚洲制服丝袜一区| 久久国产人妖系列| 成人激情免费视频| 欧美午夜宅男影院| 久久麻豆一区二区| 亚洲猫色日本管| 男人的天堂亚洲一区| 国产精品原创巨作av| 欧美亚洲图片小说| 国产欧美日韩在线| 亚洲成av人在线观看| 国产九色sp调教91| 欧美日韩亚州综合| 中文字幕av一区 二区| 日韩中文字幕一区二区三区| 成人免费视频一区| 91精品久久久久久久久99蜜臂| 中文在线资源观看网站视频免费不卡 | 欧美在线free| 精品乱码亚洲一区二区不卡| 亚洲视频你懂的| 精品综合免费视频观看| 欧美日韩一区高清| 1000部国产精品成人观看| 蜜臀av在线播放一区二区三区| 色婷婷av久久久久久久| 久久精品在这里| 青娱乐精品在线视频| 欧美专区亚洲专区| 亚洲私人黄色宅男| 成人高清伦理免费影院在线观看| 欧美α欧美αv大片| 日日摸夜夜添夜夜添亚洲女人| 91免费视频观看| 国产精品视频看| 国产在线日韩欧美| 欧美一区二视频| 亚洲电影你懂得| 色94色欧美sute亚洲线路一久 | 亚洲男人电影天堂| 成人h精品动漫一区二区三区| 久久亚洲综合色一区二区三区| 日韩高清在线电影| 欧美日韩精品一二三区| 一区二区久久久| 欧美曰成人黄网| 亚洲综合在线免费观看| 91美女片黄在线观看| 亚洲欧洲精品一区二区精品久久久| 丁香天五香天堂综合| 26uuu亚洲婷婷狠狠天堂| 蜜桃视频在线观看一区| 日韩欧美国产电影| 极品尤物av久久免费看| 777a∨成人精品桃花网| 无码av中文一区二区三区桃花岛| 91福利在线免费观看| 亚洲欧美日韩人成在线播放| 91浏览器在线视频| 亚洲精品久久久蜜桃| 91在线高清观看| 伊人色综合久久天天| 在线观看一区不卡| 亚洲六月丁香色婷婷综合久久 | 日韩久久精品一区| 激情偷乱视频一区二区三区| 日韩三级视频在线看| 国产一区日韩二区欧美三区| www亚洲一区| 粉嫩av一区二区三区在线播放| 国产精品国产精品国产专区不片| 91色综合久久久久婷婷| 亚洲精品一卡二卡| 欧美另类videos死尸| 韩国女主播成人在线| 日本一区二区综合亚洲| 97国产精品videossex| 亚洲一区二区综合| 日韩欧美高清一区| 福利一区二区在线观看| 一区二区三区高清| 欧美一区二区三区电影| 国产成人在线看| 亚洲aaa精品| 国产清纯美女被跳蛋高潮一区二区久久w| 99re热视频这里只精品| 日本美女一区二区三区视频| 国产日韩欧美精品一区| 欧美性高清videossexo| 韩国三级中文字幕hd久久精品| 亚洲免费观看视频| 日韩一区二区三区av| 97久久超碰精品国产| 久久国产视频网| 亚洲免费色视频| 欧美国产精品中文字幕| 91精品国产综合久久久久| 成人黄色国产精品网站大全在线免费观看 | 日本欧美一区二区三区| 国产女人18毛片水真多成人如厕| 欧美另类z0zxhd电影| 91香蕉国产在线观看软件| 麻豆精品视频在线观看视频| 亚洲婷婷综合久久一本伊一区| 日韩精品一区在线| 欧美日韩亚洲国产综合| 色偷偷久久人人79超碰人人澡| 国产一区欧美一区| 奇米色一区二区| 亚洲国产成人av网| 亚洲视频在线一区二区| 国产亚洲污的网站| 日韩欧美国产一区二区在线播放| 91久久精品网| 成人黄色av电影| 成人免费精品视频| 国产一区二区毛片| 免费观看成人av| 五月开心婷婷久久| 亚洲第一成年网| 伊人色综合久久天天| 一区二区久久久久久| 亚洲美女免费视频| 亚洲久草在线视频| 一区二区三区四区中文字幕| 国产精品成人免费精品自在线观看| 久久久av毛片精品| 久久久久高清精品| 久久精品网站免费观看| 久久久亚洲精品一区二区三区| 精品国产一区二区三区av性色| 日韩欧美专区在线| 欧美zozo另类异族| 久久精品一区八戒影视| 日本一区二区动态图| 国产精品欧美一区二区三区| 欧美国产日韩a欧美在线观看| 成人欧美一区二区三区黑人麻豆 | 成人激情午夜影院| 成人精品视频一区二区三区尤物| 国产成人av电影在线| 成人免费的视频| 99国产欧美另类久久久精品| 99精品1区2区| 欧美日本在线一区| 欧美一区三区二区| 久久蜜桃av一区二区天堂| 欧美激情一二三区| 一区二区三区在线不卡| 日日摸夜夜添夜夜添亚洲女人| 精品一区二区日韩| 成人短视频下载| 欧美三片在线视频观看| 日韩视频免费观看高清完整版在线观看 | 337p日本欧洲亚洲大胆精品|