[GO語言基礎] 六.循環控制語句、流程控制及編程練習(for、break、continue、goto)

      網友投稿 705 2025-03-31

      這些年我學過各種編程語言,從最早的C語言到C++,再到C#、PHP、JAVA,再到IOS開發、Python,到最新的GO語言,學得是真的雜。有時候覺得編程語言恰恰是最簡單的,而通過一門編程語言能夠解決實際問題或深入底層才是其價值所在,并且當我們學好一門編程語言后,其他編程語言都非常類似,殊途同歸,學起來也很迅速。

      源碼-:

      https://github.com/eastmountyxz/Go-learning

      前文參考:

      [GO語言基礎] 一.為什么我要學習Golang以及GO語言入門普及

      [GO語言基礎] 二.編譯運行、語法規范、注釋轉義及API標準庫知識普及

      [GO語言基礎] 三.變量聲明、數據類型、標識符及編程練習12題

      [GO語言基礎] 四.算術運算、邏輯運算、賦值運算、位運算及編程練習

      [GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)

      [GO語言基礎] 六.循環控制語句、流程控制及編程練習(for、break、continue、goto)

      文章目錄

      一.for循環控制

      1.基本語法

      2.for-range循環

      3.for編程經典案例

      4.類似while和do-while循環

      二.多重循環控制

      案例1:循環計算平均成績

      案例2:循環打印金字塔和倒三角

      三.跳轉控制語句

      1.break

      2.continue

      四.goto語句

      五.跳轉控制語句return

      六.Golang編程練習

      1.題目

      2.解答

      七.總結

      一.for循環控制

      1.基本語法

      for循環的語法格式:

      for 循環變量初始化; 循環條件; 循環變量迭代 { 循環操作語句 }

      for循環主要有四要素,包括:

      循環變量初始化

      循環條件

      循環操作(語句),也叫循環體

      循環變量迭代

      for循環語句基本流程如下:

      for循環的執行順序說明如下:

      執行循環變量初始化,比如 n := 1

      執行循環條件,比如 n <= 10

      如果循環條件為真,就執行循環操作

      執行循環變量迭代,比如i++

      反復執行上述三個步驟,直到循環條件為False,就退出for循環

      下面舉個簡單的例子:

      package main import "fmt" func main() { //for循環 for n := 1; n <= 10; n++ { fmt.Println("Eastmount", n) } }

      輸出結果如下圖所示:

      for的第二種語法格式:

      for循環條件是返回一個布爾值的表達式,第二種方式是將變量初始化和變量迭代寫到其他位置。

      for 循環判斷條件 { //循環執行語句 }

      案例如下所示:

      for的第三種語法格式:

      下面的寫法等價于?for; ; {}?,它是一個無限循環,通常需要配合break語句使用。

      for { //循環執行語句 }

      案例如下所示:

      2.for-range循環

      Go語言中range關鍵字用于for循環中迭代數組(array)、切片(slice)、通道(channel)或集合(map)的元素。在數組和切片中它返回元素的索引和索引對應的值,在集合中返回key-value對。數組后續文章介紹,這里主要介紹遍歷字符串。

      使用for-range實現字符串遍歷

      具體案例如下所示:

      package main import "fmt" func main() { //1.for-range遍歷字符串 str := "Eastmount CSDN" for index, val := range str { fmt.Printf("index=%d, value=%c \n", index, val) } //2.for-range遍歷數組 nums := []int{2, 3, 4} for i, num := range nums { fmt.Printf("index=%d, value=%d \n", i, num) } }

      輸出結果如下圖所示:

      如果我們的字符串含有中文,那么傳統的遍歷字符串方式就會錯誤,會出現亂碼。原因是傳統對字符串的遍歷是按照字節來遍歷,而一個漢字在utf8編碼對應3個字節。?如何解決呢?需要將str轉換成[]rune切片即可。

      rune

      golang中string底層是通過byte數組實現的。中文字符在unicode下占2個字節,在utf-8編碼下占3個字節,而golang默認編碼正好是utf-8。rune 等同于int32,常用來處理unicode或utf-8字符。

      下面展示具體的代碼。

      package main import "fmt" func main() { //1.字符串遍歷-傳統方法 str := "CSDN!秀璋" str2 := []rune(str) //將str轉換成[]rune for i := 0; i < len(str2); i++ { fmt.Printf("index=%d, value=%c \n", i, str2[i]) } fmt.Println("") //2.字符串遍歷-for range for index, val := range str { fmt.Printf("index=%d, value=%c \n", index, val) } fmt.Println("") //3.如果不轉rune直接遍歷(亂碼) for i := 0; i < len(str); i++ { fmt.Printf("index=%d, value=%c \n", i, str[i]) } }

      輸出結果如下圖所示,前面兩種方式正確(按字節遍歷),第三種方式會出現亂碼。

      3.for編程經典案例

      下面介紹各編程語言中循環都會出現的案例,計算1到100的個數及總和。

      package main import "fmt" func main() { var result = 0 var num = 0 for i := 1; i <= 100; i++ { result += i num++ } fmt.Println("1+2+...+100 =", result) fmt.Println("個數 =", num) }

      輸出結果如下圖所示:

      流程圖如下圖所示:

      4.類似while和do-while循環

      由于Golang只有for循環,沒有while關鍵字和do-while語法,所以只能通過for循環來模擬while和do-while循環,即使用for+break實現。

      (1) while循環

      for循環模擬while循環的核心代碼如下圖所示,需要注意:

      for循環是一個無限循環

      break語句是跳出for循環

      類似于Java或C語言的while循環語句:

      int i = 0; while(i<10){ // notice there is only < do something }

      案例如下,使用while輸出10句“hello world”。

      package main import "fmt" func main() { //類似while循環 var i int = 1 for { //循環條件 if i > 10 { break //結束循環 } fmt.Println("hello world", i) i++ } }

      輸出結果如下圖所示:

      (2) do-while循環

      由于do-while是先執行后判斷,所以for循環模擬do-while循環的核心代碼如下圖所示:

      需要注意:

      由于do-while是先執行后判斷,因此至少執行一次

      當循環條件成立后,就會執行break跳出for循環

      package main import "fmt" func main() { //使用do-while實現輸出10句"hello world" var j int = 1 for { //先執行后判斷 fmt.Println("hello world", j) j++ if j > 10 { break //結束循環 } } }

      二.多重循環控制

      具體含義為:

      將一個循環放在另一個循環體內,就形成了嵌套循環。在外邊的for稱為外層循環,在里面的for循環稱為內層循環。建議一般使用兩層,最多不要超過3層。

      實質上,嵌套循環就是把內層循環當成外層循環的循環體,當只有內層循環的循環條件為false時,才會完全跳出內層循環,才可以結束外層的當次循環,開始下一次循環。

      設外層循環次數為m次,內層為n次,則內層循環體實際上需要執行m*n次。

      下面通過案例進行多重循環理解,這也是循環的一個難點和重點。正如韓老師所說,編程過程中遇到困難是很常見的,我們需要注意:

      先易后難,將一個復雜的問題分解成簡單的問題。

      先死后活,將代碼寫死板慢慢轉變為靈活。

      學會解決,遇到困難要學會利用搜索引擎或論壇獨立解決。

      案例1:循環計算平均成績

      題目:統計3個班成績情況,每個班有4名同學,求出各個班的平均分和所有班級的平均分。學生的成績從鍵盤輸入。

      解題思路

      首先學會統計1個班的成績情況,求出該班的平均分,該班為4位同學;然后考慮通過循環計算3個班的情況。

      package main import "fmt" func main() { //求出各個班的平均分和所有班級的平均分(3個班 每個班有4名同學) //解題:外層循環班級數 內存循環計算每個班級平均成績 var totalsum float64 = 0.0 for j := 1; j <= 3; j++ { var sum float64 = 0.0 for i := 1; i <= 4; i++ { var score float64 fmt.Printf("請輸入第%d班 第%d個學生的成績 \n", j, i) fmt.Scanln(&score) //累計總分 sum += score } fmt.Printf("第%d個班級的平均分是%v \n", j, sum / 4) //計算各個班的總結成績 totalsum += sum } fmt.Printf("各個班級的總成績是%v 平均分是%v \n", totalsum, totalsum / (4* 3)) }

      輸出結果如下圖所示:

      同時,為了更靈活的編寫代碼,我們可以嘗試將循環控制常量3個班和4位同學修改為變量,具體如下:

      var classNum int = 3

      var stuNum int = 4

      package main import "fmt" func main() { //求出各個班的平均分和所有班級的平均分(3個班 每個班有4名同學) //解題:外層循環班級數 內存循環計算每個班級平均成績 var classNum int = 3 var stuNum int = 4 var totalsum float64 = 0.0 for j := 1; j <= classNum; j++ { var sum float64 = 0.0 for i := 1; i <= stuNum; i++ { var score float64 fmt.Printf("請輸入第%d班 第%d個學生的成績 \n", j, i) fmt.Scanln(&score) //累計總分 sum += score } //注意golang數據類型需要轉換一致才能運算 int->float64 fmt.Printf("第%d個班級的平均分是%v \n", j, sum / float64(stuNum)) //計算各個班的總結成績 totalsum += sum } result := totalsum / float64(stuNum * classNum) fmt.Printf("各個班級的總成績是%v 平均分是%v \n", totalsum, result) }

      如果需要繼續統計各班及格人數,怎么實現呢?

      通過if判斷語句進行比較即可

      案例2:循環打印金字塔和倒三角

      打印金字塔是經典的案例,在前面的第二篇文章也布置過。下面我們通過for循環打印各種金字塔,思路為:

      兩層循環,一個控制金字塔層數,一個控制每一層的輸出

      打印圖形通常由字符和空格組成,尋找對應的規律

      由簡至繁,比如先打印矩形,再嘗試半個三角形金字塔,再打印完整金字塔

      首先介紹打印矩形和半個三角形金字塔代碼。

      package main import "fmt" func main() { var totalLevel int = 5 //1.打印矩形 for i := 1; i <= totalLevel; i++ { //i表示層數 for j := 1; j <= totalLevel; j++ { //每層輸出 fmt.Print("*") } fmt.Println() //換行 } fmt.Println() //2.打印正三角半個金字塔 for i := 1; i <= totalLevel; i++ { //i表示層數 for j := 1; j <= i; j++ { //每層輸出 fmt.Print("*") } fmt.Println() //換行 } fmt.Println() //3.打印倒三角半個金字塔 for i := 1; i <= totalLevel; i++ { //i表示層數 for j := (totalLevel - i); j >= 0; j-- { //每層輸出 fmt.Print("*") } fmt.Println() //換行 } }

      輸出結果如下圖所示:

      理解上述代碼之后,我們再打印金字塔,其規律為:

      空格 + * + 空格 * 1層 1個* 規律: 2*層數-1 空格 4個 規律:總層數-當前層數 *** 2層 3個* 規律: 2*層數-1 空格 3個 規律:總層數-當前層數 ***** ******* *********

      完整代碼如下,包括實心金字塔和空心金字塔。

      package main import "fmt" func main() { /* 打印金字塔 * 1層 1個* 規律: 2*層數-1 空格 4個 規律:總層數-當前層數 *** 2層 3個* 規律: 2*層數-1 空格 3個 規律:總層數-當前層數 ***** ******* ********* */ var totalLevel int = 5 //方法一 打印實心金字塔 for i := 1; i <= totalLevel; i++ { //i表示層數 //先打印空格 for j := (totalLevel - i); j >= 0; j-- { fmt.Print(" ") } //打印星號 for k := (2 * i - 1); k > 0; k-- { fmt.Print("*") } fmt.Println() //換行 } fmt.Println() //方法二 打印空心金字塔 for i := 1; i <= totalLevel; i++ { //i表示層數 //先打印空格 for j := 1; j <= (totalLevel - i); j++ { fmt.Print(" ") } //打印星號 for k := 1; k <= (2 * i - 1); k++ { //每層第一個和最后一個打印* 最底層全部打印* if k == 1 || k == (2 * i - 1) || i == totalLevel { fmt.Print("*") } else { fmt.Print(" ") } } fmt.Println() //換行 } }

      輸出結果如下圖所示:

      三.跳轉控制語句

      1.break

      break語句用于終止某個語句塊的執行,用于中斷當前for循環或跳出switch語句。基本語法如下:

      { .... break .... }

      其示意圖如下圖所示(引用至韓老師)。

      首先結合之前1+2+…+100介紹一個簡單案例,求出當和第一次大于20的當前數字。

      package main import "fmt" func main() { //求出當和第一次大于20的當前數字 sum := 0 for i := 1; i <= 100; i++ { sum += i //求和 if sum > 20 { fmt.Println("sum大于20時當前數字是", i) break //跳出循環 } } }

      輸出結果如下圖所示:

      break語句的注意事項:

      break語句出現在多層嵌套的語句塊中,可以通過標簽指明要終止的是哪一層語句塊。

      break默認會跳出最近的for循環

      break后面可以指定標簽,跳出標簽對應的for循環

      [GO語言基礎] 六.循環控制語句、流程控制及編程練習(for、break、continue、goto)

      通過標簽跳出for循環指定層的代碼如下所示:

      package main import "fmt" func main() { //通過標簽跳出for循環指定層 label1: for i := 0; i < 4; i++ { //label2: for j := 0; j < 10; j++ { if j ==2 { //默認跳出最近的循環 這里嘗試跳出外層循環 break label1 } fmt.Println("j =", j, "i =", i) } } }

      運行結果如下,當j等于2時跳出所有循環,即調轉至label1。:

      2.continue

      continue語句用于結束本次循環,它將繼續執行下一次循環。其基本語法如下:

      { ... continue ... }

      流程圖如下所示,它將結束本次循環,繼續迭代執行下一次循環。

      同樣,continue語句出現在多層嵌套的循環語句體中時,可以通過標簽指明要跳過的是哪一層循環,這個和前面的break標簽使用規則一樣。

      舉個簡單案例:

      package main import "fmt" func main() { //continue跳出當前循環 for i := 0; i < 4; i++ { for j := 0; j < 10; j++ { if j ==2 { continue } fmt.Println("j =", j, "i =", i) } } }

      輸出結果如下圖所示,每次都沒有輸出j=2。

      如果我們需要使用continue打印100以內的奇數,則可以編寫如下代碼:

      四.goto語句

      Golang中的goto語句可以無條件轉移到程序中指定的行,goto常與條件語句配合使用,用以實現條件轉移或跳出循環體。注意,在GO程序設計中一般不主張使用goto語句,以避免造成流程的混亂,使理解和調試程序都產生困難,同樣C語言也不主張使用。

      goto label .... label: statement

      其執行流程如下圖所示:

      下面介紹一個簡單的案例:

      package main import "fmt" func main() { //goto語句 fmt.Println("aaaaa") var n int = 30 if n > 20 { goto label } fmt.Println("bbbbb") fmt.Println("ccccc") label: fmt.Println("ddddd") fmt.Println("eeeee") fmt.Println("fffff") }

      輸出結果如下圖所示:

      五.跳轉控制語句return

      return使用在方法或函數中,表示跳出所在的方法或函數。在分享函數的時候,我會詳細介紹。

      return使用說明:

      如果return是在普通的函數,則表示跳出該函數,即不再執行函數中return后面代碼,也可以理解成終止函數。

      如果return是在main函數,表示終止main函數,也就是終止程序。

      package main import "fmt" func main() { //return語句 for i := 1; i<=10; i++ { if i==3 { return } fmt.Println("輸出結果", i) } fmt.Println("over") }

      輸出結果如下圖所示:

      六.Golang編程練習

      1.題目

      (1) 打印1到100之間所有是9倍數的整數的個數及總和。

      (2) 循環依次輸出“East 秀璋”字符串的所有字符。

      (3) 打印9*9乘法表。

      (4) 模擬網站登錄驗證機制.假設有3次機會,如果用戶名為“Eastmount”,密碼為“666666”提示登錄成功,否則提示剩余機會;最終超過3次則提示“輸入錯誤次數過多,無法登錄”。

      (5) 隨機生成1到100的一個數,如果生成99這個數就停止,計算一共使用多少次。

      (6) 輸入如下4*5的矩陣。

      1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20

      (7) 利用循環求Fibonacci數列的前10個數。

      (8) 求2到200間的全部素數。

      2.解答

      (1) 打印1到100之間所有是9倍數的整數的個數及總和。

      代碼如下:

      package main import "fmt" func main() { var max int = 100 var count int = 0 var sum int = 0 for i := 1; i <= max; i++ { if i % 9 == 0 { count++ sum += i } } fmt.Printf("count=%v sum=%v \n", count, sum) }

      輸出結果如下圖所示:

      (2) 循環依次輸出“East 秀璋”字符串的所有字符。

      在數組上使用range將傳入index和值兩個變量。如果我們不需要使用該元素的序號,則使用空白符"_"省略。

      package main import "fmt" func main() { str := "East=秀璋" //方法1 fmt.Printf("utf-8遍歷字符串\n") for _, s := range str { fmt.Printf("utf-8遍歷: %c %v \n", s, s) } fmt.Println("") //方法2 str2 := []rune(str) for i := 0; i < len(str2); i++ { fmt.Printf("utf-8遍歷: index=%d, value=%c \n", i, str2[i]) } fmt.Println("") //方法3 亂碼 fmt.Printf("unicode遍歷字符串\n") for i := 0; i < len(str); i++ { ch := str[i] fmt.Printf("unicode遍歷: %c %d\n", ch, ch) } }

      輸出結果如下圖所示:

      (3) 打印9*9乘法表。

      代碼如下:

      package main import "fmt" func main() { //9*9乘法表 var num int = 9 for i := 1; i <= num; i++ { for j := 1; j <= i; j++ { fmt.Printf("%v*%v=%v \t", j, i, j*i) } fmt.Println() } }

      輸出結果如下圖所示:

      (4) 模擬網站登錄驗證機制.假設有3次機會,如果用戶名為“Eastmount”,密碼為“666666”提示登錄成功,否則提示剩余機會;最終超過3次則提示“輸入錯誤次數過多,無法登錄”。

      代碼如下:

      package main import "fmt" func main() { //模擬網站登錄 var name string var pwd string var loginChance = 3 for i := 1; i <= 3; i++ { //輸入信息 fmt.Println("請輸入用戶名") fmt.Scanln(&name) fmt.Println("請輸入密碼") fmt.Scanln(&pwd) if name == "Eastmount" && pwd == "666666" { fmt.Println("恭喜你登錄成功") break } else { loginChance-- fmt.Printf("輸入錯誤,你還有%v次機會\n", loginChance) } } if loginChance <= 0 { fmt.Println("輸入錯誤次數過多,無法登錄") } }

      輸出結果如下圖所示:

      (5) 隨機生成1到100的一個數,如果生成99這個數就停止,計算一共使用多少次。

      提示:該題目無限循環模擬break語句,通過rand.Seed()隨機生成數字,然后進行判斷

      package main import ( "fmt" "math/rand" "time" ) func main() { //隨機生成1到100的一個數,如果生成99這個數就停止 var count int = 0 for { //種子生成 使用系統時間的不確定性來進行初始化 rand.Seed(time.Now().UnixNano()) num := rand.Intn(100) + 1 fmt.Println("num =", num) count++ if (num == 99) { break } } fmt.Println("生成隨機數99共使用次數 =", count) }

      輸出結果如下圖所示:

      (6) 輸入如下4*5的矩陣。

      代碼如下:

      package main import "fmt" func main() { var n int = 4 var m int = 5 var res int = 0 for i := 1; i <= n; i++ { for j := 1; j <= m; j++ { fmt.Printf("%v\t", i*j) res++ } fmt.Println("") } }

      輸出結果如下圖所示:

      (7) 利用循環求Fibonacci數列的前10個數。

      該函數的特點是第1、2兩個數為1,從第3個數開始為前兩個數的和。

      解題思路對應的流程如下圖所示:

      package main import "fmt" func main() { //Fibonacci數列 var f1 int = 1 var f2 int = 1 var f3 int fmt.Printf("%v\n%v\n", f1, f2) for i := 1; i <= 10; i++ { f3 = f1 + f2 fmt.Printf("%v\n", f3) f1 = f2 f2 = f3 } }

      輸出結果如下圖所示:

      (8) 求2到200間的全部素數。

      解題思路:輸入n,如果n不能被用2到sqrt(n)或2到n/2間的任一整數整除,則是素數。當然,2到(n-1)整除是最原始的方法。對應的算法流程如下:

      代碼如下:

      package main import "fmt" func main() { //求2到200間的全部素數 var n int var k int var i int var m int = 0 for n = 2; n <= 200; n++ { k = n / 2 //如果n被i整除終止內循環 for i = 2; i <= k; i++ { if n % i == 0 { break } } //如果i>k+1表示n未被整除 if i >= k + 1 { fmt.Printf("%d\t", n) //m控制換行 輸出10個素數換行 m = m + 1 if m % 10 == 0 { fmt.Println() } } } }

      運行結果如下圖所示:

      七.總結

      寫到這里,這篇基礎性Golang文章介紹完畢,希望您喜歡!祝大家新年快樂,牛氣沖天,也希望自己能分享更優秀、更深入的文章。

      一.for循環控制

      1.基本語法

      2.for-range循環

      3.for編程經典案例

      4.類似while和do-while循環

      二.多重循環控制

      案例1:循環計算平均成績

      案例2:循環打印金字塔和倒三角

      三.跳轉控制語句

      1.break

      2.continue

      四.goto語句

      五.跳轉控制語句return

      六.Golang編程練習

      1.題目

      2.解答

      Go基本運算和進制轉換了解后,后面的文章將詳細介紹Go語言的條件語句和循環語句知識,并結合案例進行普及。希望這篇基礎性文章對您有幫助,寫得不好的地方還請海涵。同時非常感謝參考文獻中的大佬們的文章分享,尤其是韓順平老師,深知自己很菜,得努力前行。也希望自己能深入下去,未來四年好好研究Go編程語言,做更多實際工程,寫更好的文章,共勉!

      源代碼-:

      https://github.com/eastmountyxz/Go-learning

      感謝華為云的禮物,希望能與大家一起在華為云社區共同進步,且看且珍惜。

      原文地址:https://blog.csdn.net/Eastmount/article/details/113826055

      (By:娜璋AI之家 Eastmount 2021-08-10 星期二 夜于貴陽?)

      參考文獻:

      Go官網:https://golang.org/

      韓老師視頻:https://www.bilibili.com/video/BV1pt41127FZ

      https://www.runoob.com/go/go-tutorial.html

      Go中文網在線標準庫文檔:https://studygolang.com/pkgdoc

      《C程序設計》譚浩強老師

      《GO高級編程》

      https://www.runoob.com/go/go-range.html

      Go

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:什么叫甘特圖法(甘特圖原理)
      下一篇:Excel批注不顯示的解決方法是什么(excel批注突然沒有了)
      相關文章
      www.91亚洲| 亚洲精品无码av中文字幕| 亚洲色大成网站www尤物| 91精品国产亚洲爽啪在线影院 | 亚洲午夜久久久影院| 亚洲片国产一区一级在线观看 | 久久久久亚洲AV成人片| 亚洲国产一区国产亚洲| 亚洲AV无码成人精品区在线观看 | 亚洲另类无码一区二区三区| 亚洲综合久久精品无码色欲 | 综合亚洲伊人午夜网 | 亚洲午夜精品一级在线播放放 | 亚洲精品无码久久久久去q| 亚洲一区精品无码| 国产亚洲人成网站观看| 亚洲国产另类久久久精品黑人| 亚洲色成人WWW永久网站| 亚洲乱码国产乱码精品精| 亚洲熟妇av一区二区三区| 亚洲成AV人片在WWW色猫咪| 亚洲AV无码久久精品蜜桃| 亚洲三级电影网址| 亚洲最新黄色网址| 亚洲色www永久网站| 无码天堂va亚洲va在线va| 亚洲国产精品综合久久网络| 国产AV无码专区亚洲AV漫画| 亚洲成AV人片天堂网无码| 亚洲视频在线免费观看| 亚洲视频国产视频| 亚洲一区中文字幕在线观看| 亚洲日韩精品无码专区加勒比| 国产成人亚洲精品91专区高清 | 亚洲专区中文字幕| 亚洲GV天堂无码男同在线观看| heyzo亚洲精品日韩| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲国产成人久久综合野外| 在线播放亚洲第一字幕| 久久久亚洲精品无码|