国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 語言的演化歷程

開發 前端
本文來自Google的Golang語言設計者之一Rob Pike大神在GopherCon2014大會上的開幕主題演講資料“Hello, Gophers!”。Rob大神在這次分 享中用了兩個生動的例子講述了Golang的演化歷程,總結了Golang到目前為止的成功因素,值得廣大Golang Programmer & Beginner學習和了解。這里也用了”Golang的演化歷程”作為標題。

本文來自Google的Golang語言設計者之一Rob Pike大神在GopherCon2014大會上的開幕主題演講資料“Hello, Gophers!”。Rob大神在這次分 享中用了兩個生動的例子講述了Golang的演化歷程,總結了Golang到目前為止的成功因素,值得廣大Golang Programmer & Beginner學習和了解。這里也用了”Golang的演化歷程”作為標題。

1、Hello Gophers!

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. func main() { 
  6.     fmt.Printf("Hello, gophers!\n"

Rob大神的見面禮,后續會有針對這段的演化歷史的陳述。

2、歷史

這是一個歷史性的時刻。

Golang已經獲得了一定的成功,值得擁有屬于自己的技術大會。

3、成功

促成這份成功的因素有許多:

– 功能

– 缺少的功能

– 功能的組合

– 設計

– 人

– 時間

4、案例學習:兩段程序

我們來近距離回顧兩段程序。

***個是你見過的***個Go程序,是屬于你的歷史時刻。

第二個是我們見過的***個Go程序,是屬于全世界所有Gophers的歷史時刻。

先看***個“hello, world”

5、hello.b

  1. main( ) { 
  2.     extrn a, b, c; 
  3.     putchar(a); putchar(b); putchar(c); putchar('!*n'); 
  4. 'hell'
  5. 'o, w'
  6. 'orld'

上面這段代碼首先出現在1972年Brian W. Kernighan的B語言教程中(也有另外一說是出現在那之前的BCPL語言中)。

6、hello.c

  1. main() 
  2.     printf("hello, world"); 

上面這段代碼出現在1974年Brian W. Kernighan編寫的《Programming in C: A Tutorial》中。這份教程當時是作為Unix v5文檔的一部分。

7、hello.c

  1. main() 
  2.     printf("hello, world\n"); //譯注:與上面的hello.c相比,多了個換行符\n輸出 

這段代碼***出現在1978年Brian W. Kernighan和Dennis M. Ritchie合著的《The C Programming Language》一書中。

8、hello.c, 標準C草案

  1. #include <stdio.h> //譯注:與上面hello.c相比, 多了這個頭文件包含 
  2.   
  3. main() 
  4.     printf("hello, world\n"); 

這段代碼出現在1988年Brian W. Kernighan和Dennis M. Ritchie合著的《The C Programming Language》第二版一書中,基于標準C草案。

9、hello.c,標準C89

  1. #include <stdio.h> 
  2.   
  3. main(void//譯注:與上面hello.c相比,多了個void 
  4.     printf("hello, world\n"); 

這段代碼出現在1988年Brian W. Kernighan和Dennis M. Ritchie合著的《The C Programming Language》第二版第二次修訂中。

10、一兩代之后…

(省略所有中間語言)

關于Golang的討論開始于2007年年末。

***版語言規范起草于2008年3月份。

用于實驗和原型目的的編譯器開發工作已經展開。

最初的編譯器輸出的是C代碼。

語言規范一形成,我們就重寫了編譯器,輸出本地代碼(機器碼)。

#p#

11、hello.go, 2008年6月6日

  1. package main 
  2.   
  3. func main() int { 
  4.     print "hello, world\n"
  5.     return 0; 

12、hello.go,2008年6月27日

  1. package main 
  2.   
  3. func main() { 
  4.     print "hello, world\n"

當main函數返回,程序調用exit(0)。

13、hello.go,2008年8月11日

  1. package main 
  2.   
  3. func main() { 
  4.     print("hello, world\n"); 

print調用加上了括號,這時print是一個函數,不再是一個原語。

14、hello.go,2008年10月24日

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. func main() { 
  6.     fmt.printf("hello, world\n"); 

我們熟知并喜歡的printf來了。

15、hello.go,2009年1月15日

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. func main() { 
  6.     fmt.Printf("hello, world\n"); 

頭母大寫的函數名用作才是導出的符號。

16、hello.go, 2009年12約11日

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. func main() { 
  6.     fmt.Printf("hello, world\n"

不再需要分號。

這是在2009年11月10日Golang開發發布后的一次重要改變。

這也是當前版本的hello, world

我們花了些時間到達這里(32年!)

都是歷史了!

17、不僅僅有C

我們從”C”開始,但Go與C相比有著巨大的不同。

其他一些語言影響和貫穿于Go的設計當中。

C: 語句和表達式語法

Pascal: 聲明語法

Modula 2, Oberon 2:包

CSP, Occam, Newsqueak, Limbo, Alef: 并發

BCPL: 分號規則

Smalltalk: 方法(method)

Newsqueak: <-, :=

APL: iota

等等。也有一些是全新發明的,例如defer、常量。

還有一些來自其他語言的優點和缺點:

C++, C#, Java, JavaScript, LISP, Python, Scala, …

18、hello.go,Go 1版

將我們帶到了今天。

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. func main() { 
  6.     fmt.Println("Hello, Gophers (some of whom know 中文)!"

我們來深入挖掘一下,把這段代碼做一個拆解。

19、Hello, World的16個tokens

  1. package 
  2. main 
  3. import 
  4. "fmt" 
  5. func 
  6. main 
  7. fmt 
  8. Println 
  9. "Hello, Gophers (some of whom know 中文)!" 

20、package

早期設計討論的主要話題:擴展性的關鍵

package是什么?來自Modula-2等語言的idea

為什么是package?

– 擁有編譯構建所需的全部信息

– 沒有循環依賴(import)

– 沒有子包

– 包名與包路徑分離

– 包級別可見性,而不是類型級別

– 在包內部,你擁有整個語言,在包外部,你只擁有包許可的東西。

#p#

21、main

一個C語言遺留風范盡顯之處

最初是Main,原因記不得了。

主要的包,main函數

很特別,因為它是初始化樹(initialization tree)的根(root)。

22、import

一種加載包的機制

通過編譯器實現(有別于文本預處理器。譯注:C語言的include是通過preprocessor實現的)

努力使其高效且線性

導入的一個包,而不是一個標識符(identifiers)集合(譯注:C語言的include是將頭文件里的標識符集合引入)

至于export,它曾經是一個關鍵字。

23、”fmt”

包路徑(package path)只是一個字符串,并非標識符的列表。

讓語言避免定義它的含義 – 適應性。(Allows the language to avoid defining what it means—adaptability)

從一開始就想要一個URL作為一個選項。(譯注:類似import “github.com/go/tools/xxx)

可以應付將來的發展。

24、func

一個關鍵字,用于引入函數(類型、變量、常量),易于編譯器解析。

對于函數字面量(閉包)而言,易于解析非常重要。

順便說一下,最初這個關鍵字不是func,而是function。

小插曲:

Mail thread from February 6, 2008

From: Ken Thompson <ken@google.com>

To: gri, r

larry and sergey came by tonight. we 
talked about go for more than an hour. 
they both said they liked it very much.

p.s. one of larrys comments was “why isnt function spelled func?”

From: Rob Pike <r@google.com>

To: ken, gri

fine with me. seems compatible with ‘var’.

anyway we can always say, “larry said to call it ‘func’”

25、main

程序執行的起點。除非它不是。(譯注:main不是起點,rob大神的意思是不是指下列情形,比如go test測試包,在google app engine上的go程序不需要main)

將初始化與正常執行分離,早期計劃之中的。

初始化在哪里發生的?(譯注:說的是package內的func init() {..}函數吧)

回到包設計。(譯注:重溫golang的package設計思想)

26、()

看看,沒有void

main沒有返回值,由運行時來處理main的返回后的事情。

沒有函數參數(命令行選項通過os包獲取)

沒有返回值

返回值以及語法

27、{

用的是大括號,而不是空格(譯注:估計是與python的空格縮進對比)

同樣也不是方括號。

為什么在括號后放置換行符(newline)?

28、fmt

所有導入的標識符均限定于其導入的包。(All imported identifiers are qualified by their import.)

每個標識符要么是包或函數的本地變量,要么被類型或導入包限定。

對代碼可讀性的重大影響。

為什么是fmt,而不是format?

29、.

句號token在Go中有多少使用?(很多)

a.B的含義需要使用到類型系統

但這對于人類來說非常清晰,讀起來也非常容易。

針對指針的自動轉換(沒有->)。

30、Println

Println,不是println,頭母大寫才是導出符號。

知道它是反射驅動的(reflection-driven)

可變參數函數

參數類型是(…); 2010年2月1日變成(…interface{})

#p#

31、(

傳統函數語法

32、”Hello, Gophers (some of whom know 中文)!”

UTF-8編碼的源碼輸入。字符串字面量也自動是utf8編碼格式的。

但什么是字符串(string)呢?

首批寫入規范的語法規則,今天很難改變了。(blog.golang.org/strings)

33、)

沒有分號

在go發布后不久我們就去除了分號

早期曾胡鬧地嘗試將它們(譯注:指得是括號)去掉

最終接受了BCPL的方案

34、}

***輪結束。

旁白:還沒有討論到的

– 類型

– 常量

– 方法

– interface

– 庫

– 內存管理

– 并發(接下來將討論)

外加工具,生態系統,社區等。

語言是核心,但也只是我們故事的一部分。

35、成功

要素:

– 站在巨人的肩膀上(building on history)

– 經驗之作(building on experience) 譯注:最初的三個神級語言設計者

– 設計過程

– 早期idea提煉到最終的方案中

– 由一個小團隊專門集中精力做

最終:承諾

Go 1.0鎖定了語言核心與標準庫。

36、另一輪

讓我們看第二個程序的類似演化過程。

37、問題:素數篩(Prime sieve)

問題來自于Communicating Sequential Processes, by C. A. R. Hoare, 1978。

“問題:以升序打印所有小于10000的素數。使用一個process數組:SIEVE,其中每個process從其前驅元素輸入一個素數并打印 它。接下 來這個process從其前驅元素接收到一個升序數字流并將它們傳給其后繼元素,這個過程會剔除掉所有是最初素數整數倍的數字。

38、解決方案

在1978年的CSP論文中。(注意不是Eratosthenes篩)

這個優美的方案是由David Gries貢獻出來的。

39、CSP

在Hoare的CSP論文中:

  1. [SIEVE(i:1..100):: 
  2.     p,mp:integer; 
  3.     SIEVE(i - 1)?p; 
  4.     print!p; 
  5.     mp := p; comment mp is a multiple of p; 
  6. *[m:integer; SIEVE(i - 1)?m → 
  7.     *[m > mp → mp := mp + p]; 
  8.     [m = mp → skip 
  9.     ||m < mp → SIEVE(i + 1)!m 
  10. ]   ] 
  11. ||SIEVE(0)::print!2; n:integer; n := 3; 
  12.     *[n < 10000 → SIEVE(1)!n; n := n + 2] 
  13. ||SIEVE(101)::*[n:integer;SIEVE(100)?n → print!n] 
  14. ||print::*[(i:0..101) n:integer; SIEVE(i)?n → ...] 

沒有channel。能處理的素數的個數是在程序中指定的。

40、Newsqueak

circa 1988。

Rob Pike語言設計,Tom Cargill和Doug McIlroy實現。

使用了channels,這樣個數是可編程的。(channel這個idea從何而來?)

  1. counter:=prog(end: int, c: chan of int
  2.     i:int
  3.     for(i=2; i<end; i++) 
  4.         c<-=i; 
  5. }; 
  6.   
  7. filter:=prog(prime: int, listen: chan of int, send: chan of int
  8.     i:int
  9.     for(;;) 
  10.         if((i=<-listen)%prime) 
  11.             send<-=i; 
  12. }; 
  13.   
  14. sieve:=prog(c: chan of int
  15.     for(;;){ 
  16.         prime:=<-c; 
  17.         print(prime, " "); 
  18.         newc:=mk(chan of int); 
  19.         begin filter(prime, c, newc); 
  20.         c=newc; 
  21.     } 
  22. }; 
  23.   
  24. count:=mk(chan of int); 
  25.   
  26. begin counter(10000, count); 
  27. begin sieve(count); 
  28. ""

#p#

41、sieve.go,2008年3月5日

使用go規范編寫的***個版本,可能是第二個由go編寫的重要程序。

>用于發送;<用于接收。Channel是指針。Main是頭字母大寫的。

  1. package Main 
  2.   
  3. // Send the sequence 2, 3, 4, … to channel 'ch'. 
  4. func Generate(ch *chan> int) { 
  5.     for i := 2; ; i++ { 
  6.         >ch = i;    // Send 'i' to channel 'ch'. 
  7.     } 
  8.   
  9. // Copy the values from channel 'in' to channel 'out', 
  10. // removing those divisible by 'prime'. 
  11. func Filter(in *chan< int, out *chan> int, prime int) { 
  12.     for ; ; { 
  13.         i := <in;    // Receive value of new variable 'i' from 'in'. 
  14.         if i % prime != 0 { 
  15.             >out = i;    // Send 'i' to channel 'out'. 
  16.         } 
  17.     } 
  18.   
  19. // The prime sieve: Daisy-chain Filter processes together. 
  20. func Sieve() { 
  21.     ch := new(chan int);  // Create a new channel. 
  22.     go Generate(ch);      // Start Generate() as a subprocess. 
  23.     for ; ; { 
  24.         prime := <ch; 
  25.         printf("%d\n", prime); 
  26.         ch1 := new(chan int); 
  27.         go Filter(ch, ch1, prime); 
  28.         ch = ch1; 
  29.     } 
  30.   
  31. func Main() { 
  32.     Sieve(); 

42. sieve.go,2008年7月22日

-<用于發送;-<用于接收。Channel仍然是指針。但現在main不是大寫字母開頭的了。

  1. package main 
  2.   
  3. // Send the sequence 2, 3, 4, … to channel 'ch'. 
  4. func Generate(ch *chan-< int) { 
  5.     for i := 2; ; i++ { 
  6.         ch -< i    // Send 'i' to channel 'ch'. 
  7.     } 
  8.   
  9. // Copy the values from channel 'in' to channel 'out', 
  10. // removing those divisible by 'prime'. 
  11. func Filter(in *chan<- int, out *chan-< int, prime int) { 
  12.     for { 
  13.         i := <-in;    // Receive value of new variable 'i' from 'in'. 
  14.         if i % prime != 0 { 
  15.             out -< i    // Send 'i' to channel 'out'. 
  16.         } 
  17.     } 
  18.   
  19. // The prime sieve: Daisy-chain Filter processes together. 
  20. func Sieve() { 
  21.     ch := new(chan int);  // Create a new channel. 
  22.     go Generate(ch);      // Start Generate() as a subprocess. 
  23.     for { 
  24.         prime := <-ch; 
  25.         printf("%d\n",    prime); 
  26.         ch1 := new(chan int); 
  27.         go Filter(ch, ch1, prime); 
  28.         ch = ch1 
  29.     } 
  30.   
  31. func main() { 
  32.     Sieve() 

43、sieve.go,2008年9月17日

通信操作符現在是<-。channel仍然是指針。

  1. package main 
  2.   
  3. // Send the sequence 2, 3, 4, … to channel 'ch'. 
  4. func Generate(ch *chan <- int) { 
  5.     for i := 2; ; i++ { 
  6.         ch <- i  // Send 'i' to channel 'ch'. 
  7.     } 
  8.   
  9. // Copy the values from channel 'in' to channel 'out', 
  10. // removing those divisible by 'prime'. 
  11. func Filter(in *chan <- int, out *<-chan int, prime int) { 
  12.     for { 
  13.         i := <-in;  // Receive value of new variable 'i' from 'in'. 
  14.         if i % prime != 0 { 
  15.             out <- i  // Send 'i' to channel 'out'. 
  16.         } 
  17.     } 
  18.   
  19. // The prime sieve: Daisy-chain Filter processes together. 
  20. func Sieve() { 
  21.     ch := new(chan int);  // Create a new channel. 
  22.     go Generate(ch);      // Start Generate() as a subprocess. 
  23.     for { 
  24.         prime := <-ch; 
  25.         print(prime, "\n"); 
  26.         ch1 := new(chan int); 
  27.         go Filter(ch, ch1, prime); 
  28.         ch = ch1 
  29.     } 
  30.   
  31. func main() { 
  32.     Sieve() 

44、sieve.go,2009年1月6日

引入了make內置操作符。沒有指針。編碼錯誤!(有個*被留下了,錯誤的參數類型)

  1. package main 
  2.   
  3. // Send the sequence 2, 3, 4, … to channel 'ch'. 
  4. func Generate(ch chan <- int) { 
  5.     for i := 2; ; i++ { 
  6.         ch <- i  // Send 'i' to channel 'ch'. 
  7.     } 
  8.   
  9. // Copy the values from channel 'in' to channel 'out', 
  10. // removing those divisible by 'prime'. 
  11. func Filter(in chan <- int, out *<-chan int, prime int) { 
  12.     for { 
  13.         i := <-in;  // Receive value of new variable 'i' from 'in'. 
  14.         if i % prime != 0 { 
  15.             out <- i  // Send 'i' to channel 'out'. 
  16.         } 
  17.     } 
  18.   
  19. // The prime sieve: Daisy-chain Filter processes together. 
  20. func Sieve() { 
  21.     ch := make(chan int);  // Create a new channel. 
  22.     go Generate(ch);       // Start Generate() as a subprocess. 
  23.     for { 
  24.         prime := <-ch; 
  25.         print(prime, "\n"); 
  26.         ch1 := make(chan int); 
  27.         go Filter(ch, ch1, prime); 
  28.         ch = ch1 
  29.     } 
  30.   
  31. func main() { 
  32.     Sieve() 

45、sieve.go,2009年9月25日

***個正確的現代版本。同樣,大寫頭母不見了,使用了fmt。

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. // Send the sequence 2, 3, 4, … to channel 'ch'. 
  6. func generate(ch chan<- int) { 
  7.     for i := 2; ; i++ { 
  8.         ch <- i;    // Send 'i' to channel 'ch'. 
  9.     } 
  10.   
  11. // Copy the values from channel 'in' to channel 'out', 
  12. // removing those divisible by 'prime'. 
  13. func filter(src <-chan int, dst chan<- int, prime int) { 
  14.     for i := range src {    // Loop over values received from 'src'. 
  15.         if i%prime != 0 { 
  16.             dst <- i;    // Send 'i' to channel 'dst'. 
  17.         } 
  18.     } 
  19.   
  20. // The prime sieve: Daisy-chain filter processes together. 
  21. func sieve() { 
  22.     ch := make(chan int);  // Create a new channel. 
  23.     go generate(ch);       // Start generate() as a subprocess. 
  24.     for { 
  25.         prime := <-ch; 
  26.         fmt.Print(prime, "\n"); 
  27.         ch1 := make(chan int); 
  28.         go filter(ch, ch1, prime); 
  29.         ch = ch1; 
  30.     } 
  31.   
  32. func main() { 
  33.     sieve(); 

46、sieve.go,2009年12月10日

分號不見了。程序已經與現在一致了。

  1. package main 
  2.   
  3. import "fmt" 
  4.   
  5. // Send the sequence 2, 3, 4, … to channel 'ch'. 
  6. func generate(ch chan<- int) { 
  7.     for i := 2; ; i++ { 
  8.         ch <- i  // Send 'i' to channel 'ch'. 
  9.     } 
  10.   
  11. // Copy the values from channel 'src' to channel 'dst', 
  12. // removing those divisible by 'prime'. 
  13. func filter(src <-chan int, dst chan<- int, prime int) { 
  14.     for i := range src {  // Loop over values received from 'src'. 
  15.         if i%prime != 0 { 
  16.             dst <- i  // Send 'i' to channel 'dst'. 
  17.         } 
  18.     } 
  19.   
  20. // The prime sieve: Daisy-chain filter processes together. 
  21. func sieve() { 
  22.     ch := make(chan int)  // Create a new channel. 
  23.     go generate(ch)       // Start generate() as a subprocess. 
  24.     for { 
  25.         prime := <-ch 
  26.         fmt.Print(prime, "\n"
  27.         ch1 := make(chan int
  28.         go filter(ch, ch1, prime) 
  29.         ch = ch1 
  30.     } 
  31.   
  32. func main() { 
  33.     sieve() 

這個優美的方案來自于幾十年的設計過程。

47、旁邊,沒有討論到的

select

真實并發程序的核心連接器(connector)

最初起源于Dijkstra的守衛命令(guarded command)

在Hoare的CSP理論實現真正并發。

經過Newsqueak、Alef、Limbo和其他語言改良后

2008年3月26日出現在Go版本中。

簡單,澄清,語法方面的考慮。

48、穩定性

Sieve程序自從2009年末就再未改變過。– 穩定!

開源系統并不總是兼容和穩定的。

但,Go是。(兼容和穩定的)

這是Go成功的一個重要原因。

49、趨勢

圖數據展示了Go 1.0發布后Go語言的爆發。

50、成功

Go成功的元素:

顯然的:功能和工具。

* 并發

* 垃圾回收

* 高效的實現

* 給人以動態類型體驗的靜態類型系統

* 豐富但規模有限的標準庫

* 工具化

* gofmt

* 在大規模系統中的應用

不那么顯然的:過程

* 始終聚焦最初的目標

* 在凍結后的集中開發

* 小核心團隊易于取得一致

* 社區的重要貢獻

* 豐富的生態系統

總之,開源社區共享了我們的使命,聚焦于為當今的世界設計一門語言。

原文出處:tonybai.com

責任編輯:張偉 來源: 開源中國社區
相關推薦

2023-05-31 18:58:16

得物人事系統時間軸

2010-03-10 18:12:50

Python編程語言

2012-03-07 11:25:58

編程語言

2024-04-26 08:17:09

GoGoogle項目

2012-10-08 09:25:59

GoGo語言開發語言

2018-03-12 22:13:46

GO語言編程軟件

2021-11-29 00:18:30

Redis分布式

2011-11-16 09:00:39

編程語言

2023-12-30 10:22:57

Go語言函數開發

2024-05-13 10:54:39

UML系統SysML

2023-12-21 07:09:32

Go語言任務

2021-07-30 07:28:15

WorkerPoolGo語言

2021-04-07 09:02:49

Go 語言變量與常量

2011-01-05 10:58:05

Google Go

2021-04-13 07:58:42

Go語言函數

2023-06-26 00:03:55

Go語言類型

2013-05-28 09:43:38

GoGo語言并發模式

2022-02-09 16:02:26

Go 語言ArraySlice

2019-02-11 08:32:22

編程語言Go

2021-07-15 23:18:48

Go語言并發
點贊
收藏

51CTO技術棧公眾號

亚洲综合自拍一区| 国产区二精品视| rebdb初裸写真在线观看| 国产亚洲成年网址在线观看| 日韩久久久久久久| 亚洲欧美伊人| 亚洲一区二区三区视频播放| 国产成人调教视频在线观看| 欧美黄色三级网站| 国产精品igao视频网网址不卡日韩 | 成人天堂入口网站| 国产欧美日韩久久| 自拍偷拍21p| 亚洲欧洲日韩一区二区三区| www.这里只有精品| 中文字幕av在线一区二区三区| 欧美变态另类刺激| 久久久久久久久久美女| 美女福利视频在线| 久久久www成人免费毛片麻豆| 男人日女人下面视频| 成人免费高清视频| 成人黄色一区二区| 超碰成人久久| 欧美主播福利视频| 亚州福利视频| 老汉色老汉首页av亚洲| 亚洲一区欧美二区| 亚洲同性同志一二三专区| 国模娜娜一区二区三区| 日韩午夜在线观看视频| 在线观看免费黄色| 欧美日韩成人一区| 黄页网站大全在线免费观看| 337p亚洲精品色噜噜狠狠| 国内小视频在线看| 一区二区欧美激情| 五月天色综合| 欧美夫妻性生活视频| 九九久久成人| 国产在线欧美日韩| 国产91露脸合集magnet| 成人免费无码av| 亚洲国产精品麻豆| h视频在线播放| 亚洲精美色品网站| 日韩高清二区| 亚洲综合视频1区| 日韩电影在线一区| 欧美一级黄色影院| 在线免费观看不卡av| 天堂网在线最新版www中文网| 欧美巨乳美女视频| 欧美日一区二区三区在线观看国产免| 相泽南亚洲一区二区在线播放| 成人综合婷婷国产精品久久| 国产私人影院| 精品国产sm最大网站| 日韩一区二区三区精品| 成人区精品一区二区| 国产乱一区二区| 全部孕妇毛片丰满孕妇孕| 欧美日本在线观看| 香港久久久电影| 国产欧美日韩亚洲| 久久影院午夜片一区| 日本在线免费| 久久免费成人精品视频| 久久久国产精品一区二区中文| 成人性视频欧美一区二区三区| 91福利视频久久久久| 看片一区二区| 亚洲japanese制服美女| av一二三不卡影片| 8888四色奇米在线观看| 欧美激情网友自拍| 秋霞电影一区二区| 四虎精品成人影院观看地址| 色777狠狠综合秋免鲁丝 | 日韩精品中文字幕一区二区三区| 亚洲国产欧美国产第一区| 国产一区喷水| 国产日韩欧美一区二区三区综合| 婷婷五月在线视频| 日本不卡免费高清视频| 国产精品88av| 在线观看精品一区二区三区| 久久琪琪电影院| 精品无人码麻豆乱码1区2区 | 亚洲三级欧美| 亚洲综合一区二区不卡| 国产精品色噜噜| 91精品论坛| 久久一区免费| 亚洲福利视频导航| 国产亚洲观看| 吴梦梦av在线| 91精品国产乱码| 久久久国产精品| 成人免费视频77777| 最近免费中文字幕视频2019| 久久尤物视频| 北岛玲一区二区三区| 国产狼人综合免费视频| 亚洲欧美一区二区在线观看| 亚洲国产综合在线观看| 欧美另类videos| 欧美α欧美αv大片| 精久久久久久| 黄色片在线播放| 国产欧美日韩中文字幕在线| 中文字幕在线观看不卡| 一区二区三区四区精品视频| 久久久久久久久久久99| 亚洲热线99精品视频| 免费不卡在线观看| 欧美一卡二卡| 性欧美.com| 亚洲大胆人体视频| 老牛嫩草一区二区三区日本| 日本中文字幕视频在线| 精品日本一区二区三区在线观看| 在线免费观看一区| 亚洲夜间福利| 成人激情电影在线看| 国产视频在线观看一区| 欧美日韩国产一二三| 一本色道久久综合亚洲精品不卡 | 日韩女优中文字幕| 欧美一二三区精品| 久久午夜影视| caoporn视频在线| 一本—道久久a久久精品蜜桃| 欧美大黄免费观看| 精品一区二区在线看| 性欧美videohd高精| 男女私大尺度视频| 久久亚洲精品中文字幕冲田杏梨 | 欧洲亚洲视频| 最近最好的中文字幕2019免费| 2019中文字幕在线| 一区二区三区精品在线观看| 精品国产乱码| 国产在线一在线二| 日韩精品福利视频| 国产亚洲精品久久久久久牛牛| 国产剧情av麻豆香蕉精品| 亚洲天堂av影院| 中国丰满人妻videoshd| 另类图片亚洲另类| 亚洲欧美一区二区三区国产精品| 天天躁日日躁成人字幕aⅴ| 少妇免费视频| 国产精品日韩一区二区免费视频| 日韩三级电影网址| 成人av资源在线观看| 成人看片黄a免费看视频| 黄页网站在线观看| 九九九热999| 亚洲天堂男人的天堂| 国产精品三级视频| 欧美黄色精品| 亚洲欧洲在线看| 亚洲视频1区2区| 久久www成人_看片免费不卡| 欧美黄色网络| 一级片免费在线观看| 亚洲精品一区二区三区av| 美女黄色丝袜一区| 在线观看不卡视频| 丁香亚洲综合激情啪啪综合| 欧美猛男做受videos| 老司机精品视频在线观看6| 欧美黄色免费网址| 人九九综合九九宗合| 欧美高清dvd| 久久久99精品免费观看不卡| 91精品久久久久久久久久不卡| 波多一区二区| 国产真实伦在线观看| 欧洲高清一区二区| 欧美夫妻性生活xx| 欧美日韩1区2区| 成人av在线影院| 亚洲综合激情在线| 日本免费在线一区| 欧美日韩xx| gay视频丨vk| 日韩精品成人一区二区在线观看| 欧美激情成人在线视频| 欧美日韩久久久| 欧美高清在线一区| 欧美aaaaa成人免费观看视频| 日韩精品a在线观看91| 韩国成人二区| 免费在线观看麻豆视频 | 亚洲人成电影在线播放| 婷婷丁香激情综合| 91亚洲午夜精品久久久久久| 亚洲精品九九|