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>

        Go1.17 新特性:新版構(gòu)建約束

        共 3257字,需瀏覽 7分鐘

         ·

        2021-07-27 06:49

        閱讀本文大概需要 6 分鐘。

        大家好,我是 polarisxu。

        Go 1.17 下個月就要正式發(fā)布了。很多人要問泛型了吧,泛型已經(jīng)很明確了,Go1.18 會有。今天給大家介紹 Go1.17 的一個新特性:構(gòu)建約束 — Build Constraints。

        確切來說,這個特性相關(guān)的工作在 1.16 時就加入,但處于過度階段,1.17 在各方面都更完善,更完整的支持,是時候了解它了。

        01 什么是構(gòu)建約束

        構(gòu)建約束(build constraint),也叫做構(gòu)建標記(build tag),是在 Go 源文件最開始的注釋行,比如:

        // +build linux

        看到這個,相信很多人都不陌生,因為這是 Go 一開始就有的特性,在 Go 源碼中有很多這樣的注釋行。上面注釋行的意思,這個文件只在 Linux 系統(tǒng)會包含在包中,其他系統(tǒng)會忽略這個文件。

        幾個注意點:

        • 約束可以出現(xiàn)在任何源文件中,比如 .go.s 等;
        • 必須在文件頂部附近,它的前面只能有空行或其他注釋行;可見包子句也在約束之后;
        • 約束可以有多行;
        • 為了區(qū)別約束和包文檔,在約束之后必須有空行;

        針對某個構(gòu)建約束,可使用的詞如下:

        • 特定操作系統(tǒng),對應(yīng) runtime.GOOS 的可用值,比如 linux、windows 等;
        • 特定的架構(gòu),對應(yīng) runtime.GOARCH 的可用值,比如 386、amd64 等;
        • 使用的編譯器,比如 gc、gccgo;
        • 支持 cgo 命令時,可以使用 cgo;
        • Go 的主要發(fā)布版本,比如 go1.17、go1.16 等;(測試版本和 fixbug 版本不支持)
        • 自定義的 tag,編譯時通過 -tags 傳遞的值;
        • 可以加入任意值,一般用 ignore 來忽略構(gòu)建;

        此外,文件名可以通過 GOOS 和 GOARCH 來做構(gòu)建約束。

        02 舊版構(gòu)建約束

        從上面看到,構(gòu)建約束的語法是 // +build 這種形式,如果多個條件組合,通過空格、逗號或多行構(gòu)建約束表示。比如:

        // +build linux,386

        你知道什么意思嗎?表示在 linux AND 386。逗號表示 AND,空格表示 OR。那看一個復(fù)雜的:

        // +build linux,386 darwin,!cgo

        是不是有點懵?我也有點懵!它表示的意思是:(linux AND 386) OR (darwin AND (NOT cgo)) 。

        有些時候,多個約束分成多行書寫,會更易讀些:

        // +build linux darwin
        // +build amd64

        這相當于:(linux OR darwin) AND amd64 。

        是不是很復(fù)雜,很難記憶?

        正因為太復(fù)雜,很容易出錯。而且,Go 中有不少注釋是有特殊意義的,也為了一致性考慮,因此有了新版的構(gòu)建約束。

        03 新版構(gòu)建約束

        在 Go 源碼中,經(jīng)常會見到類似下面開頭的注釋:

        //go:link

        新版的構(gòu)建約束,也使用了 //go: 開頭:

        //go:build

        注意 // 和 go 之間不能有空格。

        同時新版語法使用布爾表達式,而不是逗號、空格等。布爾表達式,會更清晰易懂,出錯可能性大大降低。

        比如舊語法:

        // +build linux,386

        對應(yīng)的新語法:

        //go:build linux && 386

        構(gòu)建標記的基礎(chǔ)語法與其當前形式?jīng)]有變化,但是構(gòu)建標記的組合現(xiàn)在是用 Go 的 || 、 && 和 ! 運算符和括號。(請注意,構(gòu)建標記并不總是有效的 Go 表達式,即使它們共享操作符,因為標記并不總是有效的標識符。例如:”go1.1"。)

        新語法可以使用 Go spec 的 EBNF 標記來表示:

        BuildLine      = "http://go:build" Expr
        Expr           = OrExpr
        OrExpr         = AndExpr   { "||" AndExpr }
        AndExpr        = UnaryExpr { "&&" UnaryExpr }
        UnaryExpr      = "!" UnaryExpr | "(" Expr ")" | tag
        tag            = tag_letter { tag_letter }
        tag_letter     = unicode_letter | unicode_digit | "_" | "."

        采用新語法后,一個文件只能有一行構(gòu)建語句,而不是像舊版那樣有多行。這樣可以避免多行的關(guān)系到底是什么的問題。

        Go1.17 中,gofmt 工具會自動根據(jù)舊版語法生成對應(yīng)的新版語法,為了兼容性,兩者都會保留。比如原來是這樣的:

        // +build !windows,!plan9

        執(zhí)行 Go1.17 的 gofmt 后,變成了這樣:

        //go:build !windows && !plan9
        // +build !windows,!plan9

        如果文件中已經(jīng)有了這兩種約束形式,gofmt 會根據(jù) //go:buid 自動覆蓋 // +build 的形式,確保兩者表示的意思一致。如果只有新版語法,不會自動生成舊版的,這時,你需要注意,它不兼容舊版本了。

        另外,Vet 工具現(xiàn)在能夠檢測出兩種語法的不一致。所以,建議大家在編輯器中保存文件時自動執(zhí)行 gofmt。

        早在 Go1.16 時就新增了一個包:go/build/constraint,專門處理新版構(gòu)建約束。

        關(guān)于新版約束的設(shè)計文檔請移步:https://go.googlesource.com/proposal/+/master/design/draft-gobuild.md。

        04 總結(jié)

        新版本的構(gòu)建約束可讀性更強,更容易書寫,不容易出錯。有興趣的可以自己針對構(gòu)建約束,同時書寫兩種形式,體會下新版的好處。

        最后提醒一點,新版約束中,一定要注意 // 和 go 之間不能有空格!




        往期推薦


        福利

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

        瀏覽 96
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            91色色色| 99免费小视频| 大鸡巴操B视频| 国产亚洲99久久精品| 大香蕉一级红色片青青河边草| 插菊花综合网1| 香蕉伊人网| 亚洲精品福利视频| 成人福利网站| 西西西444www无码视| 俺来也俺也啪WWW色| 美日韩免费视频| 国产97在线观看| 精品成人久久| 久久免费视频6| 少妇av| 日韩亚洲精品中文字幕| 欧美日韩高清丝袜| 国产69视频在线观看| 操美女的网站| 性爱xxxxx| 亚洲无码成人AV| 亚洲成人电影AV| 香蕉国产在线视频| 男女性爱视频免费| 久久久18禁一区二区三区精品| 操逼日韩欧美| 2025AV中文字幕| 淫荡五月天视频导航| 天堂无码| 人人摸人人摸| 蜜桃视频在线观看18| 波多野结衣一区二区三区| 伊人免费| 18禁免费网站| 啪啪啪啪网站| 欧美中文字幕在线观看| 殴美老妇BBBBBBBBB| 欧美日韩操| 色五月激情五月| 精品视频在线免费观看| 国产成人AV片| 在线看a片| www.麻豆网91成人久久久| 老熟女视频| 日逼国产| 波多野结衣黄色视频| 亚洲天堂在线免费观看| 最近中文字幕免费MV第一季歌词十| 波多野结衣成人视频| 国产强伦轩免费视频在线| 性爱视频网址| 免费A片视频| 中文字幕乱伦| 亚洲免费视频在线观看| 黄色成人网站在线观看| 一区二区三区视频| 日日夜夜老司机| 免费AV成人| 操逼逼AV| 成人国产| 99久操| 国产1区在线观看| 思思热在线视频精品| 97天天操| 国产美女免费视频| 人人草人人舔| 蜜桃视频com.www| 一区二区三区无码区| 日日搔av一区二区三区| 日韩欧美成人在线视频| 国产视频1区| 亚洲成人五月天| 日本精品中文字幕| 国产成人无码区免费AV片在线| 一级黄色电影免费看| 国产精品网站在线观看| 99er热精品视频| 小骚逼操死你| 91香蕉视频在线| 黄色在线欣赏| xxx久久| 日本少妇激情视频| 国产欧美综合在线观看| 天天爽夜夜爽夜夜爽| 国产69精品久久| 91av一区| 亚洲小视频在线播放| 乱子伦国产精品一区二区| 亚洲无码成人片| 国产一区二区三区无码| 午夜高清无码| 无码三级片在线观看| 高清免费无码| 搡BBBB搡BBB搡五十粉嫩| 波多野结衣高潮| 伊人大香蕉在线网| www.97cao| 一本加勒比HEZYO东京热无码 | 操B视频在线观看| 免费观看无码视频| 精品九九九| 免费AV观看| 亚洲素人无码| 国产精品777777| 日韩在线观看网址| 大奶AV| 国产日韩在线观看视频| 一区二区色| 18禁网站在线| 内射视频网站| 中文字幕一区三区三A片密月| 中文字幕无码精品| 黄色小视频在线| 青青草免费在线观看| 91无码人妻精品一区二区蜜桃| 特级西西人体WWWWW| 精品区| 亚洲色图综合| 韩日无码| 99re热在线视频| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 好男人一区二区三区在线观看| 亚洲视频无码在线| 嫰BBB槡BBBB槡BBBB| 天天日夜夜艹| 亚洲热在线| 99热最新| 青娱乐国产精品| 日本A一级片| 中文字幕超清在线观看| 成人无码电影在线观看| 青草精品| 国产在线秘麻豆精品观看| 婷婷伊人綜合中文字幕小说| 国产精品乱草| 久操久操久操| 天堂在线网| 日韩AV无码一区二区三区| 日韩1区| 一级免费黄色电影| 详情:绿帽夫妻多人运动开淫啪-91n| 国产精品无码久久久久成人app| 五十路熟妇| 丁香五月激情在线| 男人亚洲天堂| 国产免费AV在线| 不卡一区| 亚洲精品一线| 翔田千里无码免费播放| 午夜福利播放| 亚洲无码成人片| 欧美自拍偷拍| 北条麻妃久久视频在线播放 | 亚洲v欧美v| 91蝌蚪在线视频| 国产又爽又黄免费| 在线免费观看中文字幕| 91精品一区二区| 免费观看色情视频| 日本AⅤ中文字幕| 97超碰资源站| 国产无套免费网站69| 久久久久三级片| 99在线观看| 国产午夜福利免费视频在线观看 | 一级a免费| 青青草日逼视频| 欧美视频在线一区| 亚洲成人国产| 免费爱爱视频| 国产精品夜夜爽3000| 夜夜爽7777精品国产三级| 欧美a区| 国产肏逼视频| 黄色一级电影| 亚洲伦理一区二区| 国产网友自拍| 久操成人| 一级电影网站| 国产激情免费视频| 三级AV在线观看| 操逼逼综合网| 天天添天天操| 精品无码一区二区| 伊人影院在线免费观看| 筱田步美| 国产黄色免费乱伦片| 人人干人人草| 国产黄色片网站| 精品av在线观看| 深夜福利网| 伊人大香蕉综合| www日本高清| 成人综合娱乐网| 午夜精品视频在线观看| 成人在线视频网| 亚洲欧美熟妇久久久久久久久 | 日本一区二区三区在线观看网站| 欧美日韩中文字幕在线| 国产成人AV| 大陆搡BBBBB搡BBBBBB| 大香蕉尹人在线观看| 一区在线观看视频| 国产熟妇码视频户外直播| 国产AV综合网| 天天天天天天天天操| 亚洲免费成人网站| 在线观看黄片| 九色无码| 日韩无码五月天| 激情五月丁香婷婷| 日韩99在线观看| 97资源在线视频| 欧美偷拍精品| 久久成人精品| 亚洲影音先锋资源| 无码av免费| 日韩三级在线观看| 日韩理论片| 欧美系列在线| 久久99精品久久久久久水蜜桃| 99久久婷婷国产综合精品电影| 一区二区三区国产视频| 欧美一级黃色A片免费看蜜桃熟了 一级a一级a免费观看免免黄‘/ | 国产福利91精品一区二区三区| 亚洲日韩中文无码| 蜜桃视频日韩| 波多野结衣av在线播放| 91av在线播放| 亚洲高清无码一区二区| 中文字幕av第一页| 国产性爱AV| 欧美日韩一级在线观看| 日韩中文字幕在线人成网站| 丰滿人妻一区二区三区| 日韩23岁观看| av天堂资源在线| 欧美一区二区在线视频| 2025精品偷拍视频| 日韩av无码中文字幕| 欧美一级在线免费观看| 香蕉伊人网| 国产午夜福利视频在线观看 | 久久午夜无码鲁丝片午夜精| 在线综合国产欧美| 天天日少妇| 黄色影院在线观看| 免费18蜜桃久久19| 尻屄视频免费| 欧美a√| 国产AV高清| 日韩无码高清免费| 亚洲精品无码视频在线观看| 一本一道久久综合狠狠躁牛牛影视| 91精品少妇高潮一区二区三区不卡| 亚洲成人五月天| 欧美日韩三级| 日韩在线视频第一页| 三级网站免费观看| 高清无码在线免费观看| 免费爱爱视频网站| 内射视频免费观看| 欧美成人A片| 中文字幕中文字幕无码| 91成人在线免费视频| 99九九网| 五月天天| 四川女人毛多水多A片| 国产操穴视频| 婷婷婷色| 91在线无码精品秘入口| 噜噜噜噜射| 黄片51| 国产第1页| 在线欧美日| 91午夜视频| 欧美国产日韩综合在线观看170| 日本一区二区在线视频| a视频免费在线观看| 9991区二区三区四区| 麻豆自拍偷拍视频| 一级女婬片A片AAAA片| 十八禁网站在线观看| 中文子幕免费毛片| 色色天堂| 三级片无码在线| 中文日韩字幕| 在线观看AV无码| 午夜福利视频网站| 欧美性爱中文字幕| 欧美日韩一级黄片| 国精产品久拍自产在线网站| 国产三四区久久| 国产在线播放av| 怡春院成人| 国产精品扒开腿| 久久综合五月天| 91探花足浴店按摩店| 少妇人妻AV|