1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        每個(gè) gopher 都需要了解的 Go AST

        共 9748字,需瀏覽 20分鐘

         ·

        2022-04-26 13:43

        最近業(yè)務(wù)遷移,大約 100+ 個(gè)接口需要從舊的服務(wù),遷到公司框架。遇到幾個(gè)痛點(diǎn):

        1. 結(jié)構(gòu)體 dto 做 diff, 對(duì)比結(jié)果
        2. 自定義的結(jié)構(gòu)體與 protobuf 生成的互相轉(zhuǎn)換,基于 json tag

        這類工作要么手寫(編譯期), 要么 reflect 反射實(shí)現(xiàn)(運(yùn)行時(shí))。其中 #1 考濾到性能問題,手寫最優(yōu),但是結(jié)構(gòu)體太大,同時(shí) 100+ 個(gè)接口遷移,工作量可以想象

        google 開源的 go-cmp[1], 輸出美觀,反射性能開銷大了點(diǎn)。當(dāng)前業(yè)務(wù)大量使用,堆機(jī)器吧又不是不能用

        #2 目前不好解決,可以簡單的 json Marshal 再 Unmarshal, 但有些字段類型不一致,同時(shí)如何做 json tag 到 pb tag 轉(zhuǎn)換呢?

        我們當(dāng)前的方案是通過解析 ast, 讀源碼生成結(jié)構(gòu)體樹,然后 BFS 遍歷自動(dòng)生成轉(zhuǎn)換代碼

        //go:generate ast-tools --action convert --target-pkg aaa/dto/geresponse --src-pkg bbb/dto --source aaaResponse ?--target bbbResponse

        結(jié)合 go generate 自動(dòng)生成,這是我們的目標(biāo)

        Go AST 基礎(chǔ)

        不搞編譯器的大多只需要懂前端,不涉及 IR 與后端,同時(shí) go 官方還提供了大量開箱即用的庫 go/ast[2]

        type?Node?interface?{
        ?Pos()?token.Pos?//?position?of?first?character?belonging?to?the?node
        ?End()?token.Pos?//?position?of?first?character?immediately?after?the?node
        }

        所有實(shí)現(xiàn) Pos End 的都是 Node

        • Comments 注釋, //-style 或是 /*-style
        • Declarations 聲明,GenDecl (generic declaration node) 代表 import, constant, type 或 variable declaration. BadDecl 代表有語法錯(cuò)誤的 node
        • Statements 常見的語句表達(dá)式,return, case, if 等等
        • File 代表一個(gè) go 源碼文件
        • Package 代表一組源代碼文件
        • Expr 表達(dá)式 ArrayExpr, StructExpr, SliceExpr 等等

        我們來看一個(gè)例子吧,goast可視化界面[3] 更直觀一些

        //?Manager?...
        type?Manager?struct?{
        ?Same??????string
        ?All???????bool???`json:"all"`
        ?Version???int????`json:"-"`
        ?NormalStruct??pkgcmd.RootApp
        ?PointerStruct?*pkgcmd.RootApp
        ?SlicesField???????[]int
        ?MapField???????????map[string]string
        }

        我們定義結(jié)構(gòu)體 Manager 來看一下 goast 輸出結(jié)果

        29??.??1:?*ast.GenDecl?{
        30??.??.??Doc:?nil
        31??.??.??TokPos:?foo:7:1
        32??.??.??Tok:?type
        33??.??.??Lparen:?-
        34??.??.??Specs:?[]ast.Spec?(len?=?1)?{
        35??.??.??.??0:?*ast.TypeSpec?{
        36??.??.??.??.??Doc:?nil
        37??.??.??.??.??Name:?*ast.Ident?{
        38??.??.??.??.??.??NamePos:?foo:7:6
        39??.??.??.??.??.??Name:?"Manager"
        40??.??.??.??.??.??Obj:?*ast.Object?{
        41??.??.??.??.??.??.??Kind:?type
        42??.??.??.??.??.??.??Name:?"Manager"
        43??.??.??.??.??.??.??Decl:?*(obj?@?35)
        44??.??.??.??.??.??.??Data:?nil
        45??.??.??.??.??.??.??Type:?nil
        46??.??.??.??.??.??}
        47??.??.??.??.??}

        *ast.GenDecl 通用聲明,*ast.TypeSpec 代表是個(gè)類型的定義,名稱是 Manager

        48????.??Assign:?-
        49????.??Type:?*ast.StructType?{
        50????.??.??Struct:?foo:7:14
        51????.??.??Fields:?*ast.FieldList?{
        52????.??.??.??Opening:?foo:7:21
        53????.??.??.??List:?[]*ast.Field?(len?=?7)?{
        54????.??.??.??.??0:?*ast.Field?{
        55????.??.??.??.??.??Doc:?nil
        56????.??.??.??.??.??Names:?[]*ast.Ident?(len?=?1)?{
        57????.??.??.??.??.??.??0:?*ast.Ident?{
        58????.??.??.??.??.??.??.??NamePos:?foo:8:2
        59????.??.??.??.??.??.??.??Name:?"Same"
        60????.??.??.??.??.??.??.??Obj:?*ast.Object?{
        61????.??.??.??.??.??.??.??.??Kind:?var
        62????.??.??.??.??.??.??.??.??Name:?"Same"
        63????.??.??.??.??.??.??.??.??Decl:?*(obj?@?54)
        64????.??.??.??.??.??.??.??.??Data:?nil
        65????.??.??.??.??.??.??.??.??Type:?nil
        66????.??.??.??.??.??.??.??}
        67????.??.??.??.??.??.??}
        68????.??.??.??.??.??}
        69????.??.??.??.??.??Type:?*ast.Ident?{
        70????.??.??.??.??.??.??NamePos:?foo:8:12
        71????.??.??.??.??.??.??Name:?"string"
        72????.??.??.??.??.??.??Obj:?nil
        73????.??.??.??.??.??}
        74????.??.??.??.??.??Tag:?nil
        75????.??.??.??.??.??Comment:?nil
        76????.??.??.??.??}
        77????.??.??.??.??1:

        *ast.StructType 代表類型是結(jié)構(gòu)體,*ast.Field 數(shù)組保存結(jié)構(gòu)體成員聲明,一共 7 個(gè)元素,第 0 個(gè)字段名稱 Same, 類型 string

        131??.??3:?*ast.Field?{
        132??.??.??Doc:?nil
        133??.??.??Names:?[]*ast.Ident?(len?=?1)?{
        134??.??.??.??0:?*ast.Ident?{
        135??.??.??.??.??NamePos:?foo:11:2
        136??.??.??.??.??Name:?"NormalStruct"
        137??.??.??.??.??Obj:?*ast.Object?{
        138??.??.??.??.??.??Kind:?var
        139??.??.??.??.??.??Name:?"NormalStruct"
        140??.??.??.??.??.??Decl:?*(obj?@?131)
        141??.??.??.??.??.??Data:?nil
        142??.??.??.??.??.??Type:?nil
        143??.??.??.??.??}
        144??.??.??.??}
        145??.??.??}
        146??.??.??Type:?*ast.SelectorExpr?{
        147??.??.??.??X:?*ast.Ident?{
        148??.??.??.??.??NamePos:?foo:11:16
        149??.??.??.??.??Name:?"pkgcmd"
        150??.??.??.??.??Obj:?nil
        151??.??.??.??}
        152??.??.??.??Sel:?*ast.Ident?{
        153??.??.??.??.??NamePos:?foo:11:23
        154??.??.??.??.??Name:?"RootApp"
        155??.??.??.??.??Obj:?nil
        156??.??.??.??}
        157??.??.??}
        158??.??.??Tag:?nil
        159??.??.??Comment:?nil
        160??.??}

        *ast.SelectorExpr 代表該字段類型是 A.B,其中 A 代表 package, 具體 B 是什么類型不知道,還需要遍歷包 A

        221??.??6:?*ast.Field?{
        222??.??.??Doc:?nil
        223??.??.??Names:?[]*ast.Ident?(len?=?1)?{
        224??.??.??.??0:?*ast.Ident?{
        225??.??.??.??.??NamePos:?foo:14:2
        226??.??.??.??.??Name:?"MapField"
        227??.??.??.??.??Obj:?*ast.Object?{
        228??.??.??.??.??.??Kind:?var
        229??.??.??.??.??.??Name:?"MapField"
        230??.??.??.??.??.??Decl:?*(obj?@?221)
        231??.??.??.??.??.??Data:?nil
        232??.??.??.??.??.??Type:?nil
        233??.??.??.??.??}
        234??.??.??.??}
        235??.??.??}
        236??.??.??Type:?*ast.MapType?{
        237??.??.??.??Map:?foo:14:21
        238??.??.??.??Key:?*ast.Ident?{
        239??.??.??.??.??NamePos:?foo:14:25
        240??.??.??.??.??Name:?"string"
        241??.??.??.??.??Obj:?nil
        242??.??.??.??}
        243??.??.??.??Value:?*ast.Ident?{
        244??.??.??.??.??NamePos:?foo:14:32
        245??.??.??.??.??Name:?"string"
        246??.??.??.??.??Obj:?nil
        247??.??.??.??}
        248??.??.??}
        249??.??.??Tag:?nil
        250??.??.??Comment:?nil
        251??.??}
        252??}

        *ast.MapType 代表類型是字段,Key, Value 分別定義鍵值類型

        內(nèi)容有點(diǎn)多,大家感興趣自行實(shí)驗(yàn)

        遍歷

        看懂了 go ast 相關(guān)基礎(chǔ),我們就可以遍歷獲取結(jié)構(gòu)體樹形結(jié)構(gòu),廣度 + 深度相結(jié)合

        func?(p?*Parser)?IterateGenNeighbours(dir?string)?{
        ?path,?err?:=?filepath.Abs(dir)
        ?if?err?!=?nil?{
        ??return
        ?}

        ?p.visitedPkg[dir]?=?true

        ?pkgs,?err?:=?parser.ParseDir(token.NewFileSet(),?path,?filter,?0)
        ?if?err?!=?nil?{
        ??return
        ?}

        ?todo?:=?map[string]struct{}{}
        ?for?pkgName,?pkg?:=?range?pkgs?{
        ??nbv?:=?NewNeighbourVisitor(path,?p,?todo,?pkgName)
        ??for?_,?astFile?:=?range?pkg.Files?{
        ???ast.Walk(nbv,?astFile)
        ??}

        ??//?update?import?specs?per?file
        ??for?name?:=?range?nbv.locals?{
        ???fmt.Sprintf("IterateGenNeighbours?find?struct:%s?pkg:%s?path:%s\n",?name,?nbv.locals[name].importPkg,?nbv.locals[name].importPath)
        ???nbv.locals[name].importSpecs?=?nbv.importSpec
        ??}
        ?}

        ?for?path?:=?range?todo?{
        ??dir?:=?os.Getenv("GOPATH")?+?"/src/"?+?strings.Replace(path,?"\"",?"",?-1)
        ??if?_,?visited?:=?p.visitedPkg[dir];?visited?{
        ???continue
        ??}
        ??p.IterateGenNeighbours(dir)
        ?}
        }

        這里的工作量比較大,涉及 import 包,調(diào)試了很久,有些 linter 只需讀單一文件即可,工作量沒法比

        模板輸出

        最后一步就是輸出結(jié)果,這里要 BFS 廣度遍歷結(jié)構(gòu)體樹,然后渲染模板

        var?convertSlicePointerScalarTemplateString?=?`
        ????{%?if?ArrayLength?==?""?%}
        ????dst.{{?TargetFieldName?}}?=?make([]{{?TargetType?}},?len(src.{{?SrcFieldName?}}))
        ????{%?endif?%}
        ????for?i?:=?range?src.{{?SrcFieldName?}}?{
        ?????if?src.{{?SrcFieldName?}}[i]?==?nil?{
        ??????continue
        ?????}

        ?????tmp?:=?*src.{{?SrcFieldName?}}[i]?
        ?????dst.{{?TargetFieldName?}}[i]?=?&tmp
        ????}

        上面是轉(zhuǎn)換 [8]*Scalar 可以是數(shù)組或切片,模板使用 pongo2[4] 實(shí)現(xiàn)的 jinji2 語法,非常強(qiáng)大

        //?ConvertDtoInsuranceOptionToCommonInsuranceOptionV2?only?convert?exported?fields
        func?ConvertDtoInsuranceOptionToCommonInsuranceOptionV2(src?*dto.InsuranceOption)?*common.InsuranceOptionV2?{
        ????if?src?==?nil?{
        ????????return?nil
        ????}
        ????dst?:=?&common.InsuranceOptionV2{}
        ????dst.ID?=?src.ID
        ????dst.OptionPremium?=?src.OptionPremium
        ????dst.InsuranceSignature?=?src.InsuranceSignature
        ????dst.Title?=?src.Title
        ????dst.Subtitle?=?src.Subtitle
        ????dst.ErrorText?=?src.ErrorText
        ????dst.IsIncluded?=?src.IsIncluded
        ????starCurrency?:=?ConvertDtoCurrencyDTOToCommonCurrencyDTO(src.Currency)
        ????if?starCurrency?!=?nil?{
        ????????dst.Currency?=?*starCurrency
        ????}
        ????return?dst
        }

        上面是輸出結(jié)果的樣例,整體來講比手寫靠譜多了,遇到個(gè)別 case 還是需要手工 fix

        AST 其它應(yīng)用場景

        1. 規(guī)則

        工作當(dāng)中用到編譯原理的場景非常多,比如去年高老板分享的用規(guī)則引擎讓你一天上線十個(gè)需求

        If?aa.bb.cc?==?1??//?說明是多車型發(fā)單
        ??Unmarshal(bb.cc.ee)
        ??看type是否為?4?
        else??//?單車型發(fā)單
        ?Unmarshal(bb.cc.ff)
        ??看type是否為?4?
        (type?=?4?的是拼車)

        業(yè)務(wù)需要多種多樣,訂閱 MQ 根據(jù)需求做各種各樣的統(tǒng)計(jì),入庫,供業(yè)務(wù)查詢。如果業(yè)務(wù)類型少還好,但是 DIDI 業(yè)務(wù)復(fù)雜,如果每次都人工手寫 go 代碼效率太低

        最后解決思路是 JPATH + Expression Eval, 需求只需要寫表達(dá)式,服務(wù)解析表達(dá)示即可。Eval 庫也是現(xiàn)成的 govaluate[5]

        2. 模板

        jinja2 就是這類的代表

        原理非常簡單,感興趣的可以看官方實(shí)現(xiàn)

        3. Inject 代碼

        這里要介紹兩個(gè)項(xiàng)目 pingcap failpoint[6] 和 uber-go 的 gopatch

        failpoint 實(shí)現(xiàn)很簡單,代碼里寫 Marker 函數(shù),這些空函數(shù)在正常編譯時(shí)會(huì)被編譯器優(yōu)化去掉,所以正常運(yùn)行時(shí) zero-cost

        var?outerVar?=?"declare?in?outer?scope"
        failpoint.Inject("failpoint-name-for-demo",?func(val?failpoint.Value)?{
        ????fmt.Println("unit-test",?val,?outerVar)
        })

        故障注入時(shí)通過 failctl 將 Marker 函數(shù)轉(zhuǎn)換為故障注入函數(shù),這里就用到了 go-ast 做劫持轉(zhuǎn)換

        uber-go 的 gopatch 也非常強(qiáng)大,假如你的代碼有很多 go func 開啟的 goroutine, 你想批量加入 recover 邏輯,如果數(shù)據(jù)特別多人工加很麻煩,這時(shí)可以用 gopatcher

        var?patchTemplateString?=?`@@
        @@
        +?import?"runtime/debug"
        +?import?"{{?Logger?}}"
        +?import?"{{?Statsd?}}"

        go?func(...)?{
        +????defer?func(){
        +????????if?err?:=?recover();?err?!=?nil?{
        +????????????statsd.Count1("{{?StatsdTag?}}",?"{{?FileName?}}")
        +????????????logging.Error("{{?LoggerTag?}}",?"{{?FileName?}}?recover?from?panic,?err=%+v,?stack=%v",?err,?string(debug.Stack()))
        +????????}
        +????}()
        ???...
        ?}()
        `

        編寫模板,上面的例子自動(dòng)在 go func(...) { 開頭注入 recover 語句塊,非常方便

        這個(gè)庫能做的事情特別多,感興趣自行實(shí)驗(yàn)

        4. linter

        大部分 linter 工具都是用 go ast 實(shí)現(xiàn)的,比如對(duì)于大寫的 Public 函數(shù),如果沒有注釋報(bào)錯(cuò)

        //?BuildArgs?write?a
        func?BuildArgs()?{
        ????var?a?int
        ????a?=?a?+?bbb.c
        ????return?a
        }

        我們看下該代碼的 ast 代碼

        29??.??.??1:?*ast.FuncDecl?{
        30??.??.??.??Doc:?*ast.CommentGroup?{
        31??.??.??.??.??List:?[]*ast.Comment?(len?=?1)?{
        32??.??.??.??.??.??0:?*ast.Comment?{
        33??.??.??.??.??.??.??Slash:?foo:7:1
        34??.??.??.??.??.??.??Text:?"http://?BuildArgs?write?a"
        35??.??.??.??.??.??}
        36??.??.??.??.??}
        37??.??.??.??}
        38??.??.??.??Recv:?nil
        39??.??.??.??Name:?*ast.Ident?{
        40??.??.??.??.??NamePos:?foo:8:6
        41??.??.??.??.??Name:?"BuildArgs"
        42??.??.??.??.??Obj:?*ast.Object?{
        43??.??.??.??.??.??Kind:?func
        44??.??.??.??.??.??Name:?"BuildArgs"
        45??.??.??.??.??.??Decl:?*(obj?@?29)
        46??.??.??.??.??.??Data:?nil
        47??.??.??.??.??.??Type:?nil
        48??.??.??.??.??}
        49??.??.??.??}

        linter 只需要檢查 FuncDecl 的 Name 如果是可導(dǎo)出的,同時(shí) Doc.CommentGroup 不存在,或是注釋不以函數(shù)名開頭,報(bào)錯(cuò)即可

        另外如果大家對(duì)代碼 cycle 有要求,那么是不是可以 ast 掃一遍來發(fā)現(xiàn)呢?如果大家要求函數(shù)不能超過 100 行,是不是也可以實(shí)現(xiàn)呢?

        玩法很多 ^^

        小結(jié)

        編譯原理雖然難,但是搞業(yè)務(wù)的只需要前端知識(shí)即可,不用研究的太深,有需要的場景,知道 AST 如何解決問題就行

        今天的分享就這些,寫文章不容易,如果對(duì)大家有所幫助和啟發(fā),請(qǐng)大家?guī)兔c(diǎn)擊再看點(diǎn)贊,分享 三連

        關(guān)于 Go AST 大家有什么看法,歡迎留言一起討論,大牛多留言 ^_^

        參考資料

        [1]

        go-cmp: https://github.com/google/go-cmp,

        [2]

        go ast: https://pkg.go.dev/go/ast,

        [3]

        goast-viewer 可視化界面: https://yuroyoro.github.io/goast-viewer/index.html,

        [4]

        go pongo2 jinja2: github.com/flosch/pongo2,

        [5]

        govaluate: https://github.com/Knetic/govaluate,

        [6]

        pingcap failpoint: https://github.com/pingcap/failpoint,



        推薦閱讀


        福利

        我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲?。贿€可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

        瀏覽 64
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人性生交大片免费看小芳| 最新无码在线| 动漫人物插画动漫人物的视频软件 | 人人干人人爽| 国产一卡二卡在线| 精品码产区一区二亚洲国产| 九九惹伊人| 亚洲aaa| 成人爽a毛片一区二区免费| 亚洲免费观看高清完整版在线观| 人妻18无码人伦一区二区三区精品 | 国产特级毛片AAAAAA| 成人黄色电影| 日本AⅤ在线| 久操视频网站| 91人妻人人爽人人澡| 日韩无码人妻视频| 亚洲AVwww| 青青草原AV| 国产操比| 精品女人| 婷婷五月天电影网| 内射学生妹J亅| 婷婷五月天青草| 自拍偷拍综合| 国产理论电影在线观看| 国产黄色视频在线观看免费| 亚洲国产精品VA在线看黑人| 人妖黃色一級A片| 日韩强操逼网| 1024在线视频| 亚洲视频国产| 九九激情| 丝袜毛片| 日韩一区二区三区免费视频 | 成人免费黄| 人人干人人爱| 99色| 爆乳尤物一区二区三区| 久久久久久综合| 97人妻一区二区精品视频| 欧美一级操逼视频| 婷婷丁香人妻天天爽| 大香蕉伊人在线视频| 91人妻精| 国产精品成人99一区无码| 亚洲精品中文字幕成人片| 人妻无码人妻| 色悠悠中文字幕| 欧美99在线| 亚洲福利视频97| 电影91久久久| 天堂毛片| 日韩黄频| 特级毛片WWW| BBB搡BBB搡BBB搡BBB| 精品丰满人妻一区二区三区免费观| 亚洲精品视频在线观看免费| 思思热思思操免费视频| 中文字幕亚洲精品| 中文字幕日韩人妻| 亚洲资源在线观看| 五月开心婷婷| 中日韩无码| 无码一区二区三区在线观看| 超碰在线精品| 中文字幕av久久爽爽| 懂色AV无码中字幕一区| 亚洲精品久久久久毛片A级牛奶| 亚洲综合免费观看高清完整版在线| 午夜免费福利| 日韩福利片| 操久久久| 无码人妻精品一区二区三区99仓| 欧美成人免费电影| 中文字幕熟女| 亚洲无码免费播放| 国产一级片电影| 综合色色婷婷| 国产av综合网| 丁香婷婷网| 亚洲天堂福利| 人人妻日日摸狠狠躁| 日韩字幕| 懂色av一区蜜桃| 成人网站在线看| 欧美黄片在线| 69av在线播放| 日本一区二区三区免费视频| 成人免费视频18| 免费的A片| 十八禁免费网站| 久久艹国产| 亚洲AV无码一区东京热久久| 国产高清无码18| 欧美性爱怡红院| 特级西西444WWW高清| 日韩精品视频免费在线观看| 韩国gogogo高清在线完整版| 男人天堂资源网| 五月天啪啪视频| 欧美日韩一级黄片| 日韩精品黄片| 特一级黄A片| 四季AV一区二区凹凸懂色桃花| 伊人成人视频在线观看| 人妻japanesewoman| AV在线观看黄| 综合色国产精品欧美在线| 国产精品操逼| 奇米久久| 影音先锋资源| 国产欧美综合视频一区二区在线| 国产精品96久久久久久| 91超碰在线观看| 欧美日韩在线播放| 2018天天操| 天天无码| 久草天堂| 三级无码视频| 精品无码一区二区| 国产精品无毛五区六区| 午夜亚洲国产一区视频网站| 色就是色欧美成人网| 亚洲无码视频在线观看高清| 狼人伊人综合| 少妇性视频| 好吊AV| 亚洲AV无码一区二区三区少妇 | 69天堂| 91福利网| 国产日韩欧美综合精品在线观看| 欧美日韩逼| 国产91探花系列在线观看| 成人社区视频| 久久婷婷婷| 成人亚洲性情网站www在线| 思思操在线视频| 婷婷爱五月天| 国产91高跟丝袜| 九九99精品视频| 久久精品女同亚洲女同13| 有码视频在线观看| 亚洲无码一区在线| 操逼操逼逼| 天天爱综合| 五月丁香婷婷综合网| 少妇高潮喷水| 91久久久久久久| 亚洲操b| 中国老女人操逼| 日韩乱伦小说| 天天干天天摸| 一级国产黄色视频| 天堂网免费视频| 亚洲欧美视频| 国产一道本| 老熟女伦一区二区三区| 日韩无码视频网站| 午夜成人鲁丝片午夜精品| 日韩国产一区二区| 日本成人黄色视频| 人妻视频网站| 五月丁香在线| 狠狠干五月| 老鸭窝久久| 日本中文无码| 欧美乱伦内射| 精品一区电影| 嫩BBB槡BBBB槡BBBB撒尿| 亚洲无码视频网站| 国产一区无码| 日批视频| 91成人导航| 三级片网站在线播放| 国产毛片777777| 麻豆mdapp03.tⅴ| 91精品视频网站| 安徽妇搡BBB搡BBBB户外老太太 | 91夫妻交友视频| 国产AV日韩AⅤ亚洲AV中文| 午夜一本道| 国产精品在线免费观看| 黄色a级片| 久久久久电影| 91夫妻视频| 果冻传媒A片一二三区| 色悠悠久久| 成人精品A片免费网站| 亚洲无码一区二区三区蜜桃| 人成在线视频| 成人做爰黄A片免费视频网站野外 国产成人午夜精品无码区久久麻豆 | 91资源在线| 国产AV大全| 正在播放ADN156松下纱荣子| 亚洲aaaaaa| 神马午夜三级| 欧美av| 欧美特黄AAAAAAAAA片| 婷婷日韩中文字幕| 欧美视频操逼| 中文字幕无码乱伦| 一区二区三区无码精品| 日韩在线视频中文字幕| 免费一级无码成人片| 天天干天天草| 性爱网站免费看| 无码男女| 中文字幕VA| 亚洲色偷精品一区二区三区| 91爱搞在线| 免看一级a毛片一片成人不卡| 亚洲视频一区二区三区四区娇小视频在线观看视频 | 激情视频国产| 天天操夜夜爽| 久久久久久一| 日日骚影院| 欧美性爱69| 国产精品视频免费看| 国产福利网站| 亚洲精品中文字幕在线| 成年视频在线观看| 色婷婷在线影院| 偷拍亚洲| 秋霞福利视频| 91香蕉国产在线观看| 在线观看操逼| 肏逼网址| 国产精品精品| 99久久国内精品成人免费| 国产高清AV无码| 成人免费乱码大片a毛片蜜芽 | 国产在线视频网站| 超碰碰碰碰碰| 欧美、日韩、中文、制服、人妻 | 欧美精品久久久| 亚洲国产视频在线观看| 亚洲热视频在线观看| 美女自慰网站免费| 亚洲黄色无码| 欧美操逼免费视频| 精品欧美成人片在线| 牛牛免费视频| 亚洲一区无码在线观看| 在线观看免费视频无码| 中文字幕www一区| 一级a黄片| 国产日日日| 91综合在线观看| 啊啊啊啊啊在线观看| 国产aaaaaa| 五月丁香免费视频| 亚洲v| 黄p网站| 麻豆国产在线| 日老女人的逼| 人人操人人色| 高清无码网站在线观看| 午夜福利视频网| 麻豆91精品人妻成人无码| 九九r在线精品观看视频| 色婷婷AV在线| 先锋影音一区二区| 一级片日韩| 亚洲成人在线视频观看| 久操资源站| 亚洲无码成人在线| 国产精品视频免费观看| 免费无码婬片AAAAA片| 精品乱子伦一区二区三区在线播放 | 竹菊传媒一区二区三区| 日韩黄频| 99精品六月婷婷综合在线| 精品久热| 亚洲福利在线观看视频| 色老板免费视频| 日韩AV在线天堂| 高清无码三级片在线观看| 免费操逼视频网站| 国产精品无码一区二区三| 国内不卡一卡二视频| 777Av| 色妞一區| 亚洲不卡一区二区三区| 免费观看黄色电影| 日韩一级黄片| 国产精品一级a毛视频| 国产啊啊啊啊| 久久精品美臀| 天天干欧美| 懂色av粉嫩av蜜臀av| 日韩成人精品中文字幕| 污视频网站免费观看| 欧美一级aaa| 一级黄片免费看| henhengan| 午夜成人福利片| 无码视频播放| av東熱激情东京热| 日本爽妇网| 奇米成人片| 午夜成人网站在线观看| 中文字幕人妻一区| 国产免费乱伦| 日日艹夜夜艹| 3D动漫精品啪啪一区二区免费| 日韩欧美性爱网站| 日韩不卡一区| 99视频免费看| 中文字幕性爱电影| 北条麻妃日B视频| 精品91美女| 偷拍亚洲色图| 亚州毛片| 欧美成人精品一级| 久久久精品免费视频| 99热综合| 人人摸在线视频| 黑人大香蕉| 亚洲AV一二三| aaa片| 影音先锋一区二区| 欧美亚洲国产一区二区三区 | 亚洲一区色| 豆花视频免费观看| 欧美另类色图| 成人自拍电影| 波多野结衣亚洲无码| 微拍福利一区二区| 激情成人五月天| 97国产精品| 日本道在线视频| 国产精品99久久久久的广告情况 | 中国老太卖婬HD播放| 久久视频免费在线观看| 国产熟妇码视频| 久久精品无码一区二区无码性色 | 精精品人妻一区二区三区| 最新激情网站| 超级碰碰| 亚洲成人免费福利| 9l视频自拍蝌蚪9l成人| 欧美天天干| av无码毛片| 婷婷五月综合网| 亚洲无码一区二区三| 日韩一区在线视频| 91国产视频在线播放| 熟女中文| 91久久| 中文字幕人妻在线中文乱码怎么解决| 中文一级片| 国产AV黄| 操一操影院| 久久高潮| 天天摸夜夜操| 波多野结衣无码NET,AV| 日本综合视频| 亚洲精品国产精品乱码视99| 丁香五月婷婷啪啪| 大香蕉伊人网| 欧美成年人视频| 一级AA片| 欧美人成人无码| 牛牛在线视频| 成人网站AV| 五月婷婷在线视频| 国产亚洲精品久久久波多野结衣 | 在线免费观看黄色视频网站 | 亚洲V在线| 色网在线观看| 亚洲人成电影网| 日韩无码视频一区| a片免费观看视频| 77777色婷婷| 水蜜桃成人网| 亚洲精品黄色| av无码毛片| 色噜噜狠狠色综无码久久合欧美| 69福利| 亚洲综合免费观看| 国产欧美综合一区二区| 首页-91n| 国产h在线播放| 人人干人人爽| a片在线观看视频| 17.3c一起起草| 色呦呦视频在线观看| 久热精品视频| 成年人国产| 91探花足浴店按摩店| 国产成人影视在线观看| 中文字幕在线观看一区| 日韩精品一区在线| 欧美九九| 久久九九综合| 亚洲国产另类精品| 成人小视频18| 男女视频网站在线观看| 一级欧美日韩| 五十路熟妇| 国模精品无码一区二区免费蜜桃| 91精品国产91久久久久久吃药| 91丨人妻丨偷拍| 人人妻人人上| 亚洲一级在线| 伊香蕉大综综综合| 日韩欧美综合| 911国产精品| 成人国产片女人爽到高潮| 岛国AV在线播放| 天天干少妇| 做爱网站免费| 亚洲无码av网站| 91精品久久久久久久| 国产精品高潮呻吟| 91成人电影| 成人亚洲AV| 豆花成人在线| 91人妻无码精品蜜桃| 在线免费观看av片| 成年人黄色网址| www.AV在线| 日韩成人无码全裸视频| 十八禁黄网站| 久操手机在线| 五月网站| 囯产精品一区二区三区AV做线 | 一本色道综合久久欧美日韩精品 | 99热网站| 久久午夜无码鲁丝片主演是谁| 丁月婷婷五香天日五月天| 99九九精品| 亚洲三级片免费观看| 麻豆人妻换人妻好紧| 亚洲熟妇AV日韩熟妇在线| 色噜噜狠狠一区二区三区Av蜜芽| 91叉叉叉| 专肏老妇人大逼| 亚洲视频综合| 怡春院院成人免费视频| 午夜精品18视频国产17c| 亚洲中文字幕网站| 不卡日本| 97超碰人人| 五月婷婷丁香在线| 亚洲欧美日韩在线| 香蕉视频91| 日B视频在线观看| av在线资源网站| 水蜜桃网| 黄色av免费网站| 一本大道香蕉av久久精东影业 | 99视频免费在线| 日韩黄色三级片| 日本成人高清视频| 五月天无码av| 国产十八岁在线观看| 色情网站在线| 国产综合色婷婷精品久久| 免费在线看黄网站| 亚洲AV无码成人精品一区| 91蝌蚪久久| 亚洲AV无码精品| 午夜视频网站| 午夜av免费在线| 成人看片黄a免费看视频| 在线观看av资源| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 欧美一级特黄A片免费看视频小说| 精品少妇人妻一区二区| 欧美日韩在线观看一区| 久久男女| 中文字幕免费MV第一季歌词| 大鸡巴影院| 日韩精品不卡| 亚洲人妻影院| 99色亚洲| 日日爽夜夜爽| 大香久久| 97亚洲国产| 久久精品99久久久久久久久| 狠狠无码| 色五月婷婷婷| 成人av黄色三级片在线观看| 国产性爱在线视频| 欧美成人电影在线观看| 欧美aa片| 天天色天天干天天日| 中文在线免费看视频| 中文字幕成人在线播放| 波多野结衣不卡| 福利在线| 天天天做夜夜夜爽无码| 操噜噜噜噜噜插| 日本A级毛片| 免费无码网站| 国产一级A片视频| 久久yzy| 色婷婷一区二区三区久久| 婷婷五月伊人| 2025精品精品视频| 无码AV在线观看| 京东热av| 一区二区国产视频| 91熟女视频| 亚洲中文字幕视频在线观看| 91麻豆精品无码人妻| 日韩无码破解| 国产乱子伦日B视频| 国产AV黄片| 狠狠干2025| 久操精品视频| 色婷婷成人做爰A片免费看网站| 成人做爰A片免费看网站| 丁香六月色| 亚洲AV无码成人网站国产网站| 人妻互换一二三区免费| 久久国产精品一区二区三区| 亚洲午夜激情电影| 免费v片在线| 在线观看国产黄色| WWW久久| 精品色哟哟| 97资源网站| 国产欧美熟妇另类久久久| 日韩小视频在线| 黄色视频日本免费| 亚洲日本一区二区三区| 免费av在线| 亚洲黄色在线视频| 亚洲日本中文| 婷婷五月丁香在线| 1024国产在线| 99热国产精品| 免费操逼网| 国产三级片AV| 男人午夜网站| 人人妻人人澡人人爽久久| 99内射| 亚洲中文字幕影院| 国产一级a毛一级a毛视频在线网站? | 国产成人综合网| 亚洲无码性爱视频| 欧一美一婬一伦一区?| 国产无码成人电影| 免费激情网站| 国产一级a毛一级a做免费高清视频 | 国产真实露脸乱子伦对白高清视频 | 亚洲色成人中文字幕在线| 招土一级黄色片| 五月天福利视频| 丁香五月综合网| 91麻豆福利| 日韩色图在线观看| 久久91人妻无码精品蜜桃HD | 五月天久久久久| 韩国无码中文| av大片在线观看| 天天日夜夜| 欧美性爱免费网站| 人人操综合| 国产丰满| 午夜亚洲AⅤ无码高潮片苍井空| 欧美aa片| 黄色视频日本| 波多野结衣AV在线播放| 99人人操| 日韩三级久久| 国产xxxx视频| AV电影天堂网| 日本一级片在线播放| 高潮视频在线观看| 久操中文| 777视频在线观看| 狠狠狠狠狠狠狠狠狠| 亚洲精品福利视频导航| 中文字幕高清无码在线播放| 安徽妇搡BBBB搡BBBB小说| 足交在线观看| 99视频久久| 日韩乱妇| 毛片动态图| 西西人体444www| 吴梦梦| 国产午夜男女性爱| 亚洲视频一区二区三区| 99精品在线免费观看| 高潮国产视频| 久久精品无码视频| 91蝌蚪视频在线播放| 婷婷V亚洲V丁香月天V日韩V| 手机AV网站| 国产AV高清| 人人操人人摸人人干| 天天爽视频| 热99re69精品8在线播放| 日韩天堂网| 无码人妻在线播放| 欧洲综合视频| 中文字幕国产综合| 黄色视频在线| 欧美一区二区丁香五月天激情| 日韩一级无码| 草久久| 天干天干天夜夜爽| 免费亚洲无码| 亚洲国产天堂| 99热在线只有精品| 无码人妻熟妇| 精品人妻一区二区免费蜜桃| 波多野结衣AV网站| 爱爱免费视频| 伊人久久AV诱惑悠悠| 黄色内射在线播放| 51福利视频| 一级免费黄色电影| 西西444WWW大胆无视频软件亮点 | AV电影在线免费观看| 99久久综合国产精品二区| 欧洲毛片基地c区| 土耳其电影《爱与罚》| 日韩黄色网| 欧美老女人操逼| 亚洲天堂无码在线观看| 国产精品一区在线| 国产精品久久毛片A片| 国产黄色片视频| 免费在线观看无码视频| 停停五月天| 亲子伦一区二区三区观看方式| 97免费在线观看视频| 91AV免费| 欧美性爱免费在线视频| 伊人色爱| 在线观看三级网址| a亚洲天堂| 蜜桃av.38| 黄色日逼视频| 亚洲无码免费在线观看| 青青草无码视频| 欧美9999| 婷婷五月丁香网| 久操视频在线播放| 亚洲香蕉在线观看| 欧美三级欧美成人高清| 婷婷五月丁香花| 精品久久成人| 成人av中文字幕| 特大妓女BBwBBWBBw| 狠狠干在线观看| www.91com| 偷拍-91爱爱| 国产老骚逼| 黄片高清视频| 日本天堂在线视频| 97精品人妻一区二区三区香蕉| 蜜臀久久精品久久久久| 亚洲国产精品VA在线看黑人| 肏屄视频在线看| 五月天无码免费视频| 国产农村乱婬片A片AAA图片| 老熟女搡BBBB搡BBBB视频| 欧一美一婬一伦一区?| 青青无码视频| 北条麻妃成人视频| 操屄视频免费观看| 超碰97成人| 在线天堂a| 国产一区久久| 久久久久亚洲精品| 台湾精品一区二区三区| 黄色一级大片在线免费看产| 成人永久免费视频| 国产八区| 在线视频一区二区| 91丨九色丨老熟女探花| 男人V天堂| 可以免费看的黄色视频| 91精品啪| 成人一级a片| 91视频你懂的| 黄色无遮挡| 2025av在线| 91秦先生在线播放| 日韩欧美123| 中文字幕精品无码一区二区| 亚洲天堂色| 午夜高清无码视频| 五月色综合| 嫩草亚洲小泬久久夂| 黄色亚洲| 天天综合色| 亚洲色图在线观看| 国产精品毛片| 2019中文字幕在线免费观看| 男人av网站| 久久精品v| 亚洲AV秘无码一区在线| 欧美三级欧美一级| 高清无码小视频| 国产免费性爱| 中文字幕超清在线观看| 性爱AV在线| 你操综合| 国产在线拍偷自揄拍无码一区二区| 怡红院一区| 欧美视频免费在线观看| 久久综合99| 欧美视频一区二区三区四区| 五月丁香在线| 女神思瑞精品一区二区三区| 日产精品久久| 黄频在线免费观看| 夜夜嗨av一区二区三区| 青青草网址| 久久成人网豆花视频| 尤物91| 久青草资源福利视频| 免费无码婬片AAAA片直播| 麻豆A∨在线| 伊人久久久| 国产一级黄色| 免费岛国av大片| 欧美老妇日韩| 色婷婷欧美在线播放内射| 国产操逼无码| 97精品人妻一区二区三区香蕉| 成人网址大全| 无码人妻精品一区二区三区蜜桃91| 丁香五月影院| www.黄色视频| 国产色视频| 黄色视频在线观看亚洲一区二区三区免费| 青草久在线| 亚洲成年人网| 婷婷热| 亚洲天堂在线观看免费视频| 日韩无码视频网站| 国产视频一区二区三区四区五区 | 91成人视频| 中文无码人妻少妇| 日韩AV成人无码久久电影| 婷婷五月丁香在线| 波多野结衣高清视频| 麻豆三级片在线观看| 91av在线免费观看| 欧美老妇另类| 久草黄色电影在线观看| 人妻av一区二区三区| 欧美性受XXXX黑人XYX性爽一 | 欧美成人视频18| 超碰激情| 日本亚洲视频| 青青欧美| 国产亚洲久一区二区三区| 91亚洲国产AⅤ精品一区二区 | 日韩成人大片| 国产亚洲中文| 国产成人无码在线| 三级片久久久| 国产午夜男女性爱| av天天日| 激情五月天激情网| 十八女人高潮A片免费| 思思热在线观看视频| 精品一二区| 九九热只有精品| 激情五月毛片| 在线观看一级片| 中文字幕巨肉乱码中文乱码| 欧美日韩亚洲中文字幕| 日韩人妻视频| 五月丁香婷婷综合| 黄片视频免费| 国产精品H| 四虎成人在线| 国产成人无码AⅤ片免费播放| 欧美污网站| 500部大龄熟乱4K视频| 色图在线观看| 亚洲日韩国产中文字幕| 天堂在线中文网| 成年人在线观看视频网站| 自拍在线| 樱桃av| 韩日高清无码| 日韩精品在线一区| 免费的av网站| 精品少妇人妻| 黑人操逼| 亚洲欧美激情小说另类| 在桌下含她的花蒂和舌头H视频 | 欧美亚洲日韩在线观看| 亚洲AV无码| 亚洲第一国产黄AV动漫软件| 日韩视频免费观看高清完整版在线观| 1024香蕉视频| 久久久免费观看视频| 啪啪视频最新地址发布页| 成人网站在线免费看| 中国乱伦视频| 在线免费观看av网站| 日韩一区在线播放| 日逼免费视频| 久热久热| 亚洲成人视频在线播放| 在线播放国产精品| 亚洲午夜久久久久久久久红桃| 婷婷五月天激情视频| 欧美日韩精品一区二区三区| 美女扣逼网站| 一本道视频在线| 黄色片在线免费看| 亚洲va综合va国产va中文| 欧美MV日韩MV国产网站| 性无码一区二区三区在线观看| 国产精品精品| 国产在线欧美在线| 在线观看免费a片| 国产精品中文| 2021无码| 亚洲综合p| 免费在线观看AV片| 国产精品一区二区不卡| 午夜国产在线观看| 国产AV久| 啪啪免费网| 97福利在线| 日本免费一区二区三区| 蜜芽av在线观看| 中文字幕av免费在线观看| 四季AV综合网站| 成人在线网| 成人毛片在线大全免费| 亚洲肏屄网| 亚州精品人妻一二三区| 手机看片午夜福利网| 热久久最新| 激情操逼网| 婷婷五月天电影| 北岛玲视频在线| 黑人精品| 中文精品字幕人妻熟女| 激情AV在线观看| 中文字幕一本道| 欧美日韩视频在线播放| 精品蜜桃一区二区三区| 亚洲网站在线免费观看| 人人插人人射| 少妇特黄A一区二区三区| 成人黄色性视频| 国产视频999| 91中文字幕+乱码| 日韩av三级在线观看| 风间由美大荫蒂无码AV| 五月婷亚洲精品AV天堂| 99成人| 中文字幕在线视频日本| 超碰在线观看免费| 亚洲色视频| 亚洲无码AV免费观看| 亚洲不卡在线观看| 国产大鸡吧| 国产伦理一区| 蜜臀久久99精品久久久兰草影视 | 国产成人精品亚洲男人的天堂| 久久人人超碰| 91香蕉国产| 做爱网站在线观看| 亚洲成人无码精品| 大香蕉网视频| 玖玖热在线视频| 第一页在线观看| 久久伊| 91美女操逼视频| 国产精品黄色片| 国产精品无码怀孕软件| 午夜成人黄色电影| 欧美精品在线观看视频| 久久久精品电影| 免费看黄视频| 很很干在线视频| 97中文字幕| www.91在线看| www天天干| 色丁香视频在线观看的| 日日搔AV一区二区三区| 国产在线观看一区二区| 成人欧美一区二区三区白人| 国产三级片无码| 亚色天堂| 无码人妻免费视频| 亚色视频| 婷婷色网| 一级特黄A片| 波多野在线视频| 国产嫩草久久久一二三久久免费观看 | 大香蕉伊人综合| 91精品国产一区二区三区四区大|