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

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

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

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

[[314065]]

上面說的每一個庫都存在一些基本問題以至于它們在真實場景中不可用。并且每個庫都以這樣一種方式編寫:不以非向后兼容的方式修改現有庫的 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] 包里看到對上面的補充??傊瑢ε渲脕碚f,我認為允許用戶在返回的結構體里設置不同的參數是一個更好的方法,并且只在編寫復雜方法時才使用這種特定方法。

總結

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

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

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

 

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

2020-02-11 09:41:02

Go語言程序員文章

2021-03-01 18:35:18

Go語言虛擬機

2021-03-01 21:59:25

編程語言GoCX

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

腦累計算深度學習

2015-07-23 11:49:31

程序猿

2020-11-27 07:45:31

JVM垃圾回收

2010-03-26 13:15:28

Python嵌入c
點贊
收藏

51CTO技術棧公眾號

久久久亚洲综合网站| 久久久精品一区二区三区| 成人性免费视频| 欧美黄色小说| 国产做a爰片久久毛片 | www.视频在线.com| 国产一区二区三区黄视频 | 国产美女精品人人做人人爽 | 在线免费观看成人网| 精品毛片在线观看| 欧美亚洲自偷自偷| 久久亚洲精品网站| 伊人网伊人影院| 一区二区三区日本视频| 精品人伦一区二区三区蜜桃网站| 日韩中文字幕av在线| 国产成人久久精品77777综合 | 欧美最猛性xxxxx亚洲精品| 国产激情av在线| 国产精品欧美大片| 在线播放一区二区三区| 国产在线观看福利| 欧美黑人猛交| 综合久久国产九一剧情麻豆| 久久精品日产第一区二区三区乱码 | japanese在线观看| 日韩综合久久| 色国产精品一区在线观看| 免费网站在线观看视频| 米奇777四色精品人人爽| 91小视频在线免费看| 日韩精品免费观看视频| 国产欧美精品日韩区二区麻豆天美| 91黄色精品| 中文字幕在线网站| 香蕉精品999视频一区二区| 欧美精品在线播放| 精品亚洲乱码一区二区 | 亚洲激情视频网| 牛夜精品久久久久久久| 亚洲欧美se| 天天影视色香欲综合网老头| 久久久成人精品一区二区三区| 成年人视频在线观看免费| 99精品在线观看视频| 91九色蝌蚪成人| 国产片高清在线观看| 免费av成人在线| 日本一区二区不卡| 狠狠躁夜夜躁人人爽天天高潮| 午夜精品久久久久99热蜜桃导演 | 亚洲福利视频专区| 韩国三级在线看| 欧美高清hd| 日本啊v在线| 精品亚洲国产成人av制服丝袜| 欧美亚洲国产日韩2020| 日本在线小视频| 黄色综合网站| 午夜精品久久17c| 国产成人自拍视频在线| 99xxxx成人网| 欧美一区二区三区图| 欧美一级视频免费观看| 9色精品在线| 青青久久av北条麻妃黑人| 四虎成人永久免费视频| 欧美专区一区二区三区| 日本成人在线视频网址| 少妇一级淫片日本| 久久成人久久爱| 91在线精品播放| 亚洲xxxx天美| 99久久久无码国产精品| 欧美一区二区福利| 幼a在线观看| 亚洲天堂成人在线观看| 999一区二区三区| 美女露胸视频在线观看| 色婷婷精品久久二区二区蜜臀av | 青娱乐国产在线| 亚洲国产精品第一区二区| 91国在线精品国内播放| 亚洲 日本 欧美 中文幕| 蜜臀久久99精品久久久画质超高清 | 亚洲欧美在线一区二区| 欧美巨胸大乳hitomi| 国产精品成人一区二区不卡| 久久99久久久久久久噜噜| 好吊操这里只有精品| 日韩va欧美va亚洲va久久| 国产在线观看一区二区三区| 精品国产一区二区三区久久久久久| 国产肥老妇视频| 97精品久久久久中文字幕 | 第一会所sis001亚洲| 久久久999国产精品| 成年人免费看毛片| 青青草国产成人av片免费| 99国产在线| 狠狠v欧美ⅴ日韩v亚洲v大胸| 国产精品入口麻豆九色| 欧美性猛交内射兽交老熟妇| 在线成人av观看| 91精品国产综合久久国产大片| 国产草草浮力影院| 久久久久久久久久久久久久久久久久 | 青青草97国产精品免费观看无弹窗版| 147欧美人体大胆444| 免费av在线电影| 一区二区三区小说| 亚洲性生活网站| 国产乱人伦精品一区| www.久久色.com| 少妇高潮av久久久久久| 国产精品夜夜爽| 亚洲视频精品一区| 校园春色亚洲| 欧美大片在线观看| 四虎国产成人精品免费一女五男| 精品成人国产| 亚洲www在线观看| 国产午夜精品一区理论片| 亚洲亚洲精品在线观看| jizzzz日本| 国产综合久久久| 欧美激情videos| 国产美女www爽爽爽视频| 久久久精品欧美丰满| 国产精品无码人妻一区二区在线| 在线播放成人| 在线精品国产成人综合| 欧美一区二区三区网站| 不卡的av在线| 被灌满精子的波多野结衣| 国产日韩中文在线中文字幕| 色诱女教师一区二区三区| 福利网址在线观看| 久久综合九色综合97婷婷| 国产 日韩 欧美在线| eeuss国产一区二区三区四区| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 国产91富婆露脸刺激对白| 国产精品二区在线| 呦呦在线视频| 日韩午夜精品电影| 国产探花在线播放| 国产乱码精品1区2区3区| 制服诱惑一区| 97久久中文字幕| 精品国产视频在线| av观看在线免费| 亚洲精品一二三区| 91人妻一区二区三区| 午夜久久久久| 成人综合电影| 欧美男男tv网站在线播放| 亚洲国产精品一区二区久| 日本一级黄色大片| 91视频免费看| 激情五月婷婷久久| 手机在线电影一区| 91老司机精品视频| 肉肉视频在线观看| 精品国产免费一区二区三区四区 | 欧美1区免费| 99re国产视频| 精品极品在线| 在线观看成人黄色| 亚洲一区 中文字幕| 亚洲天堂精品视频| 色悠悠在线视频| 免费日韩精品中文字幕视频在线| 日本午夜精品一区二区三区| 欧美成人福利| 久99久在线视频| 亚洲 美腿 欧美 偷拍| 日本道免费精品一区二区三区| 东方伊人免费在线观看| 国产在线精品视频| 99久久久精品视频| 九色成人国产蝌蚪91| 国产精品一区二区久久国产| √天堂8在线网| 日韩av影视在线| 亚洲一二区视频| 亚洲一二三区在线观看| 中文字幕被公侵犯的漂亮人妻| 蜜桃在线一区二区三区| 欧美黑人在线观看| 免费黄色成人| 99www免费人成精品| 高清不卡av| 久久精品福利视频| 色噜噜一区二区三区| 欧美三日本三级三级在线播放| 亚洲精品自拍视频在线观看| 成人午夜视频在线观看| 欧美男女交配视频| 亚洲无线视频| 亚洲精蜜桃久在线| 国产精品久久久网站| 国产精品欧美在线| av伦理在线| 日韩视频一区在线| 精品av中文字幕在线毛片| 日韩一级免费观看| 欧美日韩 一区二区三区| 亚洲最快最全在线视频| 国产三级短视频| 成人小视频免费在线观看| 不卡的在线视频| 亚洲一区二区三区高清不卡| eeuss中文| 欧美日韩激情在线一区二区三区| 高清不卡日本v二区在线| www欧美在线| 国产精品一区2区3区| 2022国产精品| 精品久久毛片| 国产91九色视频| 成人av影院在线观看| 搡老女人一区二区三区视频tv | 亚洲欧美日韩久久久久久| www国产在线| 在线电影国产精品| 中文字幕人妻色偷偷久久| 欧美午夜精品久久久久久浪潮| 欧美三级 欧美一级| 中文幕一区二区三区久久蜜桃| 草草地址线路①屁屁影院成人| 国产精品 日产精品 欧美精品| 国产又大又黄又猛| 久久久夜精品| www.爱色av.com| 亚洲精品麻豆| 欧美一级视频在线播放| 综合激情网站| 亚洲五码在线观看视频| 91亚洲成人| 一区二区视频在线播放| 日韩欧美综合| 五月天综合网| 色一区二区三区四区| 日本黑人久久| 精品理论电影在线| 视频一区二区三区免费观看| 国产精品一线天粉嫩av| 欧日韩一区二区三区| 国产探花一区| 亚洲成人第一| 久久理论电影| 福利网在线观看| 欧美1区2区视频| 国产爆乳无码一区二区麻豆| 欧美精品一区二区三区久久久竹菊| 性欧美18一19内谢| 亚洲欧美综合| 人妻夜夜添夜夜无码av| 制服下的诱惑暮生| 久久国产精品99国产| 欧美成人免费高清视频| 日韩激情av在线| 免费看涩涩视频| 国内精品在线播放| 久久久久无码国产精品一区李宗瑞| 国产成人自拍高清视频在线免费播放 | sm在线观看| 97在线看免费观看视频在线观看| 高清精品在线| 国产97在线亚洲| 久久电影天堂| www.久久爱.cn| 亚洲欧洲免费| 天天人人精品| 在线成人直播| 极品粉嫩国产18尤物| 美女久久网站| 激情黄色小视频| 成人毛片老司机大片| 右手影院亚洲欧美| 国产精品不卡一区| 久久成人国产精品入口| 欧美三级免费观看| 在线观看亚洲一区二区| 日韩欧美你懂的| 欧美xxx.com| 久久精视频免费在线久久完整在线看| 男女免费观看在线爽爽爽视频| 欧美一区二区三区免费观看 | 久久电影一区| 永久免费黄色片| 久久综合色8888| 国产精品99久久久久久成人| 亚洲成人综合视频| 中国女人真人一级毛片| 日韩欧美激情一区| 国产一区电影| 久久久久久久久久久久av| 都市激情亚洲综合| 动漫一区二区在线| 欧美国产偷国产精品三区| 高清欧美精品xxxxx| 麻豆中文一区二区| 风间由美一二三区av片| 亚洲欧美色综合| 亚洲视频 欧美视频| 日韩一区二区三区观看| 国产视频二区在线观看| 欧美极品第一页| 成人网av.com/| 欧美激情一区二区三区在线视频| 一出一进一爽一粗一大视频| www久久久久| 久久精品www| 欧美日本国产视频| 久草在线网址| 午夜精品久久久久久久99热| 高清精品久久| 视频一区视频二区视频| 午夜亚洲性色视频| 催眠调教后宫乱淫校园| 亚洲精品v日韩精品| 国产精品久久久久久久一区二区| 亚洲色无码播放| 日韩电影毛片| 国产日韩精品久久| 午夜日韩激情| 欧美专区第二页| 自拍偷自拍亚洲精品播放| 亚洲大片免费观看| 亚洲精品少妇网址| av在线视屏| 国产精品18毛片一区二区| 亚洲国产成人精品女人| xxww在线观看| 亚洲国产精品二十页| 中文字幕在线观看视频免费| 亚洲精品自拍偷拍| 欧美人xxx| 成人中心免费视频| 亚洲va在线| 天天操狠狠操夜夜操| 综合婷婷亚洲小说| 国产精品毛片久久久久久久av| www.日韩不卡电影av| 99欧美精品| 伊人久久大香线蕉午夜av| 老司机一区二区| 四虎884aa成人精品| 欧美精品高清视频| 成人短视频在线观看| 亚洲精品免费一区二区三区| 亚洲美女视频| 韩国三级在线看| 午夜欧美大尺度福利影院在线看| 亚洲精品国产手机| 午夜精品一区二区三区在线 | 精品盗摄一区二区三区| 自拍偷拍激情视频| 久久久蜜桃一区二区人| 国产偷人妻精品一区| 一本大道av一区二区在线播放| 看电影就来5566av视频在线播放| 国产成人精品久久二区二区| 第一sis亚洲原创| 毛片毛片毛片毛片毛| 亚洲最新视频在线播放| 亚洲aaaaaaa| 国产精品久久久久国产a级| 欧美hentaied在线观看| 国产精品熟女一区二区不卡| 亚洲电影激情视频网站| 男人的天堂av高清在线| 国产精品一区二区三| 欧美在线不卡| 亚洲色图14p| 欧美理论片在线| 日本伦理一区二区| 欧美日韩电影一区二区| 麻豆成人久久精品二区三区红| 乱h高h女3p含苞待放| 日韩av资源在线播放| 99久久综合国产精品二区| 国产肉体ⅹxxx137大胆| 久久久综合网站| av中文在线观看| 国产91成人video| 五月天综合网站| av在线播放网址| 欧美日本一区二区三区四区| 香蕉久久aⅴ一区二区三区| 欧美精品尤物在线| 国产一区二区三区av电影 | 九九99久久| 捆绑紧缚一区二区三区视频| 国产无遮挡又黄又爽| 中国人与牲禽动交精品| 国产成人精品福利| 91极品视频在线观看|