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>

        每個 gopher 都需要了解的 Go AST

        共 9614字,需瀏覽 20分鐘

         ·

        2022-05-09 20:58

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

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

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

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

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

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

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

        結(jié)合 go generate 自動生成,這是我們的目標

        Go AST 基礎(chǔ)

        不搞編譯器的大多只需要懂前端,不涉及 IR 與后端,同時 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
        }

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

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

        我們來看一個例子吧,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 代表是個類型的定義,名稱是 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 個元素,第 0 個字段名稱 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)容有點多,大家感興趣自行實驗

        遍歷

        看懂了 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] 實現(xiàn)的 jinji2 語法,非常強大

        //?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é)果的樣例,整體來講比手寫靠譜多了,遇到個別 case 還是需要手工 fix

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

        1. 規(guī)則

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

        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)計,入庫,供業(yè)務(wù)查詢。如果業(yè)務(wù)類型少還好,但是 DIDI 業(yè)務(wù)復(fù)雜,如果每次都人工手寫 go 代碼效率太低

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

        2. 模板

        jinja2 就是這類的代表

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

        3. Inject 代碼

        這里要介紹兩個項目 pingcap failpoint[6] 和 uber-go 的 gopatch

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

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

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

        uber-go 的 gopatch 也非常強大,假如你的代碼有很多 go func 開啟的 goroutine, 你想批量加入 recover 邏輯,如果數(shù)據(jù)特別多人工加很麻煩,這時可以用 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()))
        +????????}
        +????}()
        ???...
        ?}()
        `

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

        這個庫能做的事情特別多,感興趣自行實驗

        4. linter

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

        //?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)出的,同時 Doc.CommentGroup 不存在,或是注釋不以函數(shù)名開頭,報錯即可

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

        玩法很多 ^^

        小結(jié)

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

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

        關(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,


        瀏覽 60
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        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>
            北条麻妃无码播放| 波多野结衣99| 国产精品视频| 欧美一区| 欧美性爱操逼视频| 久久久18禁一区二区三区精品| www一个人免费观看视频www| 一本道不卡色色| 成人做爰100片免费看| 黑人无码一二三四五区| 国产毛片欧美毛片高潮| free性欧美| 日本一级片中文字幕| 成人久久AV| 午夜免费福利视频| 色情五月婷婷| 91亚洲国产成人久久精品网站 | 操B视频在线观看| 国产三级黄片| 高潮视频在线观看| 欧美高清无码| 国产AV日韩AⅤ亚洲AV中文| 国产人成视频免费观看| 一区二区av在线| 久久都是精品| 男人视频网| 色老板在线免费观看| 国产成人免费做爰视频| 成人视频在线观看黄色18| 九九成人电影| 黄色片在线看| 国产最新在线| 双腿张开被9个男人调教| 高清无码视频免费在线观看| 一级国产欧美成人A片| 97精品人人妻人人| 激情丁香婷婷| 99er视频| 亚洲天堂影院| 日本视频爱爱| www.豆花福利视频| 特级婬片AAAAAAA级| 黑人Av| 老司机永久免费91| AA视频网站| 91探花秘在线播放偷拍| 草莓视频在线播放| 天天爽天天干| 一本一道久久a久久精品综合| 天天射天天干天天| 亚洲性爱在线视频| 无码毛片一区二区三区人口| 久久蜜| 亚洲乱码一区| 超碰在线天天| 国产免费av片| 亚洲AV无码免费| 日本中文字幕在线| 扒开让我91看片在线看| 亚洲天堂男人的天堂| 蜜臀999| 蜜桔视频嫩草蜜桃| 亚洲中文字幕无码在线观看| 亚韩av| 国产成人视频免费观看| 日本不卡视频| 在线日韩一区二区| 手机看片1024国产| 婷婷日韩| 国产精品伦子伦免费视频| 久久看片| 国产精品A片守望| 人人妻人人澡人人爽久久con| 91青青视频| 国产精品成人一区二区| 中文字幕+乱码+中文乱码www | 午夜艹| 豆花视频免费| 欧美在线一级| av一区二区三区| 亚洲精品无码中文| 日韩精品中文字幕无码| 51XX嘿嘿午夜| 骚逼综合网| 色播婷婷五月天| 最新国产激情视频| 天天操天天日天天操| 东京热无码免费视频| caobi999| 可以免费看的AV| 最近中文字幕免费| 久久网一区| 777中文字幕| 黄色大片在线免费观看| 搡BBBB推BBBB推BBBB| Av高清无码| 免费日本黄色| 老司机永久免费91| 坏男人内射老太太| 一区二区亚洲| 91av在线观看视频| 日批网站在线观看| 操逼视频观看免费| 草莓av| 免费黄色成人网站| 北条麻妃在线视频| 豆花视频| 亚洲丝袜av| 伊人久久大| 国产精品扒开腿| 成全在线观看高清的| 国产又爽又黄免费视频免费观看| 波多野结衣在线观看一区二区| 五月激情综合网| 亚洲Av在线观看| 国产不卡在线观看| 亚洲五月婷婷| 国产操逼大片| 91午夜福利| 久久婷婷五月丁香| 麻豆mdapp03.tⅴ| 大香蕉玖玖| 久久婷婷网| 做爱视频网站18| 蜜桃AV无码一区二区三区| 免费看黄片网站| 九九精品在线视频| 91麻豆大奶巨乳一区白虎| 三级成人视频| 河南少妇搡BBBB搡BBBB| 色婷婷狠| 91精品人妻一区二区三区| 激情五月天av| 亚洲精品高清无码| 翔田千里在线观看| 超碰97久久| 欧美视频综合网| 人人香蕉| 天天综合字幕一区二区| 无码一区二区在线观看| 亚洲综合免费观看高清完整版在线 | 在线18禁| caobi999| 少妇bbw搡bbbb搡bbbb| 怡春院日韩| 亚洲精品一区二区三| 日韩无码一区二区三| 91在线一区二区| 国产亚洲网| 天天视频色| 夜夜爽7777精品国产三级| 成人网站免费在线| 草莓av| 蜜桃av.38| 伦理被部长侵犯HD中字| 五月丁香在线视频| 88在线无码精品秘入口九色| 欧洲天堂在线视频网站| 天天拍天天操| 蜜桃精品无码| 天天日天天爽| 日韩免费视频观看| 大香蕉在线99| 西西888WWW大胆无码| 黄色永久网站| 作爱免费视频| 精品大香蕉| 人妻AV无码| 亚洲国产视频在线观看| 上床网站| 五月天久久久久| 字幕一区二区久久人妻网站| 婷婷久久亚洲| 91无码一区二区三区| 国产性爱精品影片免费看| 国产精品操| 精品国产一二三| 一级黄色电影网| 操逼爽| 大香蕉伊人在线手机网| 老鸭窝在线观看视频| 经典三级在线视频| 日韩五月天| 日韩在线观看av| 大橡胶伊人网| 五月色综合| 高清无码免费看| 久久草草热国产精| 四川少妇搡BBBB搡BBB视频网 | 我和岳m愉情XXXⅩ视频| 黄色A一级| 国产无码毛片| 婷婷社区五月天| 一级AV在线| 国产一级a毛一级a做免费的视频l 精品国产免费观看久久久_久久天天 | 久久午夜无码鲁丝片| 欧美wwwww| 亚洲AV电影在线观看| 日韩操逼网站| 国产乱子伦一区二区三区在线观看 | 国产免费看片| 黄色网页在线| 99热在线中文字幕| 黄网站在线观看| 熟妇槡BBBB槡BBBB| 日韩一级免费在线观看| 午夜福利sw| 一区二区三区AV| 国产二区三区| 特级西西人体444www高清大胆| 操逼色| 日韩AV在线免费观看| 免费观看黄色片| 天天草天天爽| 日本乱伦电影中文字幕| 久久激情网| av一区二区三区四区| 在线天堂999| 日韩A区| 97爱| 日本激情网站| 中文字幕成人视频| 亚洲欧美日韩另类| 亚洲一区二区视频在线观看 | 国产黄色网页| 免费看18禁| gogogo日本免费观看高清电视剧的注意| 久久久久久成人无码| 一区二区三区久久久| 久久成人毛片| 中文无码电影| 久久久精品午夜人成欧洲亚洲韩国 | 波多野结衣99| 国产色秘乱码一区二区三区| 92无码| 国产精品蜜| av在线一区二区三区| 亚洲美女网站免费观看网址| 日韩视频一级| 黄网站免费观看| 日韩无码激情| 亚洲三级视频在线观看| 欧美久久视频| 人妻制服丝袜| 无码一区视频| 特一级黄色| 欧美色图狠狠操| 欧美3P视频| 国产无码AV| 日韩婷婷| 操逼大全| 香蕉成人电影| 狠狠躁日日躁夜夜躁A片无码| 久久艹国产| 97精品人妻一区二区三区在线| 欧美伊人久久| 日本色天堂| 一起操在线视频| 久久g热| 青娱乐AV| 久久三级电影| 成人777| 青娱乐偷拍| 人妻互换一二三区免费| 91人妻精| 亚洲在线无码视频| 操小骚逼视频| 高H视频在线观看| 丰满少妇一区二区三区| 免费无码婬片AAAA片直播| 可以在线观看的av| 亚洲AV中文无码| 十八禁视频在线观看网站.www| 午夜黄色大片| 小明看台湾成人永久免费视频网站| 日韩一区二区三区无码| 日韩精品丰满无码一级A片∴| 无码六区| 91成人小视频| 久久精品国产亚洲AV成人婷婷| 无码人妻精品一区二区蜜桃漫画 | 欧美熟妇精品一级A片视色| 亚州在线视频| 日逼免费视频| 成人网| 第一福利视频| 成人A片一级| 在线国产视频| 一级黄色A片| 伊人青草视频9| 中文字幕1| 俺来也俺去啦欧美www| av福利在线观看| 欧美日韩中字| A免费观看| 玖玖中文字幕| 狠狠操天天操| 九色91PORNY国产| 影音先锋成人AV资源| 日韩一级成人片| 99er在线视频| 成人毛片在线播放| 午夜AV影院| 成人做爰A片AAA毛真人| 国产AV影院| 久久三级视频| 国产绿奴09-01| 国产操比网| 综合网视频| 色婷婷Av一区| 国产综合久久久777777色胡同| 无码精品黑人| 国产亚洲欧美视频| 欧美一级AA| 中国操逼| 亚洲黄色精品| 豆花视频在线观看| 操B五月天| 麻豆视频在线播放| 特级特黄AAAA免费看| 青青草大香蕉伊人| 欧美激情无码一区二区三区张丽| 91天堂网| 中文字幕在线观看免费| 老司机AV91| 亚洲精品色婷婷| 18害羞勿进网站国产| 爱搞国产| 狠狠干狠狠色| 国产高清在线视频| 屁屁影院国产第一页| 亚洲成人77777| 自拍偷拍亚洲无码| 奇米无码| 黄片在线免费播放| 九九九精品视频| 一级A片免费黄色视频| 蜜乳AV一区二区三区| 在线黄色视频网站| 欧美色噜噜| 99视频热| 亚洲欧美日韩黑料吃瓜在线观看| 日韩无修正| 1区2区视频| 在线天堂AV| 婷婷五月色| 日本处女性高潮喷水视频| 国产乱码一区二区三区| 久久婷婷婬片A片AAA| 青娱乐欧美| 精品无码一区二区三区爱与| 青娱乐亚洲精品视频| 亚洲AV无码乱码国产精品黑人| 国产精品乱子伦一区二区三区视频| 无码人妻精品一区二区三| 久久一级片| 无码毛片在线观看| 亚洲精品一二| 久久悠悠| 欧美成人精品a| 天天日天天操天天日| 日韩第五页| 91麻豆精品国产| 美日韩毛片| 丁香五月婷婷视频| 国产精品国产三级国产专区53 | 久操资源站| 九九九中文字幕| 91成人视频| 国产精品久久7777777精品无码| 玖玖av| 欧美精品秘一区二区三区蜜臀| 老女人操逼网| 久色亚洲| 欧美日韩网站| 日都一级A片| 亚洲秘无码一区二区三区电影| 亚洲高清成人| 成人做爰A片AAA毛真人| 亚洲精品一区二区三区四区高清| 日本中文字幕在线观看视频| 丝袜足交在线| 少妇人妻偷人精品无码视频新浪| 五月天婷婷综合网| 久久区| 成人视频123| 91九色蝌蚪91POR成人| 99在线国产| 狠狠色婷婷7777| 久久yy| 国产AV| 日本少妇视频| 骚逼免费观看| 高H视频在线观看| 亚洲中文自拍| 91超碰大香蕉| 99re视频在线观看| 成年人黄色视频| 国产无套内射视频| 夜夜撸视频| 77777精品成人免费A片| 五月丁香激情视频| 国产一区2区| 国产插穴| 亚洲色在线视频| 91久久电影| 免费的av| 无码精品在线观看| 成人在线精品| 最好看2019中文在线播放电影| 亚洲日韩欧美一区二区天天天| 日韩AV一区二区三区| 91无码一区二区三区| 中文字幕一区二区三区四虎在线| 激情乱伦网站| 五月天三级片| yw尤物| 人人妻人人躁人人DVD| 欧美老熟妇乱大交XXXXX| 国产精品AV网站| 成人毛片100免费观看| 人人操人人爱人人拍| 国产36页| 无码欧美| 人人鲁人人操| 日本高清版色视频| 丁香六月综合激情| 人妻精品一二三| 欧美老妇操逼视频| 狼人亚洲伊人| 欧美老妇操逼视频| www一个人免费观看视频www| 日韩AV一区二区三区四区| 91超碰在线| 亚洲大片免费看| 色色加勒比综合| 亚洲欧美第一页| 韩国毛片基地久久| 人妻精品在线| 精品伊人大香蕉| 国产剧情在线| 97爱视频| 亚洲v视频| 操逼123首页| 亚洲无码高清在线观看| 欧美性爱AAA| 蜜桃av在线播放| 日韩欧美大香蕉| 中文字幕性爱| 在线性视频| 黄色成人在线观看| 高清无码专区| 婷婷免费| 在线天堂av| 688AV秘无码一区二区| 人妻体内射精一区二区| 国产精品国产三级国产| 精品人妻无码| 国产三级麻豆| 91羞射短视频在线观看| 东京热无码免费视频| 亚洲AV无码成人精品区www| 安徽妇女BBBWBBBwm| 97亚洲视频| 亚洲综合免费观看高清完整版在线| 麻豆午夜福利视频| 操逼大全| 久久大奶| 国产亚洲视频在线观看视频| 成年人免费视频网站| 国产香蕉AV| 欧美激情综合| 91色秘乱码一区二区| 人人人妻人人人操| 黄页网站在线免费观看| 日韩视频久久| 三级片视频网站| 精品无码人妻一区二区媚黑| 88av在线观看| 性无码一区二区三区| 我想看操逼| 男女日逼| 成人网在线视频| 欧美熟妇精品黑人巨大一二三区| 欧美第一视频| 欧美日韩中文字幕无码| av免费网址| 久久久精品淫秽色情| 黄片AV| 日韩激情网站| 欧美日韩成人网站| 欧美国产日韩综合在线观看170 | 高清无码学生妹| 亚洲无码一区二区在线观看| 久久久久999| 九九草在线视频| 亚洲AV无码成人精品区国产| 国色天香网站| 特黄视频在线观看| 18禁网址| 国产欧美综合一区二区三区| 日韩在线三级片| 日韩三级中文| 91久色| 国产色综合视频| 天天操欧美| 国产精品欧美综合亚洲| 天天拍夜夜操| 成人AV影院| 成人高清在线| 神马午夜福利| 91aaa在线观看| 丁香婷婷激情五月| 日韩一区二区三区四区久久久精品有吗 | 国产精品成人免费精品自在线观看 | 天天综合久久| 伊人久久爱| 俺来俺去www色官网| 一级A片久久久免费直播间| 日本黄色免费网站| 亚洲中文字幕码mv| 婷婷五月天色色| 蜜臀久久精品久久久久| 国产理论视频在线观看| 中文在线视频| A视频在线观看| 久久另类TS人妖一区二区| 波多野吉衣av| 丁香五月一区二区| 亚洲激情小说| 强辱丰满人妻HD中文字幕| 成年人免费电影| 成人性爱视频网| 日韩AⅤ视频| 天堂素人| 日韩在线视频免费观看| 日日操操| 99久久99九九九99九他书对| 国产成人无码精品| 丁香五月婷婷视频| 91sese| 日本乱伦视频| 强伦轩一区二区三区四区| 黄色天堂| 久久人体视频| 欧美日韩国产在线| 综合五月婷婷| 国产精品三级| 日本超碰| 第一福利视频| 欧美午夜福利电影| 92久久| 久久99国产精品| 亚洲第一中文字幕| 91成人一区二区| 嫩BBB搡BBBB搡BBBB| 翔田千里无码流出两部| 人人草人人| 国产免费一区二区三区最新不卡| 亚洲欧美在线播放| 91久久| 国产AV| 成人AV中文字幕| 蜜臀久久久99久久久久久久| 91精品国产一区三一| 日韩中文无码一级A片| 大香蕉精品欧美色综合2025 | 麻豆亚洲AV成人无码久久精品| 国产一a毛一a免费观看| 性综合网| 丰满熟妇人妻无码视频| 午夜试看120秒体验区的特点| 中国老熟女2老女人| 欧美日韩狠狠操在线观看视频| 亚洲激情网站| 麻豆av无码| 欧美性猛交XXXX乱大交蜜桃| av黄色在线| 婷婷五月丁香花| 日逼91| 国产精品免费一区二区三区都可以 | 可以免费观看的毛片| 91妻人人澡人人爽人人精品| 蜜桃做爱| 大香蕉熟女| 久久精品视频免费看| 免费观看黄片网站| 男人天堂网av| av免费观看网址| 久久人视频| 欧美黄色一级网站| 美女91小视频| 欧美黄色免费在线观看| 影音先锋男人网| 91美女被操| 亚洲自拍中文字幕| 国产在线观看91| 京东热av| 2019国产精品| 欧美av| 日韩黄色片网站| 99成人免费视频| 日本欧美黄色| 成人三级视频在线观看| 亭亭五月丁香| 国精产品一区一区三区| 成人精品在线视频| 2025精品偷拍视频| 久热久| 亚洲在线看| 大香蕉伊在线观看| 青春草在线视频| 99唉撸吧视频免费| 91白浆肆意四溢456| 欧美九九九九| 大香蕉综合闲人| 激情视频小说| 在线男人天堂| 777777国产7777777| 婷婷三级片| 日韩久久电影| 中文天堂网| 国产三级网站| 欧美成人片免费看| 中文字幕精品久久久久人妻红杏Ⅰ | 亚洲有码中文字幕| 国产不卡在线视频| 欧美国产日韩在线观看| 免费做爱网站| 欧美一二区| 人妻一区二区三区| 大屌av| 做爱A片| 真实白嫖91探花无码| 91无码秘蜜桃一区二区三区-百度 精品人妻一区二区三区在线视频不卡 | 天天澡天天爽日日AV| 91丝袜足交| 日韩一级免费观看| 精品无码一区二区三区蜜桃李宗瑞| 亚洲大胆视频| 九九综合网| 天天夜夜人人| 亚洲成人在线免费观看| 2025AV中文字幕| 日韩av电影免费在线观看| 黑人在线视频| 欧美日韩亚洲中文字幕| 日韩午夜福利视频| 91婷婷| 黄频在线免费观看| 黄片欧美| 亚洲人妻一区二区| 伊人天天干| 手机在线小视频| 一卡二卡久久| 亚洲无码AV在线观看| 精品国产三级片| 四虎视频| 翔田千里与黑人50分钟| 51嘿嘿嘿国产精品伦理| 欧美熟妇一区二区| 爆草美女| 伊人大香蕉网| 9l视频自拍蝌蚪9l视频成人| 一个人看的www日本高清视频| 日本毛片视频| 亚洲狼友| 久久燥| 99热日本| 日本高清黄色视频| 在线观看无码| 亚洲操屄| 亚洲乱伦电影| 亚洲黄色精品| 中文字幕无码毛片| 黄色视频日本免费| 专业操老外| 蜜桃91精品秘入口| 免费高清无码视频在线观看| 亚洲系列中文字幕| 国产AV三级片| 日本黄A级A片国产免费| 特级西西444www大胆高清图片 | 日韩婬乱片A片AAA真人视频| 国产精品成人无码免费| 嫩BBB槡BBBB槡BBB小号| 91欧美亚洲| 欧美性爱在线视频| 中文大香蕉视频| 大香蕉com| 亚洲欧美视频在线| 性爱精品视频| 日韩在线三级片| 蜜桃秘av一区二区三区安全| 小H片在线观看| 丁香啪啪| 亚洲天堂2017| 欧美99在线| A级免费毛片| 午夜福利码一区二区| 五月丁香亚洲综合| 欧美亚洲日韩成人| 欧美mv日韩mv国产网站| 久久另类TS人妖一区二区免费| 国产娇小13videos糟蹋| 日日射人妻| 一级黄色A片视频| 免费无码成人片在线播放| 成人国产精品在线观看| 亚洲成人在线网| 青娱乐偷拍| 91人人妻人人| 中文字幕av久久爽Av| 三级片韩国AV| 麻豆自拍偷拍视频| 米奇色色| 日本免费一二三区| 激情小说五月天| 韩国GOGOGO高清| 呦小性Free小U女HD| 91视频免费网站| 超碰免费视| 成人无码区免费A片| 亚洲中文字幕日韩在线| 狠狠干在线观看| 嫩BBB嫩BBB嫩BBB| 欧美一级特黄真人做受| 九色一区| 亚洲国产精品自| 亚洲AV无码乱码国产精品蜜芽 | 亚洲欧美日韩免费| 亚洲精品成人视频| 亚洲国产区| 国产a毛片| 91麻豆精品91久久久久同性| 久久做爱视频| 亚洲草比视频网| 中文无码字幕在线| 奇米影视色偷偷| 国产伦子伦一级A片在线| 97视频| 熟女少妇视频| 柠檬福利第一导航| 国产乱仑视频| 色999网址| 婷婷射图| 无码av亚洲一区二区毛片公司| 亚洲人妻在线播放| 香蕉漫画在线观看18| 大香蕉婷婷五月天| 成人社区视频| 在线观看国产一区| 久久av一区| 99这里有精品视频| 成人一区二区在线| 草久视频| 丰满人妻一区二区三区46| 免费在线观看毛片| 天堂va欧美ⅴa亚洲va一夜| 强伦轩农村人妻| 色婷婷久久综合| 亚洲三级视频| 一级A片亲子乱中文| 日本一级理论片在线大全| 欧美日韩大香蕉| 色五月天导航| 人妻av在线| 国产91白丝在线播放| 日韩精品在线观看视频| 丰满人妻一区二区三区免费| 色老板在线视频| 亚洲成av人无码| 欧美操美女| 国产h在线观看| 无码人妻AV一区| a在线视频| 日本中文字幕不卡| 微拍福利一区二区| 日韩一二三区| A片在线观看网站| 92午夜福利天堂视频2019| 肏逼视频网站| 亚洲无码一区二区三区妃光| 中文字幕一区二区三区精华液| 91人妻人人澡人人添人人爽| 国产亚洲视频完整在线观看| 亚洲欧洲成人| 性爱av在线观看| 色五月在线| 日本高清视频免费观看| 久久成人在线视频| 伊人狠狠| 成人小视频在线| 人人操人人干人人| 欧美日韩成人在线视频| 四虎影院色| 国产欧美欧洲| 国产性生活| 91超碰免费在线| 开心色播五月天| 爱爱动态图| 天天玩天天操| 成人中文字幕无码| 91麻豆精品成人一区二区| 日韩欧美国产视频| 成人免费啪啪视频| 色欲影视插综合一区二区三区| 99热免费观看| 国产乱╳╳AⅤ毛片| 长腿女神打扫偷懒被主人猛操惩罚| 特级毛片片A片AAAAAA| 69视频在线播放| 熟女人妻一区二区三区免费看| AA无码| 中国一级黄色毛片| 日韩极品在线观看| 亚洲黄色在线| 国产—a毛—a毛A免费| 少妇厨房愉情理伦BD在线观看| 超碰在线最新| 伊人网在线播放| 日韩欧美内射| 97大香蕉在线视频| 亚洲一区无码在线观看| 成人在线无码| 婷婷五月天成人电影| 91无码人妻一区二区成人aⅴ| 东京热网站在线观看| 亚洲免费在线观看视频| 香蕉AV777XXX色综合一区| 狠狠91| 成人女人18女人毛片| 亚洲免费在线观看视频| 婷婷精品在线| 免费视频A| 无码国精品一区二区免费蜜桃| 91香蕉视频在线| 久久久久久成人电影| AAA无码| www.re99| JIZZJIZZ国产精品喷水| 国产天堂| 韩国精品一区二区| 91精品无码视频| 狠狠成人| 国产婬片一级A片AAA毛片AⅤ| 人人摸人人看| 亚洲a在线观看| 加勒比精品在线| 日本色电影在线观看| 国产精品久久久久久久久借妻| 欧美日韩精品一区二区三区| 精品在线播放| 啊啊啊网站| 日本视频一区二区三区| 日本乱伦网站| 中文字幕日韩有码| 蜜臀av一区二区三区| 操b网站| 久久爱成人| 最近中文字幕| 99在线国产| 无码人妻精品一区二区蜜桃漫画| 青娱乐亚洲视频在线| 婷婷色情网| 日韩经典视频在线播放| 69视频网| 一道本一区二区| 成人激情在线视频| 国产成人无码AⅤ片免费播放 | 激情婷婷五月天| 日韩人妻一区二区| 陈冠希和张柏芝mv| 日韩欧美分区视频| 天天干视频在线| 99热国产在线观看| 羞羞午夜| 日韩不卡一区二区三区| 黄色网页免费观看| 欧美精品毛片| 久久久久久久香蕉视频| 亚洲成人无码在线| 蜜桃av秘无码一区二区| 自拍偷拍中文字幕| 欧美一区二区三区精品| 9l农村站街老熟女| 一本色道久久综合无码| 一区二区三区观看| 日韩免费a| 天天天天操| 青青操视频在线| 成人免费视频一区二区三区| 亚洲色成人网站www永久四虎| 亚洲色色视频| 天天躁狠狠躁av| 色丁香视频在线观看的| 青青五月天| 国产嫩草久久久一二三久久免费观看 | 欧美爱爱网站| 97人妻人人|