日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自己读Go程序设计语言的一些总结(更新ing...)

發(fā)布時間:2023/12/2 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己读Go程序设计语言的一些总结(更新ing...) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Go

本筆記用于記錄在閱讀Go程序設(shè)計語言的一些重要的知識點!并不完全!

第一章(入門)

命令行參數(shù)

在Go語言中可以直接go run 文件,也可以go build后會生成一個可執(zhí)行文件,直接使用該可執(zhí)行文件可以運行g(shù)o文件。

#第一種 go run file.go #第二種 go build file.go ./file

下面用一個程序來理解如何獲得命令行參數(shù)

package chapter1import ("fmt""os" )/** 該程序用來模擬linux的echo,輸入后面帶的參數(shù) */ func main() {args := os.Argsvar s stringfor i := 1; i < len(args); i++ {s += args[i] + " "}fmt.Println(sy }

運行效果

PS D:\goTrip\chapter1> go build .\echo1.go PS D:\goTrip\chapter1> .\echo1 aa bb cc aa bb cc

補充(for range)

上面的代碼沒有任何問題,但是go語言的for循環(huán)其實不止這個用法,他和java不同,不用死板的i++,而是可以像java的for(:)這樣。

首先我們得直到os.Args是一種string的切片,由于要實現(xiàn)函數(shù)的功能,我們得從index=1開始遍歷,所以我們只用取切片的[1:],現(xiàn)在來實現(xiàn)函數(shù)。

package mainimport ("fmt""os" )/** 該程序用來模擬linux的echo,輸入后面帶的參數(shù) */ func main() {args := os.Args var s stringfor _, val := range args[1:] {s += val + " "}fmt.Println(s) }

前面的下劃線是什么?

這個在go中代表忽略該值,因為go語言創(chuàng)建了一個值但是不使用,會報錯,用了_,就可以不用也不會報錯。

被省略的是index!

補充(i++)

go中的i++對i+1,他等價于i += 1,也等價于i = i + 1.但是這些是語句,并不是表達(dá)式,所以j = i++不是合法語句。

優(yōu)化(echo1)

在上面我們是通過循環(huán)通過追加舊的字符串來拼接命令行參數(shù)的,會將新的內(nèi)容賦值給s,然后舊的內(nèi)容垃圾回收。如果有大量的數(shù)據(jù)處理,這種代價會比較大,一種簡單并且高效的方式。

/** 該程序用來模擬linux的echo,輸入后面帶的參數(shù) */ func main() {args := os.Argsjoin := strings.Join(args[1:], " ")fmt.Println(join) }

找出重復(fù)行

有點像unix的dup,輸出輸入中次數(shù)大于1的行。

方式1(map+scanner)

第一個實現(xiàn)方式使用map+scanner實現(xiàn)。

package mainimport ("bufio""fmt""os" )func main() {record := make(map[string]int)s := bufio.NewScanner(os.Stdin)for s.Scan() {record[s.Text()] += 1}for k, v := range record {if v > 0 {fmt.Printf("dup line is %s\n", k)}} }

scanner是bufio包下的掃描器,它可以讀取輸入,以行或者單詞為單位斷開。有點像java的scanner,簡直一毛一樣。

方式2(流)

第二個實現(xiàn)方式用流的方式讀入,并且可以讀入文件或者鍵盤鍵入的文字。(通過命令行參數(shù)控制)

大概使用一個count函數(shù),參數(shù)1是*File,參數(shù)2是記錄的map

package mainimport ("bufio""fmt""io""os" ) func main() {args := os.Argsrecord := make(map[string]int)//若長度為1,說明后面沒有追加文件名字if len(args) == 1 {count2(os.Stdin, record)} else {for _, v := range args[1:] {open, err := os.Open(v)if err != nil {continue}count1(open, record)//記得關(guān)閉!!!open.Close()}}for k, v := range record {if v > 1 {fmt.Printf("%s:%d\n", k, v)}} } func count1(stream *os.File, record map[string]int) {reader := bufio.NewReader(stream)for {line, _, err := reader.ReadLine()if err == io.EOF {break}record[string(line)] += 1}return } func count2(stream *os.File, record map[string]int) {reader := bufio.NewScanner(stream)for reader.Scan() {if reader.Text() == "exit" {break}record[reader.Text()] += 1}return }

獲得多個URL

用http來get請求即可。

package mainimport ("fmt""io/ioutil""net/http""os" )func main() {for _, url := range os.Args[1:] {get, err := http.Get(url)if err != nil {fmt.Printf("err: %v\n", err)return}body := get.Bodyall, err := ioutil.ReadAll(body)if err != nil {fmt.Printf("err: %v\n", err)return}fmt.Println(string(all))} }

小作業(yè)1,用io.copy將b文件讀入到控制臺

package mainimport ("fmt""io""net/http""os" )func main() {for _, url := range os.Args[1:] {get, err := http.Get(url)if err != nil {fmt.Printf("err: %v\n", err)return}body := get.Bodyio.Copy(os.Stdout, body)if err != nil {fmt.Printf("err: %v\n", err)return}} }

并發(fā)獲得多個URL

管道是用來go協(xié)程間通信的,這個管道很有意思,他默認(rèn)需要兩個協(xié)程操作,比如一個協(xié)程對他進(jìn)行數(shù)據(jù)操作了,他會阻塞直到另一個協(xié)程對他進(jìn)行數(shù)據(jù)的寫入或者讀取。

package mainimport ("fmt""io""net/http""os""time" )func main() {c := make(chan string)start := time.Now()for _, url := range os.Args[1:] {go fetch(url, c)}//如果main先到則會阻塞等待,如果go協(xié)程先到則會將數(shù)據(jù)寫入channel,如果main沒取,也會阻塞for range os.Args[1:] {fmt.Println(<-c)}since := time.Since(start)fmt.Printf("%.2f has passed", since.Seconds()) }func fetch(url string, c chan string) {now := time.Now()get, err := http.Get(url)if err != nil {c <- fmt.Sprint(err)fmt.Printf("error,err:%v\n", err)}byte, err := io.Copy(io.Discard, get.Body)get.Body.Close()if err != nil {c <- fmt.Sprint(err)fmt.Printf("error,err:%v\n", err)}since := time.Since(now).Seconds()c <- fmt.Sprintf("%.2f %7d %s", since, byte, url) }

一個Web服務(wù)器

我們這邊通過http的listen方法,啟動一個服務(wù)器

package mainimport ("fmt""net/http" )func main() {//路由http.HandleFunc("/", handler)//監(jiān)聽一個端口http.ListenAndServe("localhost:8000", nil) }func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "url=%v\n", r.URL.Path) } PS D:\goTrip\chapter1> go build .\serve.go PS D:\goTrip\chapter1> ./serve PS D:\goTrip\chapter1> ./fetch http://localhost:8000/ url=/

可以看到我們上面發(fā)送的get請求,我們的服務(wù)器成功的收到了。

計數(shù)器

我們?yōu)檫@個服務(wù)器加上了一個計數(shù)器

package mainimport ("fmt""net/http""sync" )var count int var lock sync.Mutexfunc main() {//路由http.HandleFunc("/", handler)http.HandleFunc("/count", counts)//監(jiān)聽一個端口http.ListenAndServe("localhost:8000", nil) }func handler(w http.ResponseWriter, r *http.Request) {lock.Lock()count++lock.Unlock()fmt.Fprintf(w, "url=%v\n", r.URL.Path) }func counts(w http.ResponseWriter, r *http.Request) {lock.Lock()fmt.Fprintf(w, "count=%v\n", count)lock.Unlock() }

第二章(程序結(jié)構(gòu))

flag包

有以下兩種常用的定義命令行flag參數(shù)的方法。

flag.Type()

基本格式如下:

flag.Type(flag名, 默認(rèn)值, 幫助信息)*Type 例如我們要定義姓名、年齡、婚否三個命令行參數(shù),我們可以按如下方式定義:

name := flag.String("name", "張三", "姓名") age := flag.Int("age", 18, "年齡") married := flag.Bool("married", false, "婚否") delay := flag.Duration("d", 0, "時間間隔")

需要注意的是,此時name、age、married、delay均為對應(yīng)類型的指針。

flag.TypeVar()

基本格式如下: flag.TypeVar(Type指針, flag名, 默認(rèn)值, 幫助信息) 例如我們要定義姓名、年齡、婚否三個命令行參數(shù),我們可以按如下方式定義:

var name string var age int var married bool var delay time.Duration flag.StringVar(&name, "name", "張三", "姓名") flag.IntVar(&age, "age", 18, "年齡") flag.BoolVar(&married, "married", false, "婚否") flag.DurationVar(&delay, "d", 0, "時間間隔")

通過以上兩種方法定義好命令行flag參數(shù)后,需要通過調(diào)用flag.Parse()來對命令行參數(shù)進(jìn)行解析。

支持的命令行參數(shù)格式有以下幾種:

  • -flag xxx (使用空格,一個-符號)
  • --flag xxx (使用空格,兩個-符號)
  • -flag=xxx (使用等號,一個-符號)
  • --flag=xxx (使用等號,兩個-符號)

代碼

package mainimport ("flag""fmt""strings" )var (n = flag.Bool("n", false, "忽略結(jié)尾的換行符")sep = flag.String("sep", " ", "替換輸出參數(shù)時候用的分隔符") )func main() {flag.Parse()fmt.Print(strings.Join(flag.Args(),*sep))if !*n{fmt.Println()} }

可以發(fā)現(xiàn)我們使用flag所解析的參數(shù)*,因為flag.Bool和flag.String是返回的指針,我們需要取指針的值要用到 *

new

new用于產(chǎn)生某一個類型的指針,他是預(yù)定義的函數(shù),不是關(guān)鍵字,所以如果在某一函數(shù)指定了名為new的變量,我們就用不了new函數(shù)了。

func demo(new int){//用不了new }

變量的生命周期

如果是包范圍的變量,他的生命周期和我們程序的生命周期一樣。

如果是局部變量,它從被聲明創(chuàng)建開始,直到無法被訪問。垃圾回收器怎么知道它是否無法被訪問呢?有點像Java的GC Root,將每一個包級別的變量和每一個函數(shù)的局部變量,都當(dāng)成一個源頭,以該通過指針和其他引用方式找到變量,如果變量沒有路徑能夠到達(dá),說明無法被訪問。

即分析變量的可到達(dá)性。

變量逃逸分析

在go語言中,一般沒有發(fā)生逃逸的話,局部變量會申請??臻g,包級別的變量會申請堆空間,但是函數(shù)內(nèi)的局部變量可能發(fā)生逃逸。

例如下面的情況,最終go會通過逃逸分析將d分配到堆空間上。

type Data{//... } func escape() *Data{d := &Data{}return d }

包的別名

可以在函數(shù)上方對包進(jìn)行一個別名,如下方例子,雖然Celsius和Fahrenheit底層都是Float64,但是他們是無法相互轉(zhuǎn)換的。

也不能一起計算,得做類型轉(zhuǎn)型。

package main //攝氏度 type Celsius float64 //華氏度 type Fahrenheit float64const(AbsoluteZero Celsius = -273.15Freezing Celsius = 0Boiling Celsius = 100 )func CToF(c Celsius) Fahrenheit{//不可以//var f Fahrenheit = Freezingreturn Fahrenheit(c*9/5 + 32) }func FToC(f Fahrenheit) Celsius{return Celsius((f-32)*5/9) }func main() {}

作用域

一般會分為系統(tǒng)預(yù)留的值比如int,true,包級別:別入在函數(shù)外定義的var,局部:函數(shù)內(nèi)或者語句塊內(nèi)定義的。

go在查找變量的引用,會從內(nèi)層(局部->系統(tǒng))去查找,所以如果函數(shù)內(nèi)定義了一個val,但是又有一個全局的val會優(yōu)先使用局部變量。

對于for循環(huán)很有意思,他會創(chuàng)建兩個語法塊,一個是循環(huán)體的顯示語法塊,一個是隱式塊,包含了初始化的變量i,i++等。

所以他會出現(xiàn)一個很奇怪的現(xiàn)象,就是一個for里面可能有兩個i

作用域也會導(dǎo)致許多奇怪的問題,比如有一個包級別的屬性叫val,我們調(diào)用某個函數(shù)也會得到val,詳細(xì)見下圖。

這里我們其實想讓全局的val初始化,但是err和val都沒在函數(shù)內(nèi)聲明,只能用:=,不然err會爆紅,表示找不到這個err,此時我們可以這樣

第三章(基本數(shù)據(jù))

整數(shù)

Go具有有符號整數(shù)和無符號整數(shù)。并且每個整數(shù)都有8,16,32,64位,分別對應(yīng)int8,int16,int32,int64(無符號整數(shù) uint8,uint16,uint32,uint64).

對于n位有符號整數(shù),他的取值范圍位-(2^(n-1) - 1) ~ 2^(n-1) - 1.

即對于int8他的取值范圍是-128~127

對于n位無符號整數(shù),他的取值范圍是0~2^n - 1

即對于uint8他的取值范圍是0~255

由于整數(shù)有他的數(shù)值范圍,所以完全是可能溢出的,我們以范圍最小的uint8來演示一下溢出的情況。

位運算

直接看程序吧。

package mainimport "fmt"func main() {var x uint8 = 1<<1 | 1<<5 //"10001"var y uint8 = 1<<1 | 1<<2 //"00011"fmt.Printf("%08b\n", x)fmt.Printf("%08b\n", y)fmt.Printf("%08b\n", x&y)fmt.Printf("%08b\n", x|y)fmt.Printf("%08b\n", x^y)//就等同于x&(^y)fmt.Printf("%08b\n", x&^y)for i := uint8(0); i < 8; i++ {//統(tǒng)計x的二進(jìn)制形式有幾個1if (x>>i)&1 != 0 {fmt.Println(i)}} }

關(guān)于go的一些內(nèi)置函數(shù)為什么返回有符號整數(shù)

比如go的len函數(shù)就是返回有符號整數(shù),為什么要這么做,因為我們知道uint的數(shù)值范圍是0~?,所以按道理來說無符號整數(shù)應(yīng)該恒大于等于0,那在開發(fā)中我們經(jīng)常會寫出這種代碼。

for i := len(list);i >= 0;i--{//logic }

假設(shè)返回的是uint,那么i也隨之變成uint,那i–一輩子不可能小于0,會陷入死循環(huán)。因此無符號整數(shù)常常只用于位運算或者算術(shù)運算符。

浮點數(shù)

go中支持兩種大小的浮點數(shù)float32,float64.

字符串

字符串是不可變的字節(jié)序列。它可以包含任何數(shù)據(jù),包括零值字節(jié)。

例如下面的代碼,可以看到雖然str改變了,但是t持有的str的舊值仍沒有改變

由于str不可變,所以str內(nèi)部的值也不能變

不可能出現(xiàn)str[0] = '0’這種情況。

字符串字面量

字符串的值可以直接寫成字符串字面量,形式上就是代雙引號的字節(jié)序列。

string的幾個標(biāo)準(zhǔn)包

4個標(biāo)準(zhǔn)包對字符串操作特別重要:bytes,strings,strconv,unicode

byetes包內(nèi)有用于操作字節(jié)slice的方法。由于字符串不可變,因此按增量方式構(gòu)建字符串會導(dǎo)致多次內(nèi)存分配,用bytes.Buffer會更高效。

strconv包含將字符串轉(zhuǎn)換的函數(shù),課轉(zhuǎn)換為布爾值,整數(shù),浮點數(shù)等函數(shù)。

unicode具有判別文字符號值特性的函數(shù),比如isDigit(是否是數(shù)字),isLetter(是否是字母)

strings包中具有一些操作字符串的函數(shù),類似于bytes。

basename demo

首先不借助任何庫。

func basename(str string) string {//從后往前找到最后一個/for i := len(str) - 1; i >= 0; i-- {if str[i] == '/' {str = str[i+1:]break}}var index intfor i := len(str) - 1; i >= 0; i-- {if str[i] == '.' {index = ibreak}}return str[:index] }

借助lastIndex

func basename1(str string) string {//從后往前找到最后一個/index := strings.LastIndex(str, "/")end := strings.LastIndex(str, ".")return str[index+1 : end] }
對每三個數(shù)字就插入一個,

不用庫函數(shù),遞歸

package mainimport "fmt"func main() {fmt.Println(foo("123456789")) }func foo(str string) string {if len(str) <= 3 {return str}return str[:3] + "," + foo(str[3:]) }
模擬打印數(shù)組

有點像java的數(shù)組的tostirng,在這里是用bytes的buf接受字符串,[]和數(shù)字,這里值得注意的是fpringf的writer得傳一個指針。+

package mainimport ("bytes""fmt" )func intsToString(arr []int) string {var buf bytes.Bufferbuf.WriteString("[")for i, v := range arr {if i > 0 {buf.WriteString(", ")}fmt.Fprintf(&buf, "%d", v)}buf.WriteString("]")return buf.String() }func main() {ints := make([]int, 0, 3)ints = append(ints, 1)ints = append(ints, 2)ints = append(ints, 3)fmt.Println(intsToString(ints)) }
字符串轉(zhuǎn)數(shù)字

數(shù)字—》字符串

i := 1 s1 := fmt.Sprintf("%d", i) s2 := strconv.Itoa(i)

字符串–》數(shù)字

atoi, err := strconv.Atoi("123") parseInt, err := strconv.ParseInt("123", 10, 64)

parseInt第二個參數(shù)代表進(jìn)制,第三個參數(shù)代表位數(shù)。

第四章(復(fù)合數(shù)據(jù)類型)

數(shù)組

數(shù)組的長度是固定的,所以在go中很少使用數(shù)組。更多的會使用切片。

var a [3]int var a [3]int = {1,2,3} a := [...]int{1,2,3}

這里可以注意,如果此時用print(“%T\n”,a) 得到的類型會是[3]int,但是[3]int和[4]int是不一樣的。

如果數(shù)組的元素是可以比較的,那么數(shù)組也是可以比較的。

因為數(shù)組如果容量過大,作為方法的參數(shù),會復(fù)制一個副本,這是十分消耗資源的。此時可以用指針,傳的就是引用。

切片

切片是一種可變長度的序列。切片中的類型是唯一的,例如[]T,切片中都是T類型。

切片有三個屬性,指針,長度,容量。長度是指slice中的元素的個數(shù),它不能大于容量。容量是一般是第一個到最后一個元素的長度。

但是值得注意的是切片不能用==來比較,對于字節(jié)切片,可以直接調(diào)用bytes.equal,但是其他的就需要我們自己寫函數(shù)來比較了。

對于切片,如何判斷是一個空的切片,要用len(切片),如果用切片==nil,會發(fā)生一種情況,比如剛剛make出來的切片,此時是沒有元素的,但是不等于nil,他本來是空的。

通過make創(chuàng)建切片,可以有兩種方法。

make([]int,len) make([]int,len,cap)

對于第一種返回的是整個數(shù)組的引用,而第二種是數(shù)組中l(wèi)en元素的引用,但是cap會為以后的slice留出空間。

append

growslice

首先將當(dāng)前容量進(jìn)行一個double,判斷是否大于舊容量。

若小于,則說明沒有初始化,所以直接將newCap賦值給數(shù)組即可。

如果當(dāng)前的容量小于1024,會進(jìn)行一個double,否則會進(jìn)行一個1+1/4的擴(kuò)容。

由于我們調(diào)用append并不知道是否會發(fā)生內(nèi)存重分配,即并不知道是返回的原數(shù)組還是新數(shù)組,所以我們一般使用append函數(shù)都會將返回的切片賦值給原來的切片。

這句話可以由下面代碼很清楚的看出來,下面代碼大概是取出一個string切片的所有空字符串

所以建議用下面這種方式

或者直接操作切片

remove掉切片中index的值

可以用copy直接覆蓋掉index后的值,然后返回len-1的切片即可,詳細(xì)可以看代碼

func remove(s []string, i int) []string {copy(s[i:], s[i+1:])return s[:len(s)-1] }

reverse

package mainimport "fmt"func reverse(arr *[]int) {A := *arrl1 := len(*arr) - 1l := len(*arr)/2 - 1for i := 0; i <= l; i++ {A[i], A[l1-i] = A[l1-i], A[i]} }func main() {arr := []int{1, 2, 3, 4, 5}fmt.Println(arr)reverse(&arr)fmt.Println(arr) }

map

map是一種key,val鍵值對的存儲結(jié)構(gòu),其中的key和val都是可以用比較的類型,所以在加入map的時候可以通過判斷map中是否有key。

值得注意的是,我們無法取map的地址,當(dāng)我們用&map[‘bob’]的時候會編譯報錯,為什么呢?

我認(rèn)為是因為map中的元素并不是永久的,可能隨著map的擴(kuò)容,導(dǎo)致該位置上的元素rehash到了其他位置,可能會讓存儲地址無效。

如何有序的遍歷map

比如我們map是map[string]int,此時有一個需求,需要按照字典的順序讀取map,如何做呢?

看下面代碼,可以先對key排序,然后根據(jù)排序后的key去字典中取

package mainimport ("fmt""sort" )func main() {dict := make(map[string]int)dict["b"] = 1dict["a"] = 1dict["c"] = 1l := make([]string, 0, 3)for k := range dict {l = append(l, k)}sort.Strings(l)for _, v := range l {fmt.Printf("%s:%d\n", v, dict[v])} }

如何判斷map中是否有元素?

比如我們map是map[string]int,如果去到一個不存在的key,會自動返回默認(rèn)值,但是萬一有一個key剛好val=0呢?那他明明存在,我們的邏輯判斷成了不存在。

所以得用下面的方式判斷:

if _, ok := dict["d"]; !ok {fmt.Println("不存在") }

我想要切片作為key怎么辦

上面說過,對于map來說key是需要能通過==來判斷相等的,那萬一我就想要讓切片作為key呢?

我們可以間接的完成這個需求

dict := make(map[string]int)//先創(chuàng)建一個string為key的map func trans(s []string)string{return fmt.Sprintf("%q",s) //將切片轉(zhuǎn)換成string類型 } func Add(list []string){dict[trans(list)] += 1 }

基本上所有的需求,都可以用上面的方法完成。當(dāng)然也不一定非要是字符串類型,任何可以得到想要結(jié)果的可以使用==的結(jié)構(gòu)都可以。

map是支持這種的map[string]map[string]string.

結(jié)構(gòu)體

結(jié)構(gòu)體將零個或者多個任意類型的命名變量組合在一起成為一個聚合的數(shù)據(jù)類型。

type Book struct{Name string //...... } var b book

對于b,我們可以通過 . 來取出屬性,例如b.Name = ‘Go入門’,在go中也可以對指針類型的結(jié)構(gòu)體使用 .

var b *book = &Book{Name: 'aaa'} b.Name = 'bbb' //等價于(*b).Name = 'bbb'

需要注意的地方

加入某個函數(shù)能夠返回結(jié)構(gòu)體,必須得返回結(jié)構(gòu)體指針才可以對結(jié)構(gòu)體的屬性進(jìn)行操作,否則會找不到變量

正解:

結(jié)構(gòu)體無法包含他自己,但是可以是指針

當(dāng)我們學(xué)習(xí)算法的時候,經(jīng)常需要自己手寫一個簡單的二叉樹數(shù)據(jù)結(jié)構(gòu)。下方會報錯

換成指針即可。

寫一個小demo試試,二叉樹排序

package mainimport "fmt"type Tree struct {val intleft, right *Tree }func sort(vals []int) {var root *Treefor _, v := range vals {root = add(root, v)}s := make([]int, 0, len(vals))s = TreeToSlice(s[:0], root)fmt.Println(s) }func add(node *Tree, val int) *Tree {if node == nil {t := new(Tree)t.val = valreturn t} else {if node.val < val {node.right = add(node.right, val)} else {node.left = add(node.left, val)}return node} }func TreeToSlice(s []int, root *Tree) []int {if root != nil {s = TreeToSlice(s, root.left)s = append(s, root.val)s = TreeToSlice(s, root.right)}return s }func main() {sort([]int{3, 1, 2, 4, 5}) }

如果結(jié)構(gòu)體屬性首字母是小寫,別的包無法引用

比如下面這種情況

a,b都是不可導(dǎo)出的,雖然上面代碼沒有顯示的引用a,b,但是他們被隱式的引用了,這也是不允許的。

結(jié)構(gòu)體之間的比較

如果結(jié)構(gòu)體的所有屬性都是可以比較的,那么結(jié)構(gòu)體也是可以比較的。

既然結(jié)構(gòu)體是可以比較的,說明結(jié)構(gòu)體是可以當(dāng)成map的key的。

匿名成員

比如我們模擬一下人類這個類。

如果我們把所有屬性寫在一個結(jié)構(gòu)體,例如

type Human struct {Name stringAge intSchoolName stringWorkPlace string }

這樣結(jié)構(gòu)會比較不清晰,我們可以把一些部分抽出來。

type Human struct {Name stringAge intSchoolWork } type School struct {SchoolName string } type Work struct {WorkPlace string }

Go允許我們定義不帶名字的結(jié)構(gòu)體成員,只需要指定他的類型。這些結(jié)構(gòu)體成員叫做匿名成員。

第五章(函數(shù))

在GO中是值傳遞,即如果實參傳入的是非指針的類型,函

數(shù)會創(chuàng)建一個副本,對副本進(jìn)行修改不會影響到本體,但是如果是引用類型,那么函數(shù)使用形參可能會間接修改本體。

異常

函數(shù)所發(fā)生的異常我們必須考慮,有以下幾個方法

1.遇到異常,返回異常打印異常

if err != nil{return nil,fmt.Errorf("%v",err) }

2.設(shè)置超時時間并且重試

const timeount = 1 * time.Minute deadline := time.Now().Add(timeout) //重試邏輯 for tris:= 0;time.Now().Before();treis++{//邏輯if err == nil{break;}log.printf("err")//等待一定時間,指數(shù)退避策略time.Sleep(time.Second << uint(tries)) }

3.輸出錯誤,優(yōu)雅的結(jié)束

if err != nil{fmt.Fprintf(os.Stderr,"err : %v",err)os.exit(1) }

4.日志記錄,繼續(xù)運行

if err != nil{log.printf(os.Stderr,"err : %v",err) }

匿名函數(shù)

首先得知道什么是匿名函數(shù),一般的函數(shù)是這樣的

func 函數(shù)名(...)(返回)

匿名函數(shù)就是沒有函數(shù)名,例如

func (...)(返回)

閉包

Go 語言支持匿名函數(shù),可作為閉包。匿名函數(shù)是一個"內(nèi)聯(lián)"語句或表達(dá)式。匿名函數(shù)的優(yōu)越性在于可以直接使用函數(shù)內(nèi)的變量,不必申明。

以下實例中,我們創(chuàng)建了函數(shù) getSequence() ,返回另外一個函數(shù)。該函數(shù)的目的是在閉包中遞增 i 變量,代碼如下:

課程拓?fù)渑判?#xff08;dfs)
package mainimport ("fmt""sort" )var prereqs = map[string][]string{"algorithms": {"data structures"},"calculus": {"linear algebra"},"compilers": {"data structures","formal languages","computer organization",},"data structure": {"discrete math"},"discrete math": {"intro to programming"},"databases": {"data structures"},"formal languages": {"discrete math"},"networks": {"operating systems"},"operating systems": {"data structures", "computer organization"},"programming languages": {"data structures", "computer organization"}, }func topoSort(m map[string][]string) []string {var order []stringseen := make(map[string]bool)var findAll func(s []string)findAll = func(s []string) {for _, v := range s {if !seen[v] {seen[v] = truefindAll(m[v])order = append(order, v)}}}var keys []stringfor k, _ := range m {keys = append(keys, k)}sort.Strings(keys)findAll(keys)return order }func main() {for i, v := range topoSort(prereqs) {fmt.Printf("%d\t%s\n", i, v)} }

注意得先聲明var findAll func(s []string),不然在匿名函數(shù)中無法調(diào)用自己。

函數(shù)的作用域陷阱

看看下面這段代碼,大概意思是先打印所有的tempdir,然后會有一個匿名函數(shù),匿名函數(shù)的作用也是打印位于循環(huán)內(nèi)結(jié)構(gòu)的d??此茮]什么問題把,看看打印結(jié)果

func main() {var rmdirs []func()for _, d := range os.TempDir() {fmt.Println(d)rmdirs = append(rmdirs, func() {fmt.Print("func:")fmt.Println(d)})}for _, dir := range rmdirs {dir()} } 67 58 92 85 115 101 114 115 92 77 121 72 111 112 101 92 65 112 112 68 97 116 97 92 76 111 99 97 108 92 84 101 109 112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112 func:112

為啥匿名函數(shù)的輸出全是112?

func的輸出似乎都被for的最后一個元素給覆蓋了,為什么?

因為我們知道閉包可以用上面的局部變量,可以知道當(dāng)我們在下面的for循環(huán)中使用的局部變量是for循環(huán)中最后一次的。

正確的代碼?

package mainimport ("fmt""os" )func main() {var rmdirs []func()for _, d := range os.TempDir() {dir := dfmt.Println(dir)rmdirs = append(rmdirs, func() {fmt.Print("func:")fmt.Println(dir)})}for _, dir := range rmdirs {dir()} }

變長函數(shù)

變長函數(shù)可以接受長度變化的參數(shù)。

package mainimport "fmt"func test(vals ...int) {fmt.Println(vals) }func main() {test(1)test(1, 2)test(1, 2, 3)test([]int{4, 5, 6}...) }

延遲調(diào)用

defer語句可以用來調(diào)用一個復(fù)雜的函數(shù),即在函數(shù)的入口和出口設(shè)置調(diào)試行為。

當(dāng)下面代碼:

package mainimport ("log""time" )func slow(){defer trace("hello")()time.Sleep(10 * time.Second) }func trace(msg string) func(){start := time.Now()log.Printf("enter %s",msg)return func() {log.Printf("exit %s(%s)",msg,time.Since(start))} }func main() {slow() }

可以完成對trace的return函數(shù)的延時調(diào)用,一定不要忘記defer的函數(shù)后面要帶個小括號。

如果沒帶就不會調(diào)用返回的函數(shù),而是會在slow函數(shù)結(jié)束后直接調(diào)用trace。

再看另外一個例子。

func double(x int)(result int){defer func() {fmt.Printf("double(%d) = %d\n",x,result)}()time.Sleep(10 * time.Second)return x + x }

這一次雖然是defer了一個函數(shù),但仍然等到了double結(jié)束了才進(jìn)入函數(shù),所以可以推斷出,如果defer的函數(shù)會返回一個函數(shù),先回進(jìn)入函數(shù)取到那個返回的函數(shù),然后等待主程序return,去延時調(diào)用返回函數(shù),才會出現(xiàn)上面日志記錄的情況。

第六章(方法)

方法

func f(...)(返回) //普通方法 func (f *function)f(...)(返回) //方法屬于function

?

總結(jié)

以上是生活随笔為你收集整理的自己读Go程序设计语言的一些总结(更新ing...)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

久久99视频免费观看 | 日本69hd| 国产精品欧美久久久久无广告 | av三级av| 毛片一区二区 | 国产+日韩欧美 | 六月激情丁香 | 99视频在线精品国自产拍免费观看 | 最新日韩精品 | 国产成人精品一区二区三区福利 | 成人在线观看免费 | 天天综合网在线 | 黄色在线观看www | 日本黄色免费电影网站 | 97人人人 | 一级欧美一级日韩 | 免费视频91蜜桃 | 欧美男女爱爱视频 | 色婷婷激情 | 91人人澡人人爽 | 91色影院 | 91精品国产自产91精品 | 青青河边草免费观看完整版高清 | 综合在线亚洲 | 日韩欧美在线一区 | 欧美aaa级片| 天天激情天天干 | 黄污污网站 | 日韩91av| 色欧美成人精品a∨在线观看 | 日本一区二区三区视频在线播放 | 91入口在线观看 | 国产热re99久久6国产精品 | 四虎5151久久欧美毛片 | 在线播放 亚洲 | 久久伊人免费视频 | 草久久久久久久 | 91视频在线自拍 | 在线看一区二区 | 久久超碰免费 | 视频福利在线 | 国产精品理论片在线观看 | 久久九九免费视频 | 久久综合五月天婷婷伊人 | 国产高清成人 | 亚洲va欧洲va国产va不卡 | 欧美日韩国产mv | 亚洲精品动漫在线 | 亚洲成人网在线 | 国产午夜小视频 | 嫩草91影院| 视频一区视频二区在线观看 | 国产在线观看地址 | 国产精品二区在线 | 天天色天天射综合网 | 久久久久久久久久网站 | 在线中文字母电影观看 | 亚洲麻豆精品 | 国产精品毛片久久久久久久久久99999999 | 国产精品涩涩屋www在线观看 | 91资源在线 | 五月婷婷开心 | 色999视频| 日韩欧美高清不卡 | 中文字幕 国产 一区 | 国产在线精品国自产拍影院 | 亚洲激情综合网 | 欧美人操人 | 色综合天| 美女精品久久久 | av在线播放快速免费阴 | www.888av| 日日操网站 | 不卡中文字幕在线 | 伊人va| 91天堂影院 | 久久影视中文字幕 | 欧美一级大片在线观看 | 久插视频 | 国内精品视频一区二区三区八戒 | 欧美激情综合色综合啪啪五月 | 国产又黄又硬又爽 | 国产美女在线精品免费观看 | 久久爱综合 | 夜夜干夜夜 | 99精品视频网站 | 日韩91av| 超级av在线| 激情av网址 | 欧美日韩视频免费看 | 97精品久久人人爽人人爽 | 欧美日韩视频免费 | 日韩国产精品久久 | 久久久久草| 亚洲资源视频 | 欧美aa一级片 | 亚洲精品福利在线 | 在线黄色观看 | 久久久这里有精品 | 在线看v片成人 | 日韩精品资源 | 精品欧美乱码久久久久久 | 毛片永久新网址首页 | 500部大龄熟乱视频使用方法 | 好看av在线| 日韩欧美网站 | 探花在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 六月天综合网 | 久在线观看视频 | 中文字幕欧美日韩va免费视频 | 国产精品99久久久久久有的能看 | 日韩在线无 | 久久免费视频网站 | 国产青青青 | 久久精品视频99 | 日韩欧美91 | 探花国产在线 | 日韩久久午夜一级啪啪 | 久久久久国产精品www | 亚洲精品国产精品国自 | 一区二区三区精品在线视频 | 久久精品一区 | 国产尤物在线观看 | 中文国产成人精品久久一 | 国产黄色免费看 | 国内丰满少妇猛烈精品播 | 亚洲免费小视频 | 四虎永久免费网站 | 香蕉在线视频播放网站 | 久久免费看 | 婷婷在线播放 | 91xav| 操操操人人 | 日韩欧美69 | www色| 中文字幕高清有码 | 欧美午夜久久 | 久久你懂得 | 天天干天天天天 | 日韩精品一区二区在线视频 | aaa亚洲精品一二三区 | 在线观看91精品视频 | 97国产一区二区 | 免费黄色激情视频 | 日批视频 | 激情九九| 久久视频免费观看 | 一区二区三区久久 | 国产色综合 | 91综合视频在线观看 | 一区免费在线 | 国产精品久久久久久69 | 三级视频国产 | 国产精品一区二区三区视频免费 | 黄色av电影在线观看 | 狠狠狠色丁香综合久久天下网 | 精品国产成人在线 | 国产一区二区在线视频观看 | 亚洲乱码中文字幕综合 | 久久综合中文字幕 | 欧美日韩精品免费观看视频 | 国产一区在线免费观看视频 | 久99久久| 久久av免费电影 | 免费观看www小视频的软件 | 亚洲一区久久久 | 亚洲精品视频在线免费播放 | 久久精品理论 | 999日韩| 亚洲精品网址在线观看 | 婷婷av电影 | 在线观看免费日韩 | 欧美精品久久99 | 夜夜爽天天爽 | 国产精品国产三级国产aⅴ无密码 | 国产精品久久久久久久久久直播 | 色永久免费视频 | 日韩试看 | av电影免费在线看 | 天天综合网天天 | 伊人五月天婷婷 | 在线看片成人 | 久久久久久伊人 | 久产久精国产品 | 国产亚洲在 | av直接看| 欧美午夜a | 蜜臀精品久久久久久蜜臀 | 亚洲视频精品在线 | 一区二区三区久久 | 国产+日韩欧美 | 国产自产在线视频 | 日韩中文字幕在线看 | 丁香六月中文字幕 | 亚洲精品欧美成人 | 久久成熟 | 干综合网 | 天天爱av导航 | 日本中文字幕在线看 | 亚洲国产精品成人va在线观看 | 久久曰视频 | 成人免费看视频 | 亚洲一级电影在线观看 | 在线久热 | 亚洲视频2 | 国产中文字幕在线视频 | 日韩激情第一页 | 日韩欧美网站 | 91超国产 | 六月婷婷久香在线视频 | 能在线观看的日韩av | 狠狠色丁香久久婷婷综合五月 | 亚洲天堂精品 | 激情av资源| 色偷偷88888欧美精品久久久 | 久久人人97超碰精品888 | 久久久99精品免费观看乱色 | 国产精品第7页 | 亚洲视频在线观看网站 | 久久综合桃花 | 国产视频精选 | 日韩综合色 | 国产亚洲在线 | 亚洲精品国产精品乱码在线观看 | 黄色动态图xx | 国产精品国产亚洲精品看不卡15 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 97超碰资源 | 97人人澡人人爽人人模亚洲 | 欧美日韩国产精品一区二区亚洲 | 麻豆一二三精选视频 | 亚洲综合五月 | 天天干天天色2020 | 久久久久久国产精品亚洲78 | 999免费视频 | 日本精品久久久久久 | 欧美亚洲成人免费 | 国产精品一区二区中文字幕 | 最新日韩视频在线观看 | 久草在线精品观看 | av久久久久久 | 国产精品免费一区二区 | 亚洲精品午夜久久久久久久 | av一区在线播放 | 色偷偷人人澡久久超碰69 | 中文av资源站 | av电影av在线 | 91在线免费播放 | 8x成人在线| 一区三区视频 | 久久综合影院 | 波多野结衣资源 | 人成电影网 | 欧美一区二区日韩一区二区 | www.亚洲在线| 在线观看视频三级 | 日本狠狠色| 天天躁日日躁狠狠躁 | 免费在线观看一级片 | 中文字幕久久精品亚洲乱码 | 91中文字幕网| 激情在线五月天 | 日韩一区二区免费视频 | 国产黄色片网站 | 激情视频一区二区三区 | 久草视频精品 | 人人澡人人添人人爽一区二区 | 成人av影视| 午夜视频在线观看网站 | 久久96国产精品久久99漫画 | 欧美日韩视频网站 | 久久精品中文字幕免费mv | 99riav1国产精品视频 | 91在线免费视频观看 | 91精品免费看 | 国产69精品久久久久久久久久 | 精品国产一区二区三区蜜臀 | 国产麻豆视频网站 | 精品在线亚洲视频 | 又黄又色又爽 | 成人avav| 久久66热这里只有精品 | 又爽又黄在线观看 | 欧美黄色成人 | 国产丝袜一区二区三区 | 成人免费看片网址 | 黄色小说网站在线 | 91精品国产高清自在线观看 | 日日爱网址 | 欧美色婷 | 中文字幕视频观看 | 午夜精品导航 | 日本一区二区三区视频在线播放 | 久久久久影视 | 久久亚洲私人国产精品va | 久久99精品视频 | 成年人在线视频观看 | 国产一级特黄毛片在线毛片 | 天天操天天摸天天干 | 亚洲精品456在线播放乱码 | 天天躁日日躁狠狠躁av中文 | 色噜噜狠狠色综合中国 | 日本韩国在线不卡 | 一区二区三区 中文字幕 | 欧美激情视频一二区 | 日韩欧美一区二区三区视频 | 91成人网在线播放 | 成年人黄色免费视频 | 麻豆视频免费网站 | 最新av网址大全 | 日韩性色 | 黄色特级毛片 | 99精品在线视频观看 | 久久伊人八月婷婷综合激情 | 九九热在线精品视频 | 中文av一区二区 | 五月香视频在线观看 | 国产精品手机在线观看 | 亚洲九九九在线观看 | 国产一区免费视频 | 午夜精品久久久久久久久久久 | 国产a级免费 | 日韩亚洲国产中文字幕 | 五月天中文字幕mv在线 | 免费在线观看不卡av | 激情五月五月婷婷 | 97超碰成人 | 在线中文字母电影观看 | 午夜黄色 | 亚洲国产无 | av电影亚洲 | 久久久影院一区二区三区 | 精品久久久999 | 久草在线视频在线观看 | 亚洲精品美女久久 | 伊人久操| 九九视频精品免费 | 成人在线视频你懂的 | 亚洲三区在线 | 亚洲精品在线视频 | 国产成人精品在线观看 | 亚洲黄色片 | 射射射av | av青草 | 男女免费视频观看 | 黄色成人91 | 久久综合福利 | 九九热精品视频在线观看 | 国产夫妻性生活自拍 | 亚洲国产精品久久 | 一级免费av| 国产精品一区二区在线免费观看 | 天天操狠狠操网站 | 麻豆精品视频在线 | 久久精品久久综合 | 日韩视频二区 | 国产96在线观看 | av福利资源 | 亚洲精品免费播放 | 国产精品一区二区av影院萌芽 | 果冻av在线 | 久草免费在线观看视频 | 色网站免费在线观看 | 成片视频免费观看 | 成人一区二区三区在线观看 | 91精品免费视频 | 中文一区在线观看 | 亚洲综合色视频 | 国产探花视频在线播放 | 亚洲精品在线一区二区三区 | 成人午夜影视 | av三级在线播放 | 久久久久久久久久网站 | 国产精品视频区 | 欧美成人h版在线观看 | 黄色小视频在线观看免费 | 欧美在线一 | 免费看的黄色片 | 一区二区三区在线播放 | 狠狠干夜夜爱 | 国产日韩精品一区二区三区 | 日韩视频一 | 亚洲久草网 | 手机在线看a | 国产毛片久久久 | 欧美日韩视频在线 | 久久精品免费播放 | 综合天堂av久久久久久久 | 国产精品日韩在线播放 | 国产精品综合在线 | 悠悠av资源片 | 国产精品第一页在线 | 亚洲精品乱码久久久久久久久久 | 三级黄色欧美 | 少妇bbw搡bbbb搡bbbb | 国产一区免费视频 | 99久久精品国产亚洲 | 亚洲欧美日韩国产精品一区午夜 | 伊色综合久久之综合久久 | 91精品国产99久久久久久红楼 | 午夜精品久久久久久中宇69 | 视频一区二区视频 | 天海冀一区二区三区 | 国产精品破处视频 | 成人在线视 | 欧美黄色免费 | 国产老妇av| 国产成人免费在线观看 | 日韩有码第一页 | 成人性生交大片免费观看网站 | 99久久久久免费精品国产 | 人人超在线公开视频 | 日本中文字幕在线电影 | 黄色小说18 | 天堂在线免费视频 | 久草在线免费播放 | 日韩毛片在线免费观看 | 日韩精品一区在线播放 | 国产日韩在线观看一区 | 成人影片免费 | 国产精品自产拍在线观看网站 | 国产69久久精品成人看 | 伊人六月 | 久久夜夜夜| 国产亚洲精品久久久久久 | 在线观看日韩免费视频 | 久久69精品 | 国产精品99久久久久久久久 | 99视频精品免费观看, | 欧美一区二区在线免费观看 | 五月婷婷激情六月 | 久久久久久久久网站 | 奇米四色影狠狠爱7777 | 狠狠狠色丁香婷婷综合久久88 | 日韩国产在线观看 | 免费视频久久久久久久 | 日本黄色免费观看 | 亚洲黄色免费在线看 | 成人久久久久久久久 | 国产精品99爱 | 欧美淫aaa免费观看 日韩激情免费视频 | 99精品一区二区 | 欧美精品在线免费 | 黄色片亚洲 | 99色免费视频 | 国产精品免费麻豆入口 | 香蕉久草 | 久久久久一区 | 欧美大片在线看免费观看 | 日韩在线观看视频在线 | 综合久久一本 | 亚洲va天堂va欧美ⅴa在线 | 五月婷在线播放 | 91porny九色91啦中文 | 国产成人在线精品 | 天天狠狠| 日韩在线无 | 国产精品久久久久永久免费 | 国产精成人品免费观看 | 二区三区在线观看 | 国产精品精品久久久久久 | 96亚洲精品久久久蜜桃 | 国产免费作爱视频 | 天天射日 | 99色亚洲| 色久av | 免费精品在线观看 | 五月婷婷开心中文字幕 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 久久www免费人成看片高清 | 亚洲电影久久久 | 亚洲va欧美va人人爽春色影视 | 五月婷婷色丁香 | 日韩视频中文字幕 | 中文在线免费一区三区 | 国产淫片 | 一区二区精 | 国产高清视频在线免费观看 | 激情丁香久久 | 色婷婷狠狠五月综合天色拍 | 欧美激情精品久久久久久免费 | 五月天综合在线 | av一区二区三区在线 | 中文字幕国产一区 | 人人超碰97 | 久久成人午夜视频 | 午夜免费福利视频 | 免费观看性生活大片 | 中文字幕影片免费在线观看 | 欧美analxxxx| 国产精品久久久久久一区二区三区 | 精品久久中文 | 中文字幕乱码电影 | 欧美日韩中 | a级一a一级在线观看 | 日韩久久精品一区二区三区 | 国产日女人 | www好男人 | 久久看毛片 | 一区二区中文字幕在线观看 | 亚洲精品国产拍在线 | 在线免费色视频 | 91精品国产综合久久久久久久 | 91在线精品秘密一区二区 | 精品国产一区二区三区蜜臀 | 亚洲国产婷婷 | 五月天中文在线 | 欧美日韩高清不卡 | 久久福利精品 | 性日韩欧美在线视频 | 日韩国产高清在线 | 免费精品人在线二线三线 | 91网站观看| 手机av观看| japanese黑人亚洲人4k | 成人黄色大片网站 | 青草视频在线播放 | 国产精品第54页 | 久久精品视频99 | 久久最新网址 | 成人黄色在线观看视频 | 久久国产热视频 | 在线播放一区二区三区 | 色播五月激情综合网 | 国产一级在线免费观看 | 色综合激情网 | 欧美孕妇与黑人孕交 | 国产视频一二区 | 伊人影院av| 亚洲精品国产综合久久 | a资源在线| 波多野结衣视频一区二区三区 | 99精品视频中文字幕 | 欧美精品国产综合久久 | 精品国产乱码久久久久久三级人 | 国产成人精品综合久久久 | 爱色婷婷 | 欧美巨大荫蒂茸毛毛人妖 | 亚洲情影院 | 中文字幕亚洲综合久久五月天色无吗'' | 四虎影视av| 麻豆91网站| 欧美国产不卡 | 久久久久久美女 | 在线观看视频色 | 91网站在线视频 | 欧美一级性视频 | 五月激情婷婷丁香 | 亚洲精品一区二区网址 | 国产一级片观看 | 国产 日韩 欧美 在线 | 欧美久久久久久久 | 99电影456麻豆 | 九九热只有这里有精品 | 六月丁香六月婷婷 | 激情久久综合网 | 欧美日韩天堂 | 国产视频一区二区在线播放 | 亚洲乱亚洲乱亚洲 | 一级久久久| 国产精品高清在线 | 日日躁夜夜躁xxxxaaaa | www.eeuss影院av撸 | 国产午夜精品视频 | 在线91精品 | 精品一区欧美 | 欧美日韩一级视频 | 九色91av| 69热国产视频 | 美女久久一区 | 正在播放五月婷婷狠狠干 | 亚洲区视频在线 | 日韩性网站 | 一本一本久久a久久精品综合 | 天天天天爽 | 精品免费久久久久久 | 日韩两性视频 | 久久久久国产精品视频 | 国产理伦在线 | 丁香六月婷婷开心 | 超碰成人免费电影 | 综合网天天射 | 伊人成人激情 | 成年在线观看 | 欧美经典久久 | 国产 视频 久久 | av综合网址 | 97操操| 成人免费看电影 | 一区二区三区 亚洲 | av免费福利 | 在线天堂v | 国产一级一片免费播放放 | 最近中文字幕大全 | 欧美一级艳片视频免费观看 | 深爱婷婷| 97av视频在线观看 | 欧美日韩性 | 成人毛片一区二区三区 | 在线视频欧美日韩 | 免费av成人在线 | ww亚洲ww亚在线观看 | 黄色一级大片在线免费看产 | 国产精品久久综合 | 国产日韩精品欧美 | 久久久久久久国产精品影院 | 国产玖玖在线 | 一区二区中文字幕在线播放 | 精品美女久久久久 | 黄色a视频免费 | 久久综合给合久久狠狠色 | 中文在线www | 91av视频在线观看免费 | 日本精品视频网站 | 青青射 | 国产亚洲欧美一区 | 国产又粗又猛又爽又黄的视频先 | 黄污视频大全 | 免费在线成人av电影 | 在线视频免费观看 | 99久热在线精品视频观看 | 欧美另类亚洲 | 中文字幕一区在线观看视频 | 久草观看 | 国产1级视频 | 97手机电影网 | 99理论片 | 五月天堂色 | 国产在线欧美 | 欧美日韩久 | 日韩午夜在线观看 | 97人人超碰在线 | 日韩免费高清 | 久久香蕉影视 | 亚洲天堂网视频在线观看 | 综合色伊人 | 亚洲性xxxx | 天天人人 | 色姑娘综合天天 | 狠狠狠干狠狠 | 久久九九久久精品 | 五月婷婷天堂 | 天天五月天色 | 亚洲欧美日韩精品久久久 | 亚洲国产wwwccc36天堂 | 久久草网 | 国产网红在线观看 | 伊人资源视频在线 | 天天曰天天曰 | 天天干天天做天天爱 | 久久a国产 | 久久久www免费电影网 | 久久久网页 | 亚洲一区二区三区四区精品 | 亚洲成人国产 | 精品在线观看一区二区 | 日韩在线视频网 | 国内精品久久久久久中文字幕 | 色综合天天综合网国产成人网 | 日韩欧美在线观看一区 | 国产精品美女久久久久aⅴ 干干夜夜 | 97视频在线免费播放 | 欧美夫妻生活视频 | 综合网婷婷 | 中文字幕在线播放av | 欧美人zozo | 91精品国产自产在线观看永久 | 久久中文字幕视频 | 91资源在线播放 | 国产精品免费人成网站 | 99久免费精品视频在线观看 | 免费在线观看成人小视频 | 一级黄色片在线 | 亚洲国产精品视频 | 最近日本中文字幕a | 国产一区在线免费观看视频 | 欧美日韩一级久久久久久免费看 | 亚洲性xxxx | 中文字幕乱码亚洲精品一区 | 日韩免费视频在线观看 | 婷婷久月 | 久久久久蜜桃 | 久久国产精品网站 | 欧美aaa大片 | 一区二区久久 | 色综合天天综合在线视频 | 天天操天天操天天操天天 | se视频网址 | www四虎影院 | 日韩毛片久久久 | 久久综合精品一区 | 国产成人一区二区三区影院在线 | 色av男人的天堂免费在线 | 天天色天天干天天色 | 国产二区av | 色婷婷综合久久久久 | 日本三级香港三级人妇99 | 中文字幕 国产精品 | 日韩视频在线观看免费 | 视频91在线 | 国产999久久久 | 色综合天天狠狠 | 亚洲国产大片 | 九九热精品在线 | 天天操天天干天天玩 | 国产91成人在在线播放 | 国产美女视频免费 | 中文在线a√在线 | 久久久高清视频 | 久草在线观看视频免费 | 精品在线不卡 | 亚洲美女视频在线观看 | 激情婷婷色 | 精品久久久久久久久久岛国gif | 天天射天天干天天操 | 免费成人av | 国产精品国产三级国产aⅴ9色 | 探花视频免费观看 | 五月花激情| 亚洲美女在线国产 | 亚洲色图 校园春色 | 精品久久久久亚洲 | 人人干天天干 | 波多野结衣网址 | 综合婷婷丁香 | 日韩三区在线观看 | 久久网站最新地址 | 欧美性天天 | 六月激情丁香 | 成 人 黄 色 视频 免费观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 中文字幕在线观看一区二区 | 久久不卡av | 国产精品一区二区免费在线观看 | 成人av网页| 在线免费观看的av网站 | 蜜臀av性久久久久蜜臀aⅴ四虎 | av888.com| 国产中文伊人 | 日韩动漫免费观看高清完整版在线观看 | www.xxxx欧美| 五月天久久狠狠 | 国产视频欧美视频 | 国产一级一片免费播放放 | 欧洲视频一区 | 24小时日本在线www免费的 | aⅴ精品av导航 | 色婷婷激情综合 | 97在线视 | 久久久久观看 | 亚州精品在线视频 | 九九亚洲视频 | 久久精品99精品国产香蕉 | 免费看黄20分钟 | 永久免费精品视频 | 亚洲国产69 | 在线观看中文字幕dvd播放 | 成人资源在线 | 免费观看黄色12片一级视频 | 综合网成人 | 国产视频 亚洲精品 | 精品欧美小视频在线观看 | 成人网444ppp | 美女黄网久久 | 在线观看的黄色 | 视频一区亚洲 | 婷婷综合影院 | 99久久99精品 | 国产精品久久久久亚洲影视 | 亚洲天堂激情 | 一本一本久久a久久精品综合 | 很黄很污的视频网站 | 国产精品av在线 | 欧美日韩精品综合 | 91av在线免费视频 | 99精品热视频只有精品10 | 亚洲最新视频在线播放 | 99久久精品免费看国产 | 精品国产色| 欧美激情综合色综合啪啪五月 | 色在线网| 国产精品在线看 | 成人a在线观看高清电影 | 久久人操| 91精品国产麻豆国产自产影视 | 免费在线一区二区三区 | 免费日韩 精品中文字幕视频在线 | 毛片基地黄久久久久久天堂 | 伊人网综合在线观看 | 精品96久久久久久中文字幕无 | av东方在线 | 久久午夜精品影院一区 | 性色av一区二区三区在线观看 | 亚洲精品久久激情国产片 | 国产 一区二区三区 在线 | 91精品国| 国产精品精品 | 亚洲国产精品一区二区久久,亚洲午夜 | 日韩,中文字幕 | 亚洲午夜久久久久久久久 | 五月婷婷丁香 | 国产精品久久久久久久久久久免费看 | 欧美日韩观看 | 久久久免费高清视频 | 激情综合啪 | 久久久精品久久 | 亚洲一级片在线看 | 手机在线看永久av片免费 | 精品中文字幕在线播放 | 久久久久久久久久久久99 | 91精品天码美女少妇 | 在线观看日本高清mv视频 | 91亚洲网站 | 日本夜夜草视频网站 | 精品免费观看视频 | 久在线观看 | 狠狠地日 | 丁香六月激情婷婷 | 亚洲高清免费在线 | 草久视频在线 | 不卡av在线播放 | 中文av在线播放 | 免费在线色视频 | 在线导航av | 九色在线视频 | 在线视频免费观看 | 久草视频免费在线播放 | 天天射网站 | 伊人永久 | 久久不卡国产精品一区二区 | 黄色小说网站在线 | 又黄又爽的免费高潮视频 | 中文av在线天堂 | 中日韩三级视频 | 国产四虎在线 | 久久精品一二三区 | 狠狠干五月天 | 亚洲欧美综合 | 九九热国产| 欧美大荫蒂xxx | 97夜夜澡人人双人人人喊 | 久久激情日本aⅴ | 中文字幕专区高清在线观看 | 玖玖精品视频 | 久久久久久久毛片 | 成人99免费视频 | ,久久福利影视 | 欧美人zozo | 99久久精品午夜一区二区小说 | 麻豆一精品传二传媒短视频 | 日韩综合精品 | 亚洲电影久久久 | 九九久久精品视频 | 久操中文字幕在线观看 | 国产在线观看你懂得 | 日韩精品在线观看视频 | 欧美精品一级视频 | 国产午夜三级一区二区三 | 欧洲一区精品 | 日日摸日日碰 | 亚洲国产wwwccc36天堂 | 国产精品手机在线观看 | 91精品国产成人观看 | 人人玩人人弄 | 久久久国产精品一区二区三区 | 久在线观看视频 | 天天操天天射天天舔 | 国产一级久久 | 狠狠色丁香婷婷综合欧美 | 日三级在线 | 在线观看日韩av | 少妇性aaaaaaaaa视频 | 色婷婷 亚洲 | 9797在线看片亚洲精品 | 日韩剧情 | 自拍超碰在线 | 国产乱对白刺激视频在线观看女王 | 免费精品在线观看 | 亚洲97在线| 亚洲va综合va国产va中文 | 天天色播 | 国产不卡在线 | 国产99久久久国产 | 日韩在线免费电影 | 国产精品区免费视频 | 午夜 免费 | 香蕉视频最新网址 | 91精品天码美女少妇 | 最新国产精品久久精品 | 日韩精品不卡在线 | 久久欧美综合 | 亚洲国产97在线精品一区 | 特级黄色一级 | 精品三级av | 少妇高潮冒白浆 | 中文字幕永久免费 | 成人资源网 | 午夜在线免费观看视频 | 91看片黄色 | 中文字幕av在线电影 | 亚洲在线观看av | 就操操久久 | 不卡国产在线 | 天天天综合 | 日日碰夜夜爽 | japanesexxxxfreehd乱熟 | 亚洲国产精品va在线 | 一色屋精品视频在线观看 | 亚洲黄色一级大片 | 国产亚洲精品成人av久久影院 | 美女国产| 精品主播网红福利资源观看 | 国产黄免费 | 超碰九九 | 国产二区精品 | 亚洲,国产成人av | 国产一区二区中文字幕 | 日韩免费三区 | 天天综合在线观看 | 亚洲婷婷网| 高清av免费一区中文字幕 | 日日夜夜狠狠 | 99免费精品 | 999国产精品视频 | 国产精品亚洲a | 日韩免费视频线观看 | 亚洲少妇影院 | 一区二区中文字幕在线播放 | 玖草影院| 中文字幕在线日 | 国产免费又爽又刺激在线观看 | 色婷婷88av视频一二三区 | 久久久久麻豆 | 久久99亚洲精品久久 | 日韩特黄av | 丁香六月网| 国产99精品在线观看 | 欧美日韩国产精品一区 | 九九视频精品在线 | 经典三级一区 | 亚洲精品视频偷拍 | 天天综合网天天综合色 | 青春草视频 | 亚洲高清视频在线观看免费 | 亚洲综合爱 | 黄色国产在线观看 | 久久久综合 | www好男人 | 国产九色在线播放九色 | 久久国产精品99久久人人澡 | 亚洲精品在线观看不卡 | 久久久国产影院 | 亚洲国产精品成人精品 | 亚洲精品在线国产 | 91色在线观看视频 | 果冻av在线 | 国产成人免费 | 国产精品视频app | 国产一线二线三线性视频 | 国产精品久久在线观看 | 四虎在线观看精品视频 | 成人午夜电影免费在线观看 | 一区二区三区国产精品 | 久久69av | 久久无码精品一区二区三区 | 国产精品麻豆三级一区视频 | 欧美精品中文字幕亚洲专区 | 99久久国产免费免费 | 亚洲理论视频 | 91福利视频免费观看 | 黄在线免费看 | 日韩三级免费观看 | 天天干天天操天天干 | 九九精品视频在线观看 | 毛片网免费 | 又黄又爽的免费高潮视频 | www.玖玖玖 | 国产a级免费| 永久免费的av电影 | 91精品老司机久久一区啪 | 激情综合狠狠 | 中文字幕av网站 | 久久国产欧美日韩精品 | 97超碰中文字幕 | 欧美黑人xxxx猛性大交 | 五月婷婷久久丁香 | 久久艹中文字幕 | 国产成人精品亚洲 | 久久久麻豆精品一区二区 | 亚洲电影一级黄 | 国产精久久久久久久 | 最近免费中文字幕 | 成人a在线观看高清电影 | 国产精品一区二区三区四区在线观看 | 97精品国产97久久久久久 | 婷婷色社区 | 色狠狠操 |