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

我們應該怎么樣編寫 Go 語言庫,有哪些標準可以參考?

開發 后端
不久前我和朋友們想出一個主意,準備合并我們的 IRC bots,并用 Go 重寫它們。為了防止重寫大部分現有功能,我們試圖找到支持 bots 程序中使用的 Web API 的現有庫。我們的項目需要一個 Reddit API 的庫。

 不久前我和朋友們想出一個主意,準備合并我們的 IRC bots,并用 Go 重寫它們。為了防止重寫大部分現有功能,我們試圖找到支持 bots 程序中使用的 Web API 的現有庫。我們的項目需要一個 Reddit API 的庫。這篇文章啟發于我找到的前三個庫,我不打算說出它們的名字,以免羞辱它們的作者。

[[314580]]

上面說的每一個庫都存在一些基本問題以至于它們在真實場景中不可用。并且每個庫都以這樣一種方式編寫:不以非向后兼容的方式修改現有庫的 API,這樣是不可能修復問題的。不幸的是,由于很多其他的庫也存在同樣的問題,所以我會在下面列出一些作者錯誤的地方。

不要對 HTTP 客戶端硬編碼

很對庫都包含了對 http.DefaultClient 的硬編碼。雖然對庫本身來說這并不是問題,但是庫的作者并未理解應該怎樣使用 http.DefaultClient 。正如 default client 建議它只在用戶沒有提供其他 http.Client 時才被使用。相反的是,許多庫作者樂意在他們代碼中涉及 http.DefaultClient 的部分采用硬編碼,而不是將它作為一個備選。這會導致在某些情況下這個庫不可用。

首先,我們很多人都讀過這篇講述 http.DefaultClient 不能自定義超時時間的文章《Don’t use Go’s default HTTP client (in production)[1]》,當你沒法保證你的HTTP 請求一定會完成(或者至少要等一個完全無法預估時間的響應)時,你的程序可能會遇到奇怪的 goroutine 泄漏和一些無法預知的行為。在我看來,這會使每一個對 http.DefaultClient 采用硬編碼的庫不可用。

其次,網絡需要一些額外的配置。有時候需要用到代理,有時候需要對 URL 進行一丟丟的改寫,甚至可能 http.Transport 需要被一個定制的接口替換。當一個程序員在你的庫里用他們自己的 http.Client 實例時,以上這些都很容易被實現。

在你的庫中處理 http.Client 的推薦方式是使用提供的客戶端,但是如果需要的話,有一個默認的備選:

 

  1. func CreateLibrary(client *http.Client) *Library {    if client == nil {        client = http.DefaultClient    }    ...} 

或者如果你想從工廠函數中移除參數,請在你的 struct 中定義一個輔助方法,并且讓用戶在需要時設置其屬性:

 

  1. type Library struct {    Client *http.Client}func (l *Library) getClient() *http.Client {    if l.Client == nil {        return http.DefaultClient    }    return l.Client} 

另外,如果一些全局的特性對于每個請求來講都是必須的,人們經常感覺到需要用他們自己的實例來替換 http.Client。這是一個錯誤的方法 — 如果你需要在你的請求中設置一些額外的 headers,或者在你的客戶端引入某類公共的特性,你只需要簡單為每個請求進行設置或者用組裝定制客戶端的方式來代替完全替換它。

不要引入全局變量

另一個反面模式是允許用戶在一個庫中設置全局變量。舉個例子,在你的庫中允許用戶設置一個全局的 http.Client 并被所有的 HTTP 調用執行:

 

  1. var libraryClient *http.Client = http.DefaultClientfunc SetHttpClient(client *http.Client) {    libraryClient = client} 

通常在一個庫中不應該存在一堆全局變量。當你寫代碼的時候,你應該想想用戶在他們的程序中多次使用你的這個庫會發生什么。全局變量會使不同的參數沒有辦法被使用。而且,在你的代碼中引入全局變量會引起測試上的問題并造成代碼上不必要的復雜度。使用全局變量可能會導致在你程序的不同模塊有不必要的依賴。在寫你的庫的時候,避免全局狀態是格外重要的。

返回 structs,而不是 interfaces

這是一個普遍的問題(實際上我在這一點上也犯過錯)。很多庫都有下面這類函數:

 

  1. func New() LibraryInterface {    ...} 

在上面的 case 中,返回一個 interface 使 struct 的特性在庫里被隱藏了。實際上應該這么寫:

 

  1. func New() *LibraryStruct {    ...} 

在庫里不應該存在接口的聲明,除非它被用在某個函數參數中。如果出現上面的 case,你就應該想想你在寫這個庫的時候的約定。當返回一個 interface 時,你基本上得聲明一系列可用的方法。如果有人想用這個接口來實現他們自己的功能(比如說為了測試),他得打亂他們的代碼來添加更多的方法。這意味著盡管在 struct 里添加方法是安全的,但在 interface 里不是。這個想法在這篇文章中被總結得很好《Accept Interfaces Return Struct in Go[2]》。這個方案也能解決配置的問題。你想修改庫中的一些特性,你可以簡單的修改 struct 中一些公開的字段。但是如果你的庫只提供給用戶一個 interface,這就玩不轉了。

使用配置結構體來避免修改你的APIs

另一種配置方法是在你的工廠函數中接收一個配置結構體,而不是直接傳配置參數。你可以很隨意的添加新的參數而不用破壞現有的 API。你只需要做一件事情,在Config結構體中添加一個新的字段,并且確保不會影響它原本的特性。

 

  1. func New(config Config) *LibraryStruct {    ...} 

下面是一種添加結構體字段的正確的場景,如果一個用戶初始化結構體的時候忘了添加字段名,這是一種我認為修改他們的代碼能得到原諒的場景。為了維護兼容性,你應該在你的代碼中用 person{name: "Alice", age: 30} 而不是 person{"Alice", 30}。

你能在 golang.org/x/crypto[4] 包里看到對上面的補充。總之,對配置來說,我認為允許用戶在返回的結構體里設置不同的參數是一個更好的方法,并且只在編寫復雜方法時才使用這種特定方法。

總結

根據經驗來講,在寫一個庫的時候,你應該總是允許用戶指定他們自己的 http.Client來執行 HTTP 調用。而且考慮到未來迭代修改帶來的影響,你可以嘗試用可擴展的方式編寫代碼。避免全局變量,庫不能存儲全局狀態。如果你有任何疑問-參考標準庫是怎么寫的。

我認為有一個很好的想法,在你的程序中用你的庫來測試并問自己一些問題:

  • 如果你嘗試多次引入庫會發生什么?
  • 你的庫有沒有單元測試?
  • 在不破壞原有代碼的前提下,有沒有一種非侵入式的方式來擴展你的庫?
  • 在不破壞原有代碼的前提下,是否可以添加額外配置參數?

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2020-02-05 16:55:11

Go語言程序員文章

2021-03-01 21:59:25

編程語言GoCX

2021-03-01 18:35:18

Go語言虛擬機

2023-04-02 23:13:07

Go語言bufio

2025-07-29 10:00:02

2022-10-17 09:08:01

2024-08-22 08:50:51

2025-02-11 09:01:57

2011-02-25 10:12:09

GoWeb

2014-02-18 11:24:07

云計算PaaS

2023-02-13 00:24:37

Go語言日志庫

2023-06-07 17:46:32

AI高考

2024-05-07 08:46:06

GoGoogle云原生

2016-09-27 21:25:08

Go語言Ken Thompso

2014-01-14 09:10:53

GoHTTP內存泄漏

2021-02-03 20:20:34

ReacHook數據

2022-10-21 09:23:31

腦累計算深度學習

2010-03-26 13:15:28

Python嵌入c

2015-07-23 11:49:31

程序猿

2020-11-27 07:45:31

JVM垃圾回收
點贊
收藏

51CTO技術棧公眾號

日韩中文字幕在线视频| 亚洲综合色噜噜狠狠| 国产成人啪精品视频免费网| 欧美午夜激情影院| 日韩国产在线不卡视频| 精品久久久久久亚洲精品| 五月天国产一区| 亚洲精品国偷拍自产在线观看蜜桃| 一本色道88久久加勒比精品| 国产亚洲欧美aaaa| 欧美图片自拍偷拍| 日韩欧美一区二区三区在线观看 | 亚洲综合日韩中文字幕v在线| 精品在线视频免费观看| 成人在线免费小视频| 精品国精品国产| 欧美伦理片在线观看| wwwww亚洲| 中文字幕一区二区三区蜜月| 国产精品一区二区免费| 中文字幕人妻丝袜乱一区三区| 你懂的亚洲视频| 国产一区二区三区丝袜| 国产 xxxx| 精品一区二区三区中文字幕视频 | 欧美牲交a欧美牲交aⅴ免费下载| 直接在线观看的三级网址| 久久久精品日韩欧美| 99国产视频在线| 91国偷自产中文字幕久久| 国产精品腿扒开做爽爽爽挤奶网站| 日韩少妇与小伙激情| 成熟人妻av无码专区| 极品尤物一区| 日韩欧美123| 亚洲一区精品视频在线观看| 欧美日韩五区| 色综合久久88色综合天天6| 久久手机在线视频| caopen在线视频| 国产精品久久网站| 亚洲国产欧美一区二区三区不卡| 亚洲av成人精品一区二区三区在线播放 | 亚洲欧美另类小说| 亚洲资源在线网| av大片在线播放| 国产午夜亚洲精品午夜鲁丝片| 精品无码久久久久国产| 手机看片1024日韩| 99在线精品免费| 国产伦精品一区二区三| 日本韩国免费观看| 成人黄色综合网站| 黑人巨大精品欧美一区二区小视频| 亚洲av无码一区二区乱子伦| 国产成人在线看| 91精品综合久久| 亚洲精品喷潮一区二区三区 | 久久久久亚洲av无码专区桃色| 老司机凹凸av亚洲导航| 亚洲白虎美女被爆操| 国产十八熟妇av成人一区| 国产精品毛片久久久| 精品国产91乱码一区二区三区| 男人的天堂免费| jizz18欧美18| 国产视频精品一区二区三区| 亚洲制服丝袜在线播放| 九九久久电影| 在线日韩精品视频| 久草手机视频在线观看| 艳女tv在线观看国产一区| 裸体女人亚洲精品一区| 国产午夜久久久| 午夜在线精品偷拍| 国产精品久久久久久久久免费看| 最近中文字幕av| 精品在线亚洲视频| 超碰在线97av| 日中文字幕在线| 国产免费成人在线视频| 亚洲第一精品区| 韩国成人免费视频| 91精品办公室少妇高潮对白| 孩娇小videos精品| 国产视频网站一区二区三区| 欧美xingq一区二区| 亚洲第一页av| 国产精品久久占久久| 欧美国产日韩免费| 丰满人妻老熟妇伦人精品| 免费人成网站在线观看欧美高清| 69堂成人精品视频免费| 三级黄视频在线观看| 国产精品福利一区二区三区| 国产高清www| 免费在线观看一区| 精品精品欲导航| 懂色av粉嫩av浪潮av| 午夜久久久久| 国产精品精品视频| 亚洲国产成人在线观看| 久久久精品免费观看| 国产精品视频网站在线观看| 日韩电影免费观| 精品少妇一区二区三区在线播放 | 婷婷开心激情综合| 色片在线免费观看| 亚洲第一二三区| 欧美国产日韩视频| 伊人免费在线观看| 91网站在线播放| 亚洲高潮无码久久| 成人看片网页| 日韩精品极品视频| 538任你躁在线精品视频网站| 老鸭窝毛片一区二区三区| 亚洲最大成人网色| 成人av免费电影| 日本三级2019| 国产一区二区三区黄视频| 久久99精品久久久久子伦| 秋霞午夜在线观看| 在线免费av一区| 大尺度做爰床戏呻吟舒畅| 99欧美视频| 国产精品成人观看视频国产奇米| 国精产品一品二品国精品69xx| 国产精品美女久久久久久2018 | 久草中文在线观看| 色国产精品一区在线观看| fc2成人免费视频| 欧美1区免费| 91精品国产综合久久久久久久久| 你懂的在线播放| 欧美日韩中国免费专区在线看| 成年人性生活视频| 天天影视天天精品| 国产精品一区久久| 国产原创av在线| 色综合天天综合给合国产| 亚洲av永久无码精品| 国产精品av一区二区| 亚洲影视九九影院在线观看| 麻豆电影在线播放| 在线播放91灌醉迷j高跟美女 | 99re视频| www.久久ai| 欧美一级理论片| 亚洲天堂黄色片| 国产精品白丝jk白祙喷水网站| 在线免费一区| 麻豆精品久久| 欧美老女人xx| 亚洲精品国偷拍自产在线观看蜜桃| 亚洲精选视频在线| 精产国品一区二区三区| 亚洲国产国产亚洲一二三| 国产伦精品一区二区三区高清 | 伊人久久大香线| 91午夜在线播放| 黄网站在线观| 亚洲黄色在线看| 六月丁香婷婷综合| 91香蕉视频黄| 日韩电影中文 亚洲精品乱码 | 久久综合九色综合97婷婷女人 | 日韩电视剧在线观看免费网站 | 久久九九免费| 手机成人在线| 亚洲综合资源| 欧美激情图片区| 亚洲区小说区图片区| 欧美性20hd另类| 在线免费观看视频| 国产精品18久久久| 九色自拍视频在线观看| 亚洲精品进入| 欧美日韩aaaaa| 91久久国产最好的精华液| 亚洲午夜精品国产| 国产成人视屏| 久久久久免费精品国产| 波多野结衣福利| 亚洲91网站| 国产91精品青草社区| 极品美乳网红视频免费在线观看| 欧亚洲嫩模精品一区三区| 娇小11一12╳yⅹ╳毛片| 国产电影一区在线| 欧美在线xxx| 中文字幕不卡在线视频极品| 色婷婷粉嫩av| 国产福利精品导航| 国产熟女高潮视频| 91精品推荐| 精品国产乱码久久久久久蜜柚 | 97欧美在线视频| 在线91免费看| 亚洲av网址在线| 日本午夜一本久久久综合| 中文字幕乱码免费| 曰本一区二区三区视频| 亚洲综合第一页| 日韩新的三级电影| 欧美激情综合亚洲一二区| 你懂的好爽在线观看| 欧美一区二区精品在线| 免费的毛片视频| 亚洲一区二区在线视频| 国产视频123区| 91蜜桃婷婷狠狠久久综合9色| 九色porny自拍| 老鸭窝毛片一区二区三区| 国产欧美123| 日韩国产在线| 欧美精品二区三区四区免费看视频| 国产日韩在线观看视频| 日本一区二区不卡| 国产精品一区hongkong| 久久久国产视频| 国产高清免费在线播放| 亚洲国产精品va在线观看黑人| 国产精品国产三级国产普通话对白| 欧美特级www| 日韩少妇裸体做爰视频| 亚洲黄色片在线观看| 亚洲AV成人无码网站天堂久久| 91丨porny丨首页| 97人妻精品一区二区三区免费| 极品尤物av久久免费看| 超碰在线人人爱| 午夜在线视频一区二区区别| 国产精品久久久久9999爆乳| 久久久久久影院| 亚洲国产精品女人| 成人免费av| 亚洲国产一区在线| 欧美日韩老妇| 色阁综合av| 国产成人精品免费视| 欧美日韩国产精品一区二区| 日韩精品a在线观看91| 国产午夜精品一区| 美女一区二区在线观看| 激情小说网站亚洲综合网| 97se亚洲国产一区二区三区| 亚洲a级在线观看| 狂野欧美xxxx韩国少妇| 91网站在线免费观看| 国产一区二区三区视频在线| 91亚洲精品在线| 视频亚洲一区二区| 99re在线| 国产 日韩 欧美 综合 一区| 国产精品夜夜夜一区二区三区尤| aiai久久| 久久一区二区三区欧美亚洲| 视频福利一区| 欧美一区1区三区3区公司 | 在线精品日韩| 综合激情婷婷| 成人免费观看在线| 亚洲三级网站| 亚洲国产精品毛片av不卡在线| 日韩高清一区在线| www.色就是色.com| 国产成人在线视频网址| 国产a级黄色片| 久久日韩精品一区二区五区| x88av在线| 亚洲天天做日日做天天谢日日欢| 免费在线观看黄视频| 午夜成人在线视频| 欧美男人天堂网| 4hu四虎永久在线影院成人| 精品人妻无码一区二区三区蜜桃一 | 欧美成人三级| 亚洲一区国产精品| 青青一区二区| 樱花www成人免费视频| 午夜性色一区二区三区免费视频 | 777777国产7777777| 亚洲国产视频在线| 日韩精品成人免费观看视频| 欧美日韩另类一区| 免费看黄色一级视频| 亚洲人成自拍网站| 黄色在线论坛| 人人做人人澡人人爽欧美| 亚洲精品66| 精品国产免费人成电影在线观...| 国产精品三级| 国产日韩第一页| 噜噜噜91成人网| 熟妇无码乱子成人精品| 久久综合av免费| 日韩成人毛片视频| 一本到不卡精品视频在线观看| 99精品久久久久久中文字幕| 日韩电视剧在线观看免费网站| 国产一二三区在线观看| 奇米四色中文综合久久| 欧美专区一区| 日韩精品福利视频| 亚洲激情偷拍| 奇米777在线| 日本一区二区成人在线| 免费在线黄色片| 播放一区二区| caoporn国产一区二区| 久久久噜噜噜久久中文字免| av鲁丝一区鲁丝二区鲁丝三区| 爆操欧美美女| 亚洲大尺度美女在线| 99青草视频在线播放视| 久久免费成人精品视频| 国产亚洲精彩久久| 激情五月综合色婷婷一区二区 | 国产激情久久| 久久青青草综合| 黑丝一区二区| 一级黄色在线播放| 国产欧美日韩激情| 制服.丝袜.亚洲.中文.综合懂色| 精品少妇一区二区三区在线视频| 麻豆av在线免费看| 国产精品久久77777| 欧美电影在线观看免费| 国产乱淫av片杨贵妃| 国产盗摄女厕一区二区三区| 国产免费美女视频| 欧美日韩久久久久久| 成人免费黄色网页| 国产精品h在线观看| 亚洲素人在线| 18岁视频在线观看| 久久香蕉国产线看观看99| 福利视频一二区| 蜜桃视频网站在线观看| 欧美激情第三页| 欧美经典一区| 久久av喷吹av高潮av| 久久激五月天综合精品| 午夜影院黄色片| 欧美亚洲愉拍一区二区| 国产天堂在线| 国产精品视频久久久| 欧美精品一区二区三区精品| 爆乳熟妇一区二区三区霸乳| 久久久久久免费网| 香蕉影院在线观看| 国产一区二区三区四区福利| aaaa欧美| 中文字幕99| 国产一区二区成人久久免费影院| 国产第一页浮力| 欧美岛国在线观看| 538国产视频| 黄一区二区三区| 亚洲人与黑人屁股眼交| 7777精品久久久大香线蕉| 国产高清一区二区三区视频| 亚洲永久免费观看| 国精品一区二区| 特级西西人体4444xxxx| 色八戒一区二区三区| 成人全视频高清免费观看| 成人网在线免费看| 欧美人成网站| 中出视频在线观看| 欧美怡红院视频| 国产视频中文字幕在线观看| 成人动漫视频在线观看免费| 中文字幕一区图| 欧洲亚洲妇女av| 成人影视亚洲图片在线| 黄色三级视频在线播放| 午夜精品久久久久久久99樱桃| 香蕉人妻av久久久久天天| 国产精品第1页| 一本一本久久a久久综合精品| 国产51自产区| 欧美亚洲动漫精品| 在线黄色网页| 欧美xxxx黑人又粗又长密月 | 成人激情自拍| 大陆av在线播放| 国产亚洲婷婷免费| 国产青青草视频| 97热精品视频官网| 日韩亚洲一区在线| 无码人妻丰满熟妇啪啪网站| 色呦呦网站一区| av免费在线免费| 欧美日韩一区在线视频| 国产精品亚洲专一区二区三区| 4438国产精品一区二区| 久久久国产一区二区| 九一亚洲精品|