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

在 Go 里用 CGO?這 7 個問題你要關注!

開發 前端
在 Go 項目中被過度使用了,當面臨在 Go 中重新實現一大段 C 語言代碼時,程序員會選擇使用 cgo 來包裝庫,認為這是個更容易解決的問題。但我認為這是一種錯誤的選擇行為。

大家好,我是煎魚。

今天給大家分享的是 Go 諺語中的 Cgo is not Go[1],原文章同名,略有修改,原文作者是 @Dave Cheney。以下的 “我” 均指代原作者。

借用 JWZ 的一句話:有些人在面對一個問題時,認為 "我知道,我會使用 cgo(來解決這個問題)"。

圖片

類似的引言

在使用 cgo 后,他們就會遇到兩個新問題。

Cgo 是什么

Cgo 是一項了不起的技術,它允許 Go 程序與 C 語言庫相互操作,這是一個非常有用的功能。

沒有它,Go 就不會有今天的地位。cgo 是在 Android 和 iOS 上運行 Go 程序的關鍵。

注:甚至許多內部用到其他底層語言的同學,會使用它來做膠水。

被過度使用

我個人認為 cgo 在 Go 項目中被過度使用了,當面臨在 Go 中重新實現一大段 C 語言代碼時,程序員會選擇使用 cgo 來包裝庫,認為這是個更容易解決的問題。但我認為這是一種錯誤的選擇行為。

顯然,在某些情況下,cgo 是不可避免的,最明顯的是你必須與圖形驅動或窗口系統進行互操作,而后者只能以二進制 blob 的形式提供。在這些場景下,cgo 的使用證明了它的權衡是合理的,比許多人準備承認的要少得多。

以下是一份不完整的權衡清單,當你把 Go 項目建立在 cgo 庫上時,你可能沒有意識到這些權衡。

你需要對此進行思考。

構建時間變長

當你在 Go 包中導入 "C" 時,go build 需要做更多的工作來構建你的代碼。

構建你的包不再是簡單地將范圍內的所有 .go 文件的列表傳遞給 go 工具編譯的一次調用,而是包含以下工作項:

  • 需要調用 cgo 工具來生成 C 到 Go 和 Go 到 C 的相關代碼。
  • 系統中的 C 編譯器會為軟件包中的每個 C 文件進行調用處理。
  • 各個編譯單元被合并到一個 .o 文件中。
  • 生成的 .o 文件會通過系統的鏈接器,對其引用的共享對象進行修正。

所有這些工作在你每次編譯或測試你的軟件包時都會發生,如果你在該軟件包中積極工作的話,這種情況是經常發生的。

Go 工具會在可能的情況下將這些工作并行化(包括對所有的 C 代碼進行全面重建),軟件包的編譯時間將會增加,并會隨之增大而增大。

你還需要在各大平臺上調試你的 C 語言代碼,以避免由于兼容性導致的編譯失敗。

復雜的構建

Go 的目標之一是產生一種語言,它的構建過程是自我描述的;你的程序的源代碼包含了足夠的信息,可以讓一個工具來構建這個項目。這并不是說使用 Makefile 來自動構建工作流程是不好的,但是在 cgo 被引入項目之前,除了 go 工具之外,你可能不需要任何東西來構建和測試。

在引入了 cgo 之后,你需要設置所有的環境變量,跟蹤可能安裝在奇怪地方的共享對象和頭文件。

另外需要注意,Go 支持許多的平臺,而 cgo 并不是。所以你必須花一些時間來為你的 Windows 用戶想出一個解決方案。

現在你的用戶必須安裝 C 編譯器,而不僅僅是 Go 編譯器。他們還必須安裝你的項目所依賴的 C 語言庫,你也要承擔這個技術支持的成本。

交叉匯編被拋在窗外

Go 對交叉編譯的支持是同類中最好的。從 Go 1.5 開始,你可以通過 Go 項目網站上的官方安裝程序支持從任何平臺交叉編譯到任何其他平臺。

在默認情況下,交叉編譯時 cgo 被禁用。通常情況下,如果你的項目是純粹的 Go,這不是一個問題。

當你混入對 C 庫的依賴時,你要么放棄交叉編譯你的因那個也,要么你必須投入時間為所有目標尋找和維護交叉編譯的 C 工具鏈,才能實現交叉編譯。

Go 支持的平臺數量在不斷增加。Go 1.5 增加了對 64 位 ARM 和 PowerPC 的支持。Go 1.6 增加了對 64 位 MIPS 的支持,而 IBM 的 s390 架構被吹捧為 Go 1.7。RISC-V 正在開發中。

如果你的產品依賴于 C 語言庫,你不僅有上述交叉編譯的所有問題,你還必須確保你所依賴的 C 語言代碼在 Go 支持的新平臺上可靠地工作 -- 而且你必須在 C/Go 混合語言為你提供的有限調試能力的情況下做到這一點。

你失去了對所有工具的訪問權

Go 有很好的工具;我們有 race detector、用于分析代碼的 pprof、覆蓋率、模糊測試和源代碼分析工具。但這些工具都不能在 cgo 中起到作用(也就是沒法排查)。

相反,像 valgrind 這樣優秀的工具并不了解 Go 的調用約定或堆棧布局。在這一點上,Ian Lance Taylor 的工作是整合 clang 的內存凈化器來調試 C 端的懸空指針,這對 Go 1.6 中的 cgo 用戶有好處。

將 Go 代碼和 C 代碼結合起來的結果是兩個世界的交叉點,而不是結合點;C 的內存安全和 Go 程序的調試性。但失去了許多核心工具的使用空間。

性能將始終是一個問題

C 代碼和 Go 代碼生活在兩個不同的世界里,cgo 穿越了它們之間的邊界,這種轉換不是免費的。而且取決于它在你的代碼中存在的位置,其成本可能是無關緊要的,也可能是巨大的。

?C 對 Go 的調用慣例或可增長的堆棧一無所知,所以對 C 代碼的調用必須記錄 goroutine 堆棧的所有細節,切換到 C 堆棧,并運行 C 代碼,而 C 代碼對它是如何被調用的,或負責程序的更大的 Go 運行時一無所知。

公平地說,Go 對 C 的世界也一無所知。這就是為什么隨著時間的推移,兩者之間的數據傳遞規則變得越來越繁瑣,因為編譯器越來越善于發現不再被認為是有效的堆棧數據,而垃圾回收器也越來越善于對堆進行同樣的處理。

如果在 C 語言世界中出現故障,Go 代碼必須恢復足夠的狀態,至少要打印出堆棧跟蹤并干凈地退出程序,而不是把核心文件的信息都暴露出來。

管理這種跨調用堆棧的過渡,尤其是涉及到信號、線程和回調的情況下,是不容易的(Ian Lance Taylor 在 Go 1.6 中也做了大量的工作來改善信號處理與 C 的互操作性)。

歸根結底,C 語言和 Go 語言之間的轉換是不容易的,互相對對方都一戶無知,會有明顯的性能開銷。

C 語言發號施令,而不是你的代碼

你用哪種語言編寫綁定或包裝 C 代碼并不重要;Python、使用 JNI 的 Java、使用 libFFI 的一些語言,或者通過 cgo 的 Go;這是 C 的世界,你只是生活在其中。

Go 代碼和 C 代碼必須就如何共享地址空間、信號處理程序和線程 TLS 槽等資源達成一致 -- 我說的一致,實際上是指 Go 必須圍繞 C 代碼的假設開展工作。C 代碼可以假設它總是在一個線程上運行,或者根本沒有準備好在多線程環境下工作。

你不是在寫一個使用 C 庫的邏輯的 Go 程序,是在寫一個必須與互不可控的 C 代碼共存的 Go 程序,這個 C 代碼很難被取代,在談判中占上風,而且不關心你的問題。

部署變得更加復雜

任何對普通觀眾的 Go 演講都會包含至少一張帶有這些文字的幻燈片:Single, static binary(單一的、靜態的二進制)。

這是 Go 的一張王牌,使其成為遠離虛擬機和運行時管理的典型代表。使用 cgo,你就放棄了這一點,放棄了 Go 的優勢區域。

根據你的環境,你可能會把你的 Go 項目編譯成 deb 或 rpm,并且假設你的其他依賴項也被打包了,把它們作為安裝依賴項加入,把問題推給操作系統的軟件包管理器。但這對以前像 go build && scp 那樣直接的構建和部署過程來說,是有幾個重大的變化。

完全靜態地編譯 Go 程序是可能的,但這絕不是簡單的,這表明在項目中加入 cgo 的影響會波及整個構建和部署的生命周期。

明智的選擇

說白了,我并不是說你不應該使用 cgo。但是在你做這個設計前,請仔細考慮你將會放棄的 Go 的許多品質。

需要考慮清楚得失,再思考是否值得你這么去做。

參考資料

[1]Cgo is not Go: https://dave.cheney.net/2016/01/18/cgo-is-not-go???

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2023-04-26 08:43:28

GoCGO語言

2019-06-14 10:56:43

JavaMaven編程語言

2021-04-23 07:59:17

Godefer 鏈表

2015-09-08 10:22:42

2020-08-06 08:27:21

JavaScript概念語言

2009-03-17 08:31:08

Window 7微軟用戶

2019-07-25 13:51:01

攜號轉網工信部聞庫

2021-05-07 06:22:51

XDR端點安全安全運營

2020-02-05 14:42:52

網絡安全IT安全漏洞

2017-05-17 17:23:00

2021-12-28 10:25:04

數據庫SQL技術

2021-06-10 07:59:40

Linux 系統硬件操作系統

2019-10-16 11:12:41

云安全云計算數據

2022-03-09 17:37:55

前端架構微前端

2019-10-18 15:16:10

Redis數據庫并發

2021-01-10 23:36:52

SQL數據庫技術

2021-04-27 10:14:33

Go業務函數

2020-06-29 19:15:33

5G頻譜運營商

2012-11-13 16:31:39

效率工作效率項目

2020-12-18 08:59:51

蘋果iCloud儲存照片
點贊
收藏

51CTO技術棧公眾號

可以在线看的av网站| 91在线观看免费网站| 国产真实乱人偷精品| 92久久精品| 9人人澡人人爽人人精品| 韩国美女主播一区| 欧美bbbbb性bbbbb视频| 亚洲精品在线影院| 91麻豆免费观看| 亚洲18私人小影院| 天堂久久精品忘忧草| 草莓视频成人appios| 久久久久久久久一| 国产一区二区视频在线观看| √天堂中文官网8在线| 日韩一区二区三区在线看| 亚洲国产精品一区二区尤物区| 久久国产精品一区二区三区四区 | 亚洲欧美另类小说视频| 国产精品免费一区二区| 人妻中文字幕一区二区三区| 欧美成人日韩| 亚洲热av色在线播放| 成人午夜视频免费看| 欧美一区在线直播| 久久福利免费视频| 欧美成人午夜77777| 欧美日韩在线三级| 无码人妻精品一区二区蜜桃百度| 深夜福利免费在线观看| 久久激五月天综合精品| 91国内免费在线视频| 国产偷人妻精品一区| 成人在线观看免费播放| 午夜欧美视频在线观看| 一区二区三区欧美成人| 四季av日韩精品一区| 精品一区二区在线免费观看| 91精品国产色综合久久不卡98口| 韩国一级黄色录像| 久久99蜜桃| 精品成人在线观看| 在线一区二区不卡| 桃花岛tv亚洲品质| 亚洲高清不卡在线观看| 自拍另类欧美| 二人午夜免费观看在线视频| 成人激情午夜影院| 国产有码一区二区| 无码人妻丰满熟妇精品区| 亚洲香蕉网站| 伊人伊成久久人综合网小说| 99久久国产精| 粉嫩av一区二区| 欧美一级爆毛片| 国产一级片自拍| 校园春色亚洲色图| 欧美日韩在线视频观看| 草草视频在线免费观看| 羞羞的视频在线观看| 成人欧美一区二区三区在线播放| 亚洲成人av动漫| 国产小视频在线观看| 99re这里只有精品6| 国产精品一区二区欧美| 精品人妻av一区二区三区| 日韩精品视频网| 欧洲一区二区视频| 中文字幕精品三级久久久| 在线视频精品| 欧美激情2020午夜免费观看| 黑人巨大精品一区二区在线| 亚洲精品小说| 欧美成人午夜激情| 无码人中文字幕| 欧美wwwww| 北条麻妃99精品青青久久| 欧美肥妇bbwbbw| 五月婷婷亚洲| 成年无码av片在线| 日韩欧美在线一区二区| 一二三区免费视频| 久久男女视频| 国产精品久久网| 国产尤物在线观看| 免费在线视频一区| 国产精品丝袜高跟| 亚洲天堂aaa| 国产精品一区二区三区99| 国产私拍一区| av大片在线观看| 樱花影视一区二区| 国产精品333| 久久精品国产福利| 亚洲国产日韩欧美在线图片| 天天躁日日躁aaaa视频| 国产精品国内免费一区二区三区| 久久久在线视频| 最好看的日本字幕mv视频大全| 国产一区二区三区四区五区美女| 国产成人亚洲欧美| 久草在线免费福利资源| 亚洲激情自拍偷拍| 国产a级片免费观看| 欧美在线在线| 亚洲一级黄色av| 久草国产在线视频| 蜜桃视频一区二区| 精品999在线观看| 黄色成人在线观看| 色老汉一区二区三区| 色欲欲www成人网站| 奇米色欧美一区二区三区| 不卡毛片在线看| 日韩三级一区二区| 成人aa视频在线观看| 中文字幕在线观看一区二区三区| 国产免费不卡| 亚洲国产精品视频在线观看| 艳妇荡乳欲伦69影片| 三级久久三级久久久| 国产精品久久久久久久久久久久冷 | 好看的日韩av电影| 国产欧美精品日韩| 国产毛片av在线| 欧美日韩国产在线| 中文字幕永久免费| 亚洲高清影视| 国产在线精品自拍| 高清日韩av电影| 欧美日韩在线第一页| 国产xxxx视频| 亚洲天堂激情| av一区观看| av网站在线看| 制服丝袜中文字幕一区| 国产黄色录像视频| 天堂精品中文字幕在线| 久久久久久99| 高端美女服务在线视频播放| 91精选在线观看| 在线免费看av网站| 精品在线播放免费| 91手机视频在线| 国产精品美女午夜爽爽| 在线日韩精品视频| 国产精品午夜一区二区| 国产亚洲va综合人人澡精品| 波多野结衣50连登视频| 色婷婷av一区二区三区丝袜美腿| 欧美日本啪啪无遮挡网站| 99热这里只有精品5| 亚洲乱码精品一二三四区日韩在线| 天天综合成人网| 亚洲精品二区三区| av成人免费观看| 视频在线这里都是精品| 精品国一区二区三区| 久久久精品91| 成人a区在线观看| 国自产拍偷拍精品啪啪一区二区| 久久视频在线观看| 日本中文字幕久久看| 男同在线观看| 欧美日韩精品一区二区天天拍小说| 毛片久久久久久| 狠狠色丁香久久婷婷综| avove在线观看| 成人影院中文字幕| 欧美在线国产精品| av免费在线一区二区三区| 欧美日韩综合不卡| 国产在线一卡二卡| 99精品黄色片免费大全| 亚洲色精品三区二区一区| 日本电影一区二区| 1区1区3区4区产品乱码芒果精品| 免费污视频在线| 日韩国产高清污视频在线观看| 五月天婷婷激情| 国产女人aaa级久久久级| 五月天婷婷在线观看视频| 精品动漫3d一区二区三区免费版| 免费日韩电影在线观看| 久久久加勒比| 久久人人爽人人| 成人在线二区| 欧美一级久久久久久久大片| 日韩中文字幕在线观看视频| 国产精品天天摸av网| 亚洲精品成人无码毛片| 久久一区视频| 99re6这里有精品热视频| 亚洲免费福利一区| 成人久久一区二区三区| 欧美裸体视频| 日韩在线观看成人| 午夜av免费在线观看| 欧美日韩色一区| 韩国av免费观看| 国产精品二三区| 亚洲一本大道在线| 久久国产精品无码一级毛片| 久久精品国产77777蜜臀| cao在线观看| 亚洲国产精品日韩专区av有中文 | 91国自产精品中文字幕亚洲| chinese偷拍一区二区三区| 精品久久久久久最新网址| 亚洲国产av一区二区三区| 一区二区久久久久| a资源在线观看| 成人精品一区二区三区四区| 亚洲36d大奶网| 国产精品尤物| 菠萝蜜视频在线观看入口| 欧美一区电影| 久久综合九色综合网站| 日韩在线亚洲| 国产精品自拍网| 国产精欧美一区二区三区蓝颜男同| 色综合久久88色综合天天看泰| 国产在线自天天| 亚洲国产精品999| 国产精品人人妻人人爽| 91国偷自产一区二区开放时间 | 久久五月精品| 在线日韩第一页| 国产精品一级伦理| 亚洲国产欧美日韩精品| 亚洲第一页视频| 91精品国产免费| 亚洲专区在线播放| 色就色 综合激情| 中文字幕亚洲精品在线| 亚洲大片在线观看| 性欧美videos| 综合在线观看色| 潮喷失禁大喷水aⅴ无码| 久久久久久免费毛片精品| 日本xxx在线播放| 99久久精品一区| av网站有哪些| 91视频你懂的| 欧美亚一区二区三区| www精品美女久久久tv| 182在线视频| 91免费观看视频在线| 国产中文字幕一区二区| 99riav一区二区三区| 五月开心播播网| 91免费国产视频网站| www.色天使| 国产三级精品三级在线专区| 91精品人妻一区二区三区| 久久亚洲二区三区| 一级片手机在线观看| 国产网站一区二区三区| 精品国产aaa| 国产亚洲精品aa午夜观看| 欧美福利第一页| 国产精品色呦呦| 午夜爽爽爽男女免费观看| 亚洲免费看黄网站| 久热这里只有精品在线| 午夜精品久久久久久久99水蜜桃| 奇米影视第四色777| 一本色道**综合亚洲精品蜜桃冫| 91午夜精品亚洲一区二区三区| 欧美自拍丝袜亚洲| 国产精品免费无遮挡| 精品久久久久久久久久久久久久久| 天堂av在线免费| 夜夜嗨av一区二区三区四区| 久热国产在线| 国内精品400部情侣激情| 成人免费短视频| 国产一区二区在线免费| 中文无码日韩欧| 欧美色欧美亚洲另类七区| 婷婷丁香综合| 国产 日韩 欧美在线| 免费亚洲一区| 国产永久免费网站| 99久久久国产精品免费蜜臀| ass极品国模人体欣赏| 亚洲精选视频免费看| 日本一级片免费看| 欧美乱熟臀69xxxxxx| 乱精品一区字幕二区| 国产一区二区av| 91小视频xxxx网站在线| 欧洲美女免费图片一区| 国产精品一区二区三区四区在线观看| 国产一区二区黄色| 日韩精品免费一区二区三区| 91动漫在线看| 美女视频黄久久| 老司机免费视频| 国产精品久久久久久久岛一牛影视 | 永久看看免费大片| 久久网站热最新地址| 一区视频免费观看| 一本大道久久a久久精品综合| 99精品人妻无码专区在线视频区| 国产丝袜一区二区| 黑人精品视频| 国产日韩精品在线| 妖精一区二区三区精品视频 | 欧美一级久久久| 国产女主播在线写真| 国内精品400部情侣激情| 91麻豆精品国产综合久久久| 欧美日韩综合网| 伊人成年综合电影网| 亚洲欧美日韩一二三区| 国产午夜精品一区二区三区嫩草| 国产性生活网站| 51久久夜色精品国产麻豆| 国内三级在线观看| 91av视频在线播放| caoporn成人| 国产一区二区三区在线免费| 久久电影网站中文字幕| 国产精品天天干| 欧美日韩国产色| 欧美亚洲精品在线观看| 久久精品久久久久电影| 久久91超碰青草在哪里看| 日韩激情久久| 麻豆成人精品| 亚洲第一页av| 精品久久久精品| 天堂av手机版| 国内精品免费午夜毛片| 51vv免费精品视频一区二区| 日韩亚洲欧美一区二区| 国产中文字幕精品| 午夜精品久久久久99蜜桃最新版 | 日本888xxxx| 国产午夜精品一区二区三区嫩草 | 国产一二三四在线| 日韩欧美久久一区| 性欧美video高清bbw| 97伦理在线四区| 欧美日韩精选| 日本道中文字幕| 红桃视频成人在线观看| 香蕉视频911| 2021国产精品视频| 妖精视频一区二区三区| www日韩视频| 国产精品久久看| 国产精品久久免费| 欧美日本亚洲视频| 久久资源综合| 精品99在线视频| 国产区在线观看成人精品| 国产精品国产精品国产| 色阁综合伊人av| 国产亚洲字幕| 和岳每晚弄的高潮嗷嗷叫视频| 97精品超碰一区二区三区| 亚洲不卡视频在线观看| 在线日韩中文字幕| 激情综合婷婷| 精品无码国模私拍视频| 久久久久亚洲蜜桃| 中文字幕免费观看视频| 免费91在线视频| 欧美一区自拍| 婷婷六月天在线| 亚洲精品乱码久久久久久久久 | 99麻豆久久久国产精品免费 | 毛片在线网址| 蜜桃av久久久亚洲精品| 免费在线观看不卡| 青青草原国产视频| 亚洲精选一区二区| 欧美黄色a视频| 日韩一级性生活片| 国产色产综合产在线视频| 91极品身材尤物theporn| 欧美丰满片xxx777| 欧美久久综合网| 成人啪啪18免费游戏链接| 色丁香久综合在线久综合在线观看| 日本三级视频在线播放| 黄色99视频| 狠狠狠色丁香婷婷综合激情| 国产精品成人国产乱| 在线观看欧美视频| 91精品入口| 一区二区三区视频在线观看免费| 一区二区在线看| 黄色av网站在线| 国产精品一区视频网站| 美女视频黄久久| 成人在线免费看视频| 久久久精品亚洲|