精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品啊v在线| 欧美激情三级| 国产精品天美传媒| 成人网址在线观看| 日本三级2019| 欧美日韩水蜜桃| 日韩视频免费观看高清完整版| 少妇无码av无码专区在线观看| 福利视频在线看| 国产精品资源在线看| 欧美在线视频在线播放完整版免费观看| 国产精品久久久久久久av| 午夜久久av| 欧美亚洲尤物久久| 黄色成人在线免费观看| 国产大学生校花援交在线播放| 国产美女娇喘av呻吟久久| 国产91精品视频在线观看| 91 在线视频| 国产日韩欧美一区二区三区| 欧美成人精品高清在线播放 | 午夜欧美精品久久久久久久| 亚洲欧美激情另类校园| 少妇熟女视频一区二区三区| 中文字幕av一区二区三区佐山爱| 亚洲黄网站在线观看| 婷婷四月色综合| 性猛交xxxx| 国产精品综合网| 国产精品免费视频久久久| 国产精品自拍99| 韩国欧美一区| 久久久精品日本| 成人无码精品1区2区3区免费看| 欧美交a欧美精品喷水| 日韩亚洲国产中文字幕欧美| 天堂av8在线| 免费在线成人激情电影| 欧美日韩在线影院| 男人日女人下面视频| caopon在线免费视频| 国产精品美女久久久久aⅴ国产馆| 久久本道综合色狠狠五月| 亚洲av无码国产精品久久不卡| 久久精品国产999大香线蕉| 日韩暖暖在线视频| 天天干天天干天天操| 亚洲激情婷婷| 午夜精品福利视频| 精品美女久久久久| 99成人在线| 国模私拍视频一区| 精品91久久久| 国产精品普通话对白| 91精品国产一区| 韩国av免费观看| 在线日韩中文| 91国在线精品国内播放 | 91国产免费观看| 免费男同深夜夜行网站| 日韩精选视频| 欧美精品丝袜中出| 日韩av加勒比| 99香蕉久久| 亚洲国产中文字幕久久网| 亚洲精品激情视频| 天堂网av成人| 在线观看亚洲区| 亚洲区一区二区三| 欧美成熟视频| 55夜色66夜色国产精品视频| 久久精品久久久久久久| 日韩精品一二三| 91亚洲精品久久久| 成人午夜精品福利免费| 91视频com| 亚洲一区二区自拍偷拍| av电影高清在线观看| 一区二区三区.www| 无码精品a∨在线观看中文| 性欧美18~19sex高清播放| 色94色欧美sute亚洲线路一久 | 中文字幕免费精品一区| 国产又色又爽又高潮免费 | 午夜免费福利小电影| 国产精欧美一区二区三区蓝颜男同| 91豆麻精品91久久久久久| 亚洲一区二区在线视频观看| 99re6热只有精品免费观看| 亚洲女人被黑人巨大进入al| 人人澡人人澡人人看| 激情综合自拍| 国产精品中文字幕久久久| 亚洲av无码乱码国产精品久久| 91麻豆国产福利在线观看| 在线国产精品网| 免费在线小视频| 在线综合+亚洲+欧美中文字幕| 熟妇高潮一区二区| 日韩精品一区二区久久| 高清欧美一区二区三区| 中日精品一色哟哟| 成人av在线影院| 一区一区视频| 久九九久频精品短视频| 欧美一区二区三区日韩| 成人免费毛片糖心| 欧美另类亚洲| 国产精品日韩专区| 天天综合在线视频| 亚洲三级小视频| 欧美一级裸体视频| 老牛精品亚洲成av人片| 欧美成人黑人xx视频免费观看| 黄瓜视频在线免费观看| 成人自拍视频在线观看| 中文字幕一区二区三区最新| 电影网一区二区| 亚洲变态欧美另类捆绑| 九九精品视频免费| 毛片不卡一区二区| 欧美中文娱乐网| av蜜臀在线| 欧美不卡123| 卡通动漫亚洲综合| 蜜桃一区二区三区在线观看| 欧美日韩一区二区三区在线观看免| 色呦呦在线观看视频| 欧美日韩色一区| 国产精品av久久久久久无| 国产精品久久久久久久免费软件| 97超碰在线播放| 超碰在线caoporn| 欧美精品免费视频| 长河落日免费高清观看| 日本在线不卡视频一二三区| 欧美激情第一页在线观看| а√天堂8资源在线| 欧美精品一区二区在线观看| 青娱乐国产在线| 国产精品亚洲成人| 潘金莲一级淫片aaaaaa播放1| 欧美亚洲人成在线| 日韩在线视频播放| 国产又粗又长又黄| 亚洲日本中文字幕区| 国产福利精品一区二区三区| 日韩欧美自拍| 91精品久久久久久久| 黄色的网站在线观看| 欧美日韩国产高清一区二区| 久操视频在线观看免费| 免费高清在线视频一区·| 午夜精品视频在线观看一区二区 | 精品福利av| 国产精品区一区二区三在线播放| 精精国产xxxx视频在线中文版| 日韩你懂的在线观看| 精品亚洲永久免费| 99久久国产综合精品色伊| 丰满少妇久久久| 亚洲精品推荐| 国产精品网址在线| 性国产高清在线观看| 精品国产不卡一区二区三区| 精品在线播放视频| 久久精品欧美一区二区三区不卡| 日韩欧美在线免费观看视频| 99热精品久久| 99精彩视频在线观看免费| √天堂8资源中文在线| 亚洲精品中文字幕av| 波多野结衣高清在线| 中文字幕亚洲一区二区va在线| 中文字幕人妻无码系列第三区| 亚洲欧洲一区| 日韩一本精品| 国产精品一区二区三区www| 国语自产精品视频在线看一大j8| 日本ー区在线视频| 欧美日韩精品欧美日韩精品一综合| 精品国产欧美日韩不卡在线观看| 成人午夜视频网站| 黄色高清无遮挡| 综合日韩在线| 欧美日本韩国在线| 国产精品视频一区视频二区| 91精品国产自产91精品| 午夜在线播放| 亚洲国产精品人人爽夜夜爽| 亚洲天堂视频在线播放| 亚洲精品高清在线| 中文字幕网站在线观看| 国产精品自拍av| 日本www.色| 国产综合网站| 亚洲欧美日本国产有色| 精品国产导航| 成人在线免费观看视视频| 国产精品电影| 免费91麻豆精品国产自产在线观看| 亚洲av片在线观看| 日韩欧美亚洲一区二区| 日本黄色中文字幕| 午夜精品久久久久久不卡8050| 天堂资源在线视频| 99视频在线观看一区三区| 亚洲一区二区三区观看| 久久久久国产精品一区二区| 青青草国产免费| 婷婷综合在线| 污视频在线免费观看一区二区三区| 亚洲综合网站| 96sao精品视频在线观看| 亚洲四虎影院| 欧美亚洲第一页| 国产精品186在线观看在线播放| 中文字幕自拍vr一区二区三区| 天堂在线视频免费观看| 日韩久久精品一区| 一级黄色片在线观看| 在线观看一区日韩| 天天插天天操天天干| 亚洲综合色视频| 高h视频免费观看| 国产精品激情偷乱一区二区∴| 一级片手机在线观看| 91在线观看污| 最近日本中文字幕| 粉嫩嫩av羞羞动漫久久久| 51自拍视频在线观看| 久久99国产精品尤物| 成人亚洲精品777777大片| 久久精品男女| 国产熟女高潮视频| 裸体一区二区| 已婚少妇美妙人妻系列| 久久国产免费| 亚洲精品高清无码视频| 国产一区91| 国产成人a亚洲精v品无码| 在线观看的日韩av| 日本十八禁视频无遮挡| 亚洲国产日韩在线| 亚洲熟妇无码另类久久久| 一本色道精品久久一区二区三区| 99在线免费视频观看| 亚洲黄色天堂| 国产精品无码一区二区在线| 亚洲黄色精品| 蜜臀av午夜一区二区三区| 美女精品在线观看| 亚洲精品一二三四五区| 久久成人免费电影| 亚洲免费在线播放视频| 国产伦理精品不卡| 亚洲图片欧美另类| 99re成人在线| 久久美女免费视频| 中文字幕字幕中文在线中不卡视频| 黄视频网站免费看| 亚洲一区二区影院| www.国产高清| 欧美在线影院一区二区| 国产伦精品一区二区三区四区| 日韩一级大片在线观看| 女人18毛片水真多18精品| 亚洲国产一区二区三区四区| 韩国精品视频| 久久精品国产一区二区三区| 黄色羞羞视频在线观看| 欧美一级淫片播放口| av成人亚洲| 97碰碰视频| 国产成人ay| 国产91porn| 久久福利毛片| 色姑娘综合天天| 91丨porny丨在线| 老司机成人免费视频| 亚洲午夜国产一区99re久久| 国产精品午夜影院| 欧美高清视频一二三区| 欧美一级性视频| 亚洲人午夜色婷婷| caoporm免费视频在线| 人人澡人人澡人人看欧美| 亚洲精品tv| 六十路精品视频| 99久久亚洲精品蜜臀| 国产婷婷一区二区三区| 精品一区二区久久久| 免费黄色三级网站| 亚洲欧美在线aaa| 特级毛片www| 日韩欧美成人一区| 国产大学生校花援交在线播放 | 丁香婷婷综合五月| 精品无码人妻一区二区免费蜜桃| 亚洲卡通动漫在线| 无码人妻av一区二区三区波多野| 日韩欧美一区在线| www.在线播放| 欧美亚洲成人精品| 天堂久久av| 一区二区三区四区视频在线| 国产精品亚洲产品| 亚洲综合中文网| 国产精品灌醉下药二区| 国产无套丰满白嫩对白| 欧美精品一区二区三区蜜桃| 搞黄网站在线观看| 国产精品网站入口| 国产伦精品一区二区三区视频| 久艹在线免费观看| 国产一区在线观看视频| 国产一区二区三区四区在线| 黑人狂躁日本妞一区二区三区 | 亚洲视频在线免费看| 成年人国产在线观看| 91精品综合久久| 99久久夜色精品国产亚洲96| 天天爽天天爽夜夜爽| 久久亚洲综合av| www.国产成人| 亚洲国产小视频在线观看| 中文av资源在线| 99国产高清| 在线中文字幕第一区| 免费一区二区三区在线观看| 国产欧美日韩另类视频免费观看| 国产九色在线播放九色| 亚洲精品电影网在线观看| 色呦呦网站在线观看| 亚洲a在线观看| 91精品国产乱码久久久久久| 性生活免费在线观看| 国产三级欧美三级| 国产精品欧美综合| 永久免费看mv网站入口亚洲| 婷婷激情一区| 五月天色一区| 另类人妖一区二区av| 免费看日本黄色片| 欧美日韩一区视频| 最新国产在线观看| 91欧美激情另类亚洲| 国产精品国产三级国产在线观看| 色91精品久久久久久久久| 亚洲欧洲成人av每日更新| 国产麻豆91视频| 精品中文字幕在线| 国产成人精品亚洲线观看| 黄页网站大全在线观看| 99久久婷婷国产| 国产免费一区二区三区四区五区| 国产一区二区三区四区福利| 成人午夜亚洲| 免费成人深夜夜行网站视频| 国产不卡视频一区二区三区| 国产一级二级三级视频| 亚洲精品97久久| 欧美free嫩15| 中文字幕色呦呦| 99久久精品情趣| 无码aⅴ精品一区二区三区| 一区二区亚洲精品国产| 国产剧情一区二区在线观看| 国产精品久久久久9999爆乳| 久久免费电影网| 亚洲自拍第二页| 久久久久国产精品免费网站| 亚洲裸色大胆大尺寸艺术写真| 国内自拍视频网| 一区二区激情小说| 青青草手机在线| 成人在线观看视频网站| 亚洲激情专区| 素人fc2av清纯18岁| 欧美日韩aaaaaa| sm捆绑调教国产免费网站在线观看 | 亚洲天堂手机在线| 欧美大片免费观看在线观看网站推荐| 精品在线网站观看| 在线免费观看视频黄| 亚洲一区二三区| 国产三级在线免费观看| 亚洲一区中文字幕| 久久亚洲风情| 欧美丰满艳妇bbwbbw| 亚洲香蕉成人av网站在线观看| 国产电影一区二区| 欧美视频第一区| 亚洲激情图片qvod| 国产在线观看免费| av成人免费观看| 久久精品久久99精品久久| 日韩精品一卡二卡| 欧美xxxx18国产| 精品日韩一区|