精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 1.13 相比 Go 1.12 有哪些值得注意的改動?

開發 前端
Go 1.13 中 ??sync?? 包的改進提升了常用同步原語的性能,并使 ??sync.Pool?? 在高并發和頻繁 GC 的場景下表現更加穩定和高效。

https://go.dev/doc/go1.13

Go 1.13 帶來了一系列語言、工具鏈、運行時和標準庫的改進。以下是一些值得開發者關注的重點改動:

  • 語言特性 : 引入了更統一和現代化的數字字面量表示法,包括二進制 (0b)、八進制 (0o) 前綴、十六進制浮點數、數字分隔符 (_) 等,并取消了移位操作計數必須為無符號數的限制。
  • Go Modules 與 Go 命令 : GO111MODULE=auto 在檢測到 go.mod 文件時將默認啟用模塊感知模式,即使在 GOPATH 內;引入 GOPRIVATE 等環境變量更好地管理私有模塊和代理配置;go get -u 的更新邏輯有所調整;go 命令增加了如 go env -wgo version <executable>go build -trimpath 等新功能。
  • Runtime 運行時 : 優化了切片越界時的 panic 信息,使其包含越界索引和切片長度;defer 的性能在大多數場景下提升了約 30%;運行時會更積極地將不再使用的內存歸還給操作系統。
  • 錯誤處理 : 正式引入了 錯誤包裝(error wrapping)機制,通過 fmt.Errorf 的新 %w 動詞和 errors 包新增的 UnwrapIsAs 函數,可以創建和檢查包含原始錯誤上下文的錯誤鏈。
  • sync 包 : 通過內聯優化,sync.Mutexsync.RWMutex 和 sync.Once 在非競爭情況下的性能得到提升(鎖操作約 10%,Once.Do 約 2 倍);sync.Pool 對 GC 暫停時間(STW)的影響減小,并且能在 GC 后保留部分對象,減少 GC 后的冷啟動開銷。

下面是一些值得展開的討論:

語言特性:更現代化的數字字面量與有符號位移

Go 1.13 在語言層面引入了幾項旨在提升代碼可讀性和易用性的改進。

首先是數字字面量的增強:

  • 二進制字面量 (Binary Literals) : 使用前綴 0b 或 0B 表示二進制整數,例如 0b1011 代表十進制的 11。
  • 八進制字面量 (Octal Literals) : 使用前綴 0o 或 0O 表示八進制整數,例如 0o660 代表十進制的 432。需要注意的是,舊式的以 0 開頭的八進制表示法(如 0660)仍然有效,但推薦使用新的 0o 前綴以避免歧義。
  • 十六進制浮點數字面量 (Hexadecimal Floating-point Literals) : 允許使用 0x 或 0X 前綴表示浮點數的尾數部分,但必須帶有一個以 p 或 P 開頭的二進制指數。例如 0x1.0p-2 表示 ,即 0.25。
  • 虛數字面量后綴 (Imaginary Literals) : 虛數后綴 i 現在可以用于任何整數或浮點數字面量(二進制、八進制、十進制、十六進制),如 0b1011i0o660i3.14i0x1.fp+2i
  • 數字分隔符 (Digit Separators) : 可以使用下劃線 _ 來分隔數字,以提高長數字的可讀性,例如 1_000_0000b_1010_0110 或 3.1415_9265。下劃線可以出現在任意兩個數字之間,或者前綴和第一個數字之間。
package main

import "fmt"

func main() {
    binaryNum := 0b1101 // 13
    octalNum := 0o755   // 493
    hexFloat := 0x1.Fp+2 // 1.9375 * 2^2 = 7.75
    largeNum := 1_000_000_000
    complexNum := 0xAp1 + 1_2i // (10 * 2^1) + 12i = 20 + 12i

    fmt.Println(binaryNum)
    fmt.Println(octalNum)
    fmt.Println(hexFloat)
    fmt.Println(largeNum)
    fmt.Println(complexNum)
    // 13
    // 493
    // 7.75
    // 1000000000
    // (20+12i)
}

其次,Go 1.13 取消了移位操作(<< 和 >>)的移位計數(右操作數)必須是無符號整數的限制。現在可以直接使用有符號整數作為移位計數。

這消除了之前為了滿足類型要求而進行的許多不自然的 uint 轉換。

package main

import "fmt"

func main() {
    var signedShift int = 2
    var value int64 = 100

    // Go 1.12 及之前: 需要顯式轉換為 uint
    // shiftedValueOld := value << uint(signedShift)

    // Go 1.13 及之后: 可以直接使用 signed int
    shiftedValueNew := value << signedShift

    // fmt.Println(shiftedValueOld) // 輸出 400
    fmt.Println(shiftedValueNew) // 輸出 400

    var negativeShift int = -2 // 負數移位也是允許的,但行為依賴于具體實現和架構,通常不建議
    fmt.Println(value >> negativeShift) // 行為可能非預期,輸出可能為 0 或 panic,取決于 Go 版本和具體情況
}
400
panic: runtime error: negative shift amount

goroutine 1 [running]:
main.main()
        /home/piperliu/code/playground/main.go:19 +0x85
exit status 2

需要注意的是,要使用這些新的語言特性,你的項目需要使用 Go Modules,并且 go.mod 文件中聲明的 Go 版本至少為 1.13。你可以手動編輯 go.mod 文件,或者運行 go mod edit -go=1.13 來更新。

Go Modules 與 Go 命令:模塊化體驗改進與工具增強

Go 1.13 在 Go Modules 和 go 命令行工具方面帶來了重要的改進,旨在簡化開發流程和模塊管理。

模塊行為與環境變量

  • GO111MODULE=auto 的行為變化:現在,只要當前工作目錄或其任何父目錄包含 go.mod 文件,auto 設置就會激活模塊感知模式。這意味著即使項目位于傳統的 GOPATH/src 目錄下,只要存在 go.modgo 命令也會優先使用模塊模式。這極大地簡化了從 GOPATH 遷移到 Modules 的過程以及混合管理兩種模式項目的場景。
  • 新的環境變量 GOPRIVATEGONOPROXYGONOSUMDB:為了更好地處理私有模塊(例如公司內部的代碼庫),引入了 GOPRIVATE 環境變量。它用于指定一組不應通過公共代理 (GOPROXY) 下載或通過公共校驗和數據庫 (GOSUMDB) 驗證的模塊路徑模式(支持通配符)。GOPRIVATE 會作為 GONOPROXY 和 GONOSUMDB 的默認值,提供更細粒度的控制。
  • GOPROXY 默認值與配置:GOPROXY 環境變量現在支持逗號分隔的代理 URL 列表,以及特殊值 direct(表示直接連接源倉庫)。其默認值更改為 https://proxy.golang.org,directgo 命令會按順序嘗試列表中的每個代理,直到成功下載或遇到非 404/410 錯誤。
  • GOSUMDB:用于指定校驗和數據庫的名稱和可選的公鑰及 URL。默認值為 sum.golang.org。如果模塊不在主模塊的 go.sum 文件中,go 命令會查詢 GOSUMDB 以驗證下載模塊的哈希值,確保依賴未被篡改。可以設置為 off 來禁用此檢查。

對于無法訪問公共代理或校驗和數據庫的環境(如防火墻內),可以使用 go env -w 命令設置全局默認值:

# 僅直接從源倉庫下載,不使用代理
go env -w GOPROXY=direct

# 禁用校驗和數據庫檢查
go env -w GOSUMDB=off

# 配置私有模塊路徑 (示例)
go env -w GOPRIVATE=*.corp.example.com,github.com/my-private-org/*

go get 行為調整

  • go get -u 的更新范圍:在模塊模式下,go get -u (不帶包名參數時)現在只更新當前目錄包的直接和間接依賴。這與 GOPATH 模式下的行為更一致。如果要更新 go.mod 中定義的所有依賴(包括測試依賴)到最新版本,應使用 go get -u all
  • go get -u <package> 的更新范圍:當指定包名時,go get -u <package> 會更新指定的包及其導入的包所在的模塊,而不是這些模塊的所有傳遞依賴。
  • @patch 版本后綴:go get 支持了新的 @patch 版本后綴。例如 go get example.com/mod@patch 會將 example.com/mod 更新到當前主版本和次版本下的最新補丁版本。
  • @upgrade 和 @latest@upgrade 明確要求將模塊升級到比當前更新的版本(如果沒有新版本則保持不變,防止意外降級預發布版本)。@latest 則總是嘗試獲取最新的發布版本,無論當前版本如何。

版本校驗增強

go 命令在處理模塊版本時增加了更嚴格的校驗:

  • +incompatible 版本:如果一個倉庫使用了 +incompatible 標記(通常用于 Modules 出現之前的 v2+ 版本),go 命令現在會驗證該版本對應的代碼樹中 不能 包含 go.mod 文件。
  • 偽版本 (Pseudo-versions):對形如 vX.Y.Z-yyyymmddhhmmss-abcdefabcdef 的偽版本格式進行了更嚴格的校驗,確保版本前綴、時間戳和 commit 哈希與版本控制系統的元數據一致。如果 go.mod 中有無效的偽版本,通常可以通過將其簡化為 commit 哈希(如 require example.com/mod abcdefabcdef)然后運行 go mod tidy 或 go list -m all 來自動修正。對于傳遞依賴中的無效版本,可以使用 replace 指令強制替換為有效的版本或 commit 哈希。

其他 go 命令改進

  • go env -w 和 -u:允許設置和取消設置 go 命令環境變量的用戶級默認值,存儲在用戶配置目錄下的 go/env 文件中。
  • go version <executable> 或 <directory>:可以查看 Go 二進制文件是用哪個 Go 版本編譯的(使用 -m 標志可查看嵌入的模塊信息),或查看目錄及其子目錄下所有 Go 二進制文件的版本信息。
  • go build -trimpath:一個新的構建標志,用于從編譯出的二進制文件中移除所有本地文件系統路徑信息,有助于提高構建的可復現性。

錯誤處理:官方錯誤包裝(Error Wrapping)機制

Go 1.13 引入了一個重要的原生機制來處理錯誤: 錯誤包裝 (error wrapping) 。這個特性解決了長期以來在 Go 中處理錯誤時的一個痛點:如何在添加上下文信息的同時,保留底層原始錯誤以便進行程序化檢查。

問題背景

在 Go 1.13 之前,當一個函數遇到來自底層調用的錯誤,并想添加更多關于當前操作的上下文信息時,通常的做法是使用 fmt.Errorf 創建一個新的錯誤字符串,包含原始錯誤的信息(通過 %v 或 err.Error())。

// Go 1.13 之前的常見做法
func readFile(path string) error {
    f, err := os.Open(path)
    if err != nil {
        // 創建了新錯誤,丟失了原始 err 的類型信息 (如 *os.PathError)
        return fmt.Errorf("failed to open file %q: %v", path, err)
    }
    // ...
    defer f.Close()
    return nil
}

func checkPermission() {
    err := readFile("/path/to/protected/file")
    // 無法直接判斷 err 是否是權限錯誤,因為原始的 os.ErrPermission 信息丟失了
    // if err == os.ErrPermission { ... } // 這通常行不通
}

這種方式的問題在于,返回的錯誤是一個全新的 string 類型的錯誤(由 fmt.Errorf 創建),原始錯誤的類型信息(例如 *os.PathError)和值(例如 os.ErrNotExist)丟失了。調用者無法方便地檢查錯誤的根本原因,例如判斷它是不是一個特定的錯誤類型或哨兵錯誤值(sentinel error)。

Go 1.13 的解決方案:%wUnwrapIsAs

Go 1.13 通過以下方式解決了這個問題:

fmt.Errorf 的 %w 動詞

fmt.Errorf 函數增加了一個新的格式化動詞 %w。當使用 %w 來格式化一個錯誤時,fmt.Errorf 會創建一個新的錯誤,這個新錯誤不僅包含了格式化后的字符串信息,還 包裝 (wrap) 了原始的錯誤。這個包裝后的錯誤會實現一個 Unwrap() error 方法,該方法返回被包裝的原始錯誤。

package main

import (
    "errors"
    "fmt"
    "os"
    "io/fs" // fs.ErrNotExist 在 Go 1.16 引入,之前是 os.ErrNotExist
)

// queryDatabase 模擬數據庫查詢錯誤
var ErrDBConnection = errors.New("database connection failed")

func queryDatabase(query string) error {
    // 模擬連接失敗
    return ErrDBConnection
}

// handleRequest 處理請求,調用數據庫查詢
func handleRequest(req string) error {
    err := queryDatabase(req)
    if err != nil {
        // 使用 %w 包裝原始錯誤 ErrDBConnection
        return fmt.Errorf("failed to handle request '%s': %w", req, err)
    }
    return nil
}

// readFileWithErrorWrapping 示例
func readFileWithErrorWrapping(path string) error {
    _, err := os.Open(path)
    if err != nil {
        // 使用 %w 包裝 os.Open 返回的錯誤
        return fmt.Errorf("error opening file %s: %w", path, err)
    }
    return nil
}


func main() {
    // 場景1:檢查特定的哨兵錯誤
    err := handleRequest("SELECT * FROM users")
    if err != nil {
        fmt.Printf("Original error: %v\n", err) // 輸出包含包裝信息

        // 使用 errors.Is 檢查錯誤鏈中是否包含 ErrDBConnection
        if errors.Is(err, ErrDBConnection) {
            fmt.Println("Error check passed: The root cause is ErrDBConnection.")
        } else {
            fmt.Println("Error check failed: The root cause is NOT ErrDBConnection.")
        }
    }

    fmt.Println("---")

    // 場景2:檢查特定的錯誤類型并獲取其值
    errFile := readFileWithErrorWrapping("non_existent_file.txt")
    if errFile != nil {
        fmt.Printf("Original file error: %v\n", errFile)

        // 使用 errors.As 檢查錯誤鏈中是否有 *fs.PathError 類型
        // 并將該類型的錯誤值賦給 pathErr
        var pathErr *fs.PathError
        if errors.As(errFile, &pathErr) {
            fmt.Printf("Error check passed: It's a PathError.\n")
            fmt.Printf("  Operation: %s\n", pathErr.Op)
            fmt.Printf("  Path: %s\n", pathErr.Path)
            fmt.Printf("  Underlying error: %v\n", pathErr.Err) // 底層具體錯誤
        } else {
            fmt.Println("Error check failed: It's NOT a PathError.")
        }

        // 也可以用 errors.Is 檢查底層的哨兵錯誤
        if errors.Is(errFile, fs.ErrNotExist) {
   fmt.Println("Further check: The underlying error IS fs.ErrNotExist.")
        }
    }
}

errors.Unwrap(err error) error

這個函數接收一個錯誤 err。如果 err 實現了 Unwrap() error 方法,errors.Unwrap 會調用它并返回其結果(即被包裝的那個錯誤)。如果 err 沒有包裝其他錯誤,則返回 nil。這允許你手動地逐層解開錯誤鏈。

  1. errors.Is(err error, target error) bool

這是檢查錯誤鏈的首選方式。它會遞歸地解開 err 的錯誤鏈(通過調用 Unwrap),檢查鏈中的任何一個錯誤是否 等于target 哨兵錯誤值(使用 == 比較)。如果找到匹配項,返回 true。這對于檢查是否發生了某個已知的、預定義的錯誤(如 io.EOFsql.ErrNoRows, 或自定義的哨兵錯誤)非常有用。

errors.As(err error, target interface{}) bool

這也是檢查錯誤鏈的首選方式。它會遞歸地解開 err 的錯誤鏈,檢查鏈中的任何一個錯誤是否可以賦值給target 指向的類型。如果找到匹配項,它會將該錯誤值賦給 targettarget 必須是一個指向錯誤類型接口或具體錯誤類型的指針),并返回 true。這對于檢查錯誤是否屬于某個特定類型,并希望獲取該類型錯誤的具體字段信息(如 *os.PathError 的 Op 和 Path 字段)非常有用。

最佳實踐

  • 當你想給一個錯誤添加上下文,并且希望調用者能夠檢查或響應原始錯誤時,使用 fmt.Errorf 的 %w 動詞進行包裝。
  • 當你只想記錄錯誤信息,不關心調用者是否需要檢查原始錯誤時,繼續使用 %v 或 err.Error()
  • 優先使用 errors.Is 來檢查錯誤鏈中是否包含特定的哨兵錯誤值。
  • 優先使用 errors.As 來檢查錯誤鏈中是否包含特定類型的錯誤,并獲取該錯誤的值以訪問其字段。
  • 避免直接調用 Unwrap 方法,除非你有特殊需要逐層處理錯誤鏈。errors.Is 和 errors.As 通常是更健壯和方便的選擇。

錯誤包裝機制極大地增強了 Go 的錯誤處理能力,使得構建更健壯、更易于調試和維護的程序成為可能。

sync 包:性能優化與 sync.Pool 改進

Go 1.13 對 sync 包中的一些常用同步原語進行了性能優化,并改進了 sync.Pool 的行為。

鎖和 Once 的性能提升

sync.Mutex(互斥鎖)、sync.RWMutex(讀寫鎖)和 sync.Once(保證函數只執行一次)是非常基礎且常用的同步工具。

  • sync.Mutex : 用于保護臨界區,確保同一時間只有一個 goroutine 可以訪問共享資源。
var mu sync.Mutex
var counter int

func increment() {
 mu.Lock() // 獲取鎖
 defer mu.Unlock() // 保證釋放鎖
 counter++
}
  • sync.RWMutex : 允許多個讀取者同時訪問資源,但寫入者必須獨占訪問。適用于讀多寫少的場景。
var rwMu sync.RWMutex
var config map[string]string

func getConfig(key string) string {
 rwMu.RLock() // 獲取讀鎖
 defer rwMu.RUnlock() // 釋放讀鎖
 return config[key]
}

func setConfig(key, value string) {
 rwMu.Lock() // 獲取寫鎖
 defer rwMu.Unlock() // 釋放寫鎖
 config[key] = value
}
  • sync.Once : 用于確保某個初始化操作或其他需要只執行一次的動作,在并發環境下確實只執行一次。
var once sync.Once
var serviceInstance *Service

func GetService() *Service {
 once.Do(func() {
  // 初始化操作,只會在首次調用 Do 時執行
  serviceInstance = &Service{}
  serviceInstance.init()
 })
 return serviceInstance
}

在 Go 1.13 中,這些原語的 快速路徑 (fast path) (即沒有發生鎖競爭或 Once.Do 已經被執行過的情況)被 內聯 (inlined) 到了調用者的代碼中。這意味著在最常見、性能最關鍵的非競爭場景下,調用這些方法的開銷顯著降低。根據官方說明,在 amd64 架構下:

  • Mutex.LockMutex.UnlockRWMutex.LockRWMutex.RUnlock 的非競爭情況性能提升高達 10%。
  • Once.Do 在非首次執行時(即 once 已經被觸發后)的速度提升了大約 2 倍。

sync.Pool 的改進

sync.Pool 是一個用于存儲和復用臨時對象的技術,主要目的是減少內存分配次數和 GC 壓力,尤其適用于那些需要頻繁創建和銷毀、生命周期短暫的對象(如網絡連接的緩沖區、編解碼器的狀態對象等)。

var bufferPool = sync.Pool{
    New: func() interface{} {
        // New 函數用于在 Pool 為空時創建新對象
        fmt.Println("Allocating new buffer")
        return make([]byte, 4096) // 例如創建一個 4KB 的緩沖區
    },
}

func handleConnection(conn net.Conn) {
    // 從 Pool 獲取一個 buffer
    buf := bufferPool.Get().([]byte)

    // 使用 buffer ...
    n, err := conn.Read(buf)
    // ...

    // 將 buffer 放回 Pool 以便復用
    // 注意:放回前最好清理一下 buffer 內容(如果需要)
    // e.g., buf = buf[:0] or zero out parts of it
    bufferPool.Put(buf)
}

Go 1.13 對 sync.Pool 做了兩項重要改進:

  • 減少對 GC STW (Stop-The-World) 暫停時間的影響 :在之前的版本中,如果 sync.Pool 中緩存了大量對象,清理這些對象(尤其是在 GC 期間)可能會對 STW 暫停時間產生比較明顯的影響。Go 1.13 優化了 sync.Pool 的內部實現,使得即使池中對象很多,對 GC 暫停時間的影響也顯著減小。
  • 跨 GC 保留部分對象 :這是 sync.Pool 行為的一個重大變化。在 Go 1.13 之前, 每次 GC 運行時,sync.Pool 中的所有緩存對象都會被無條件清除 。這意味著每次 GC 之后,如果程序繼續請求對象,Pool 會變空,導致大量調用 New 函數來重新填充緩存,這可能在 GC 后造成短暫的性能抖動(分配和 GC 壓力增加)。

從 Go 1.13 開始,sync.Pool可以在 GC 之后保留一部分之前緩存的對象 。它使用了一個兩階段的緩存機制,主緩存池仍然會在 GC 時被清理,但會有一個備用(受害者)緩存池保留上一次 GC 清理掉的對象,供本次 GC 后使用。這樣,GC 之后 Pool 不再是完全空的,可以更快地提供緩存對象,減少了對 New 的調用頻率,從而平滑了 GC 后的性能表現,降低了負載峰值。

使用 sync.Pool 的注意事項(結合 1.13 改進)

  • sync.Pool 仍然適用于臨時對象的復用,以減少分配和 GC 壓力。
  • 由于對象現在可能跨 GC 保留,從 Pool 中 Get 到的對象可能包含上次使用時殘留的數據。因此,在使用前對其進行必要的 重置或清理 變得更加重要(例如,對于 []byte,使用 buf = buf[:0];對于結構體,清零關鍵字段)。
  • Pool 保留對象的能力并不意味著你可以用它來管理需要精確生命周期控制的資源(如文件句柄、網絡連接),這些資源通常需要顯式的 Close 方法。
  • 雖然跨 GC 保留對象減少了冷啟動開銷,但也意味著 Pool 可能會持有內存更長時間。不過,Go 1.13 運行時本身也改進了內存歸還給操作系統的策略,這在一定程度上平衡了這一點。

總的來說,Go 1.13 中 sync 包的改進提升了常用同步原語的性能,并使 sync.Pool 在高并發和頻繁 GC 的場景下表現更加穩定和高效。

責任編輯:姜華 來源: Piper蛋窩
相關推薦

2025-04-24 09:01:46

2025-04-22 08:02:23

2025-04-21 08:00:56

2025-04-14 00:00:04

2025-04-27 08:00:35

2025-04-30 09:02:46

2025-04-21 00:05:00

2025-04-27 00:00:01

Go 1.16Go 1.15接口

2025-04-21 00:00:00

Go 開發Go 語言Go 1.9

2025-04-29 08:03:18

2025-04-18 08:07:12

2025-05-06 00:00:08

2025-04-17 08:00:48

2025-05-06 08:00:35

2025-05-06 05:00:00

2025-04-14 08:06:04

2025-04-28 08:00:56

2025-04-25 08:01:12

Go應用程序部署

2025-04-15 08:00:53

2025-04-14 00:00:00

點贊
收藏

51CTO技術棧公眾號

精品一区二区国产| 97久久精品人人澡人人爽缅北| 色呦色呦色精品| 欧美人与动牲性行为| 91在线视频播放地址| 国产成人在线一区二区| 日韩欧美中文字幕视频| 奇米色欧美一区二区三区| 欧美丰满美乳xxx高潮www| 欧美啪啪免费视频| 麻豆网站在线免费观看| 99精品视频在线观看免费| 国产原创欧美精品| 国产污污视频在线观看| 亚洲综合激情在线| 亚洲视频欧洲视频| 久久无码专区国产精品s| av在线不卡精品| 天涯成人国产亚洲精品一区av| 亚洲国产另类久久久精品极度| 蜜桃在线一区二区| 久久国产乱子精品免费女| 69视频在线播放| www.色小姐com| 欧美三级三级| 亚洲精品久久视频| 激情图片中文字幕| 外国电影一区二区| 日韩欧美精品中文字幕| 国产精品一色哟哟| 久操视频在线观看| 中文字幕巨乱亚洲| 欧美一区视久久| 亚洲av成人精品一区二区三区在线播放| 极品美女销魂一区二区三区免费| 国产成人激情视频| 欧美 日韩 精品| 日韩午夜激情| 992tv成人免费视频| 欧美又粗又大又长| 午夜精品久久久久99热蜜桃导演| 日韩中文字幕视频在线| 国产视频三区四区| 精品国产一区二区三区av片| 亚洲美女免费精品视频在线观看| 中文在线观看免费视频| 亚洲综合网狠久久| 日韩精品一区二区三区中文不卡| 中文字幕一区二区在线观看视频| 国产亚洲欧美日韩精品一区二区三区| 91福利社在线观看| 北条麻妃视频在线| 欧美日韩国产网站| 欧美色视频一区| 亚洲免费999| 亚洲一区二区小说| 日韩欧美电影一二三| 韩国三级与黑人| 亚洲一级大片| 亚洲国产欧美日韩精品| 中国av免费看| 免费观看久久av| 在线视频一区二区| 好吊日在线视频| 亚洲91精品| 欧美日韩国产成人| 国产一级片播放| 国产女优一区| 国产成人一区二区三区| 中文字幕久久网| 黑人精品欧美一区二区蜜桃| 91在线播放视频| 色噜噜在线播放| 国产三区在线成人av| 亚洲一二区在线| 成年人网站在线| 亚洲大片精品永久免费| 欧美三级一级片| www.国产精品| 日韩欧美一级精品久久| 久久人妻一区二区| 欧美日韩伦理在线免费| 欧美成人第一页| 日韩精品久久久久久久| 日韩精品成人一区二区三区| 91精品国产综合久久香蕉| 成人久久久精品国产乱码一区二区| 99久久99久久精品免费看蜜桃| 奇米精品在线| 欧美高清另类hdvideosexjaⅴ| 狠狠久久亚洲欧美专区| 91精品无人成人www| 久久影院一区二区三区| 国产视频在线观看一区二区| 手机在线中文字幕| 国产一区白浆| 亚洲a区在线视频| 天堂在线免费av| 亚洲人成电影网站色mp4| 免费国产黄色网址| 亚洲狼人综合| 亚洲精品视频播放| 激情五月少妇a| 日韩成人精品视频| 国产一区二区免费电影| 毛片在线播放a| 一本一本久久a久久精品综合麻豆| 免费在线观看污网站| 亚洲免费成人av在线| 美女少妇精品视频| 波多野结衣大片| www.av精品| 亚洲精品国产suv一区88| gogo亚洲高清大胆美女人体| 欧美成人精精品一区二区频| 欧美成人久久久免费播放| 亚洲欧洲视频| 91精品国产综合久久久久久丝袜| 国产二区视频在线观看| 亚洲h动漫在线| 日日夜夜精品视频免费观看 | 视频一区中文字幕| 99国精产品一二二线| 在线视频婷婷| 欧洲一区二区三区在线| 日韩精品卡通动漫网站| 亚洲精品乱码| 国产91aaa| 高清全集视频免费在线| 欧美日韩午夜影院| 微拍福利一区二区| 久久久久免费| 欧美大香线蕉线伊人久久| 波多野结衣久久| 日韩欧美国产一区二区三区| 免费高清在线观看电视| 久久精品999| 一区二区免费在线视频| 国产成人免费| 中文字幕日韩av电影| 伊人久久中文字幕| 日本一区二区三级电影在线观看| 激情综合网婷婷| 亚洲高清极品| 日韩美女中文字幕| 精品美女视频在线观看免费软件| 精品动漫一区二区三区| 亚洲国产精品成人综合久久久| 国产精品草草| 精品国产一区二区三区久久久久久| 黄色影院在线看| 日韩av网站大全| 欧美一级片免费在线观看| 91色视频在线| 97在线免费公开视频| 经典一区二区| 国产精品美腿一区在线看| 午夜视频在线观看网站| 欧美精品黑人性xxxx| 91视频青青草| 成人黄色网址在线观看| 欧美日韩国产精品激情在线播放| 免费成人结看片| 国产精品视频男人的天堂| 午夜在线视频播放| 日韩欧美一级二级三级| 日本中文字幕免费| www久久久久| 国产九九在线视频| 伊人色**天天综合婷婷| 国产日产精品一区二区三区四区| 一个人www视频在线免费观看| 国产亚洲精品美女| 97成人在线观看| 亚洲一级二级在线| 欧美大波大乳巨大乳| 麻豆成人免费电影| 国产精品www在线观看| 精品在线观看入口| 91色在线观看| 亚洲黄色免费av| 日韩在线观看高清| 少妇一级淫片免费看| 欧美午夜在线一二页| 久草视频免费在线播放| 久久男人中文字幕资源站| 污网站免费在线| 一区在线视频观看| 亚洲一区二区三区精品视频| 99re91这里只有精品| 日韩av成人在线观看| a篇片在线观看网站| 亚洲精品一区二区三区婷婷月| 在线观看国产黄| 婷婷久久综合九色综合绿巨人| 俄罗斯毛片基地| av日韩在线网站| 中文字幕第17页| 羞羞视频在线观看欧美| 青青草综合在线| 国产精品三级| 国产精品免费看一区二区三区| 国产91欧美| 91av在线免费观看视频| 中文字幕伦理免费在线视频 | 日韩高清欧美激情| avav在线播放| 91久久久精品国产| 日本精品二区| 激情av综合| 999在线观看免费大全电视剧| 偷拍精品精品一区二区三区| 久久免费福利视频| а√天堂资源地址在线下载| 亚洲性日韩精品一区二区| 秋霞网一区二区| 欧美一区二区三区啪啪| 中文字幕第2页| 欧美日韩一区二区在线播放| 久久亚洲成人av| 中文字幕亚洲一区二区va在线| 国产在线观看h| 99久久精品费精品国产一区二区| 亚洲最大视频网| 狠狠色丁香婷婷综合| 蜜臀一区二区三区精品免费视频| 久久精品一本| 欧美日韩激情视频在线观看| 国语精品一区| 日韩欧美猛交xxxxx无码| 久久中文亚洲字幕| 视频一区视频二区视频三区视频四区国产 | av网址在线看| 日韩在线视频免费观看| av大片在线播放| 在线观看精品自拍私拍| 久久久pmvav| 亚洲欧美中文另类| 麻豆国产在线播放| 亚洲欧美综合另类中字| 可以在线观看的av网站| 国产亚洲视频在线观看| 国产精品麻豆一区二区三区| 亚洲欧洲av一区二区| 免费人成在线观看网站| 亚洲欧美一区二区精品久久久| 亚洲色图欧美视频| 亚洲男人av电影| 都市激情一区| 日韩在线免费视频观看| av片哪里在线观看| 欧美日韩999| 热三久草你在线| 国产成人精品999| 福利一区二区| 亚洲一区二区三区成人在线视频精品| 精品国产一级| 国产精品免费区二区三区观看 | 日韩av电影免费观看| 综合国产视频| 亚洲一区二区三区精品在线观看| 91超碰国产精品| 国产真人做爰毛片视频直播| 国产日韩欧美三区| 国模杨依粉嫩蝴蝶150p| 日本欧美在线看| 国产精品区在线| 国产精品自拍一区| 亚洲欧美在线不卡| 中文字幕第一页久久| 中文字幕亚洲欧美日韩| 亚洲成人自拍网| 成人一级免费视频| 51久久夜色精品国产麻豆| 性一交一乱一精一晶| 日韩精品在线免费观看视频| 自拍视频在线| 国内精品久久久久| 蜜桃视频成人m3u8| 亚洲一区二区三区四区在线播放| 国产精品调教视频| 色一情一区二区三区四区| 午夜精品偷拍| 丝袜制服一区二区三区| 国产美女视频一区| wwwwww日本| 亚洲蜜臀av乱码久久精品蜜桃| www.av麻豆| 欧美福利一区二区| 五月天婷婷视频| 萌白酱国产一区二区| 在线观看爽视频| 亚洲永久在线观看| 国产调教一区二区三区| 国产在线xxxx| 久久精品国产一区二区| 噜噜噜在线视频| 亚洲精品成人悠悠色影视| 日本免费精品视频| 亚洲高清免费观看高清完整版| av在线免费观看网| 国内精品久久久久久久久| 日韩午夜电影免费看| 久久综合福利| 欧美精品国产| 欧美日韩一区二区三区69堂| 91日韩精品一区| 精品国产视频在线观看| 欧美性生活久久| 神马久久久久| 欧美激情精品在线| 外国成人毛片| 日韩高清av| 亚洲影院一区| 国产大学生视频| 伊人色综合久久天天| 亚洲资源在线播放| 亚洲欧洲国产精品| 麻豆免费在线| 国产精品一国产精品最新章节| 亚洲高清资源在线观看| 亚洲成人福利在线观看| 久久精品亚洲精品国产欧美kt∨| 男人的天堂一区| 精品国产成人系列| 在线播放蜜桃麻豆| 97人人干人人| 亚洲五月综合| 亚洲第一色av| 日韩理论片在线| 国产有码在线观看| 日韩在线观看网址| 欧美视频在线视频精品| 亚洲高清视频在线观看| 日韩电影在线免费观看| 91成人在线免费视频| 色婷婷久久一区二区三区麻豆| 三级小视频在线观看| 午夜精品久久久99热福利| 成人福利免费在线观看| 男女猛烈激情xx00免费视频| 成人av在线一区二区| 日本三级网站在线观看| 亚洲国产成人久久综合一区| av资源中文在线天堂| 国产日韩欧美一区二区| 日韩午夜精品| 国产高清自拍视频| 色综合天天性综合| 大胆av不用播放器在线播放| 国产精品99久久久久久久久| jizzjizz欧美69巨大| 亚洲一级免费在线观看| 中文字幕一区二区三区在线不卡| 国产又大又黑又粗| 久久99视频免费| 免费日韩一区二区三区| 国产淫片av片久久久久久| 国产欧美日韩在线| 99久久精品国产一区色| 欧美第一淫aaasss性| 欧美三级电影在线| 国产裸体免费无遮挡| 中文字幕亚洲在| 亚洲黄色一级大片| 91av在线影院| 999成人网| 无码人妻精品一区二区三区99不卡| 黑人狂躁日本妞一区二区三区 | 欧美激情一二三区| 91午夜交换视频| 久久久天堂国产精品女人| 亚洲精品合集| 日本在线播放一区二区| 亚洲一区二区视频| 九色视频在线播放| 成人写真视频福利网| 亚洲二区视频| 四季av中文字幕| 精品女同一区二区| 制服诱惑亚洲| 成人在线免费观看视频网站| 91丨porny丨最新| 在线观看毛片网站| 久久频这里精品99香蕉| 狠狠做六月爱婷婷综合aⅴ| 日本一区二区三区在线免费观看| 五月天欧美精品| 日本网站在线免费观看视频| 国产精品国产精品| 蜜桃精品在线观看| 奇米影视第四色777| www日韩中文字幕在线看| 久久悠悠精品综合网| 亚洲36d大奶网| 天天综合色天天综合| 老司机精品视频在线观看6| 久久久99国产精品免费| 国产综合久久久久影院| 国产精品21p|