很多朋友可能知道Go語(yǔ)言的優(yōu)勢(shì)在哪,卻不知道Go語(yǔ)言適合用于哪些地方。
創(chuàng)新互聯(lián)公司專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、烏蘭網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為烏蘭等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
1、 Go語(yǔ)言作為服務(wù)器編程語(yǔ)言,很適合處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)、分布式系統(tǒng)、數(shù)據(jù)庫(kù)代理等;網(wǎng)絡(luò)編程方面。Go語(yǔ)言廣泛應(yīng)用于Web應(yīng)用、API應(yīng)用、下載應(yīng)用等;除此之外,Go語(yǔ)言還可用于內(nèi)存數(shù)據(jù)庫(kù)和云平臺(tái)領(lǐng)域,目前國(guó)外很多云平臺(tái)都是采用Go開發(fā)。
2、 其實(shí)Go語(yǔ)言主要用作服務(wù)器端開發(fā)。其定位是用來(lái)開發(fā)"大型軟件"的,適合于很多程序員一起開發(fā)大型軟件,并且開發(fā)周期長(zhǎng),支持云計(jì)算的網(wǎng)絡(luò)服務(wù)。Go語(yǔ)言能夠讓程序員快速開發(fā),并且在軟件不斷的增長(zhǎng)過(guò)程中,它能讓程序員更容易地進(jìn)行維護(hù)和修改。它融合了傳統(tǒng)編譯型語(yǔ)言的高效性和腳本語(yǔ)言的易用性和富于表達(dá)性。
3、 Go語(yǔ)言成功案例。Nsq:Nsq是由Go語(yǔ)言開發(fā)的高性能、高可用消息隊(duì)列系統(tǒng),性能非常高,每天能處理數(shù)十億條的消息;
4、 Docker:基于lxc的一個(gè)虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺(tái)的組建。
5、 Packer:用來(lái)生成不同平臺(tái)的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
6、 Skynet:分布式調(diào)度框架。
7、 Doozer:分布式同步工具,類似ZooKeeper。
8、 Heka:mazila開源的日志處理系統(tǒng)。
9、 Cbfs:couchbase開源的分布式文件系統(tǒng)。
10、 Tsuru:開源的PAAS平臺(tái),和SAE實(shí)現(xiàn)的功能一模一樣。
11、 Groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)。
12、 God:類似redis的緩存系統(tǒng),但是支持分布式和擴(kuò)展性。
13、 Gor:網(wǎng)絡(luò)流量抓包和重放工具。
以上的就是關(guān)于go語(yǔ)言能做什么的內(nèi)容介紹了。
對(duì)于Go語(yǔ)言的日志來(lái)說(shuō),如何將log寫到指定的文件里面,下面是一個(gè)例子。
output:
output:
云和安全管理服務(wù)專家新鈦云服 張春翻譯
這種方法有幾個(gè)缺點(diǎn)。首先,它可以對(duì)程序員隱藏錯(cuò)誤處理路徑,特別是在捕獲異常不是強(qiáng)制性的情況下,例如在 Python 中。即使在具有必須處理的 Java 風(fēng)格的檢查異常的語(yǔ)言中,如果在與原始調(diào)用不同的級(jí)別上處理錯(cuò)誤,也并不總是很明顯錯(cuò)誤是從哪里引發(fā)的。
我們都見過(guò)長(zhǎng)長(zhǎng)的代碼塊包裝在一個(gè) try-catch 塊中。在這種情況下,catch 塊實(shí)際上充當(dāng) goto 語(yǔ)句,這通常被認(rèn)為是有害的(奇怪的是,C 中的關(guān)鍵字被認(rèn)為可以接受的少數(shù)用例之一是錯(cuò)誤后清理,因?yàn)樵撜Z(yǔ)言沒有 Golang- 樣式延遲語(yǔ)句)。
如果你確實(shí)從源頭捕獲異常,你會(huì)得到一個(gè)不太優(yōu)雅的 Go 錯(cuò)誤模式版本。這可能會(huì)解決混淆代碼的問(wèn)題,但會(huì)遇到另一個(gè)問(wèn)題:性能。在諸如 Java 之類的語(yǔ)言中,拋出異??赡鼙群瘮?shù)的常規(guī)返回慢數(shù)百倍。
Java 中最大的性能成本是由打印異常的堆棧跟蹤造成的,這是昂貴的,因?yàn)檫\(yùn)行的程序必須檢查編譯它的源代碼 。僅僅進(jìn)入一個(gè) try 塊也不是空閑的,因?yàn)樾枰4?CPU 內(nèi)存寄存器的先前狀態(tài),因?yàn)樗鼈兛赡苄枰趻伋霎惓5那闆r下恢復(fù)。
如果您將異常視為通常不會(huì)發(fā)生的異常情況,那么異常的缺點(diǎn)并不重要。這可能是傳統(tǒng)的單體應(yīng)用程序的情況,其中大部分代碼庫(kù)不必進(jìn)行網(wǎng)絡(luò)調(diào)用——一個(gè)操作格式良好的數(shù)據(jù)的函數(shù)不太可能遇到錯(cuò)誤(除了錯(cuò)誤的情況)。一旦您在代碼中添加 I/O,無(wú)錯(cuò)誤代碼的夢(mèng)想就會(huì)破滅:您可以忽略錯(cuò)誤,但不能假裝它們不存在!
try {
doSometing()
} catch (IOException e) {
// ignore it
}
與大多數(shù)其他編程語(yǔ)言不同,Golang 接受錯(cuò)誤是不可避免的。 如果在單體架構(gòu)時(shí)代還不是這樣,那么在今天的模塊化后端服務(wù)中,服務(wù)通常和外部 API 調(diào)用、數(shù)據(jù)庫(kù)讀取和寫入以及與其他服務(wù)通信 。
以上所有方法都可能失敗,解析或驗(yàn)證從它們接收到的數(shù)據(jù)(通常在無(wú)模式 JSON 中)也可能失敗。Golang 使可以從這些調(diào)用返回的錯(cuò)誤顯式化,與普通返回值的等級(jí)相同。從函數(shù)調(diào)用返回多個(gè)值的能力支持這一點(diǎn),這在大多數(shù)語(yǔ)言中通常是不可能的。Golang 的錯(cuò)誤處理系統(tǒng)不僅僅是一種語(yǔ)言怪癖,它是一種將錯(cuò)誤視為替代返回值的完全不同的方式!
重復(fù) if err != nil
對(duì) Go 錯(cuò)誤處理的一個(gè)常見批評(píng)是被迫重復(fù)以下代碼塊:
res, err := doSomething()
if err != nil {
// Handle error
}
對(duì)于新用戶來(lái)說(shuō),這可能會(huì)覺得沒用而且浪費(fèi)行數(shù):在其他語(yǔ)言中需要 3 行的函數(shù)很可能會(huì)增長(zhǎng)到 12 行 :
這么多行代碼!這么低效!如果您認(rèn)為上述內(nèi)容不優(yōu)雅或浪費(fèi)代碼,您可能忽略了我們檢查代碼中的錯(cuò)誤的全部原因:我們需要能夠以不同的方式處理它們!對(duì) API 或數(shù)據(jù)庫(kù)的調(diào)用可能會(huì)被重試。
有時(shí)事件的順序很重要:調(diào)用外部 API 之前發(fā)生的錯(cuò)誤可能不是什么大問(wèn)題(因?yàn)閿?shù)據(jù)從未通過(guò)發(fā)送),而 API 調(diào)用和寫入本地?cái)?shù)據(jù)庫(kù)之間的錯(cuò)誤可能需要立即注意,因?yàn)?這可能意味著系統(tǒng)最終處于不一致的狀態(tài)。即使我們只想將錯(cuò)誤傳播給調(diào)用者,我們也可能希望用失敗的解釋來(lái)包裝它們,或者為每個(gè)錯(cuò)誤返回一個(gè)自定義錯(cuò)誤類型。
并非所有錯(cuò)誤都是相同的,并且向調(diào)用者返回適當(dāng)?shù)腻e(cuò)誤是 API 設(shè)計(jì)的重要部分,無(wú)論是對(duì)于內(nèi)部包還是 REST API 。
不必?fù)?dān)心在你的代碼中重復(fù) if err != nil ——這就是 Go 中的代碼應(yīng)該看起來(lái)的樣子。
自定義錯(cuò)誤類型和錯(cuò)誤包裝
從導(dǎo)出的方法返回錯(cuò)誤時(shí),請(qǐng)考慮指定自定義錯(cuò)誤類型,而不是單獨(dú)使用錯(cuò)誤字符串。字符串在意外代碼中是可以的,但在導(dǎo)出的函數(shù)中,它們成為函數(shù)公共 API 的一部分。更改錯(cuò)誤字符串將是一項(xiàng)重大更改——如果沒有明確的錯(cuò)誤類型,需要檢查返回錯(cuò)誤類型的單元測(cè)試將不得不依賴原始字符串值!事實(shí)上,基于字符串的錯(cuò)誤也使得在私有方法中測(cè)試不同的錯(cuò)誤案例變得困難,因此您也應(yīng)該考慮在包中使用它們?;氐藉e(cuò)誤與異常的爭(zhēng)論,返回錯(cuò)誤也使代碼比拋出異常更容易測(cè)試,因?yàn)殄e(cuò)誤只是要檢查的返回值。不需要測(cè)試框架或在測(cè)試中捕獲異常 。
可以在 database/sql 包中找到簡(jiǎn)單自定義錯(cuò)誤類型的一個(gè)很好的示例。它定義了一個(gè)導(dǎo)出常量列表,表示包可以返回的錯(cuò)誤類型,最著名的是 sql.ErrNoRows。雖然從 API 設(shè)計(jì)的角度來(lái)看,這種特定的錯(cuò)誤類型有點(diǎn)問(wèn)題(您可能會(huì)爭(zhēng)辯說(shuō) API 應(yīng)該返回一個(gè)空結(jié)構(gòu)而不是錯(cuò)誤),但任何需要檢查空行的應(yīng)用程序都可以導(dǎo)入該常量并在代碼中使用它不必?fù)?dān)心錯(cuò)誤消息本身會(huì)改變和破壞代碼。
對(duì)于更復(fù)雜的錯(cuò)誤處理,您可以通過(guò)實(shí)現(xiàn)返回錯(cuò)誤字符串的 Error() 方法來(lái)定義自定義錯(cuò)誤類型。自定義錯(cuò)誤可以包括元數(shù)據(jù),例如錯(cuò)誤代碼或原始請(qǐng)求參數(shù)。如果您想表示錯(cuò)誤類別,它們很有用。DigitalOcean 的本教程展示了如何使用自定義錯(cuò)誤類型來(lái)表示可以重試的一類臨時(shí)錯(cuò)誤。
通常,錯(cuò)誤會(huì)通過(guò)將低級(jí)錯(cuò)誤與更高級(jí)別的解釋包裝起來(lái),從而在程序的調(diào)用堆棧中傳播。例如,數(shù)據(jù)庫(kù)錯(cuò)誤可能會(huì)以下列格式記錄在 API 調(diào)用處理程序中:調(diào)用 CreateUser 端點(diǎn)時(shí)出錯(cuò):查詢數(shù)據(jù)庫(kù)時(shí)出錯(cuò):pq:檢測(cè)到死鎖。這很有用,因?yàn)樗梢詭椭覀兏欏e(cuò)誤在系統(tǒng)中傳播的過(guò)程,向我們展示根本原因(數(shù)據(jù)庫(kù)事務(wù)引擎中的死鎖)以及它對(duì)更廣泛系統(tǒng)的影響(調(diào)用者無(wú)法創(chuàng)建新用戶)。
自 Go 1.13 以來(lái),此模式具有特殊的語(yǔ)言支持,并帶有錯(cuò)誤包裝。通過(guò)在創(chuàng)建字符串錯(cuò)誤時(shí)使用 %w 動(dòng)詞,可以使用 Unwrap() 方法訪問(wèn)底層錯(cuò)誤。除了比較錯(cuò)誤相等性的函數(shù) errors.Is() 和 errors.As() 外,程序還可以獲取包裝錯(cuò)誤的原始類型或標(biāo)識(shí)。這在某些情況下可能很有用,盡管我認(rèn)為在確定如何處理所述錯(cuò)誤時(shí)最好使用頂級(jí)錯(cuò)誤的類型。
Panics
不要 panic()!長(zhǎng)時(shí)間運(yùn)行的應(yīng)用程序應(yīng)該優(yōu)雅地處理錯(cuò)誤而不是panic。即使在無(wú)法恢復(fù)的情況下(例如在啟動(dòng)時(shí)驗(yàn)證配置),最好記錄一個(gè)錯(cuò)誤并優(yōu)雅地退出。panic比錯(cuò)誤消息更難診斷,并且可能會(huì)跳過(guò)被推遲的重要關(guān)閉代碼。
Logging
我還想簡(jiǎn)要介紹一下日志記錄,因?yàn)樗翘幚礤e(cuò)誤的關(guān)鍵部分。通常你能做的最好的事情就是記錄收到的錯(cuò)誤并繼續(xù)下一個(gè)請(qǐng)求。
除非您正在構(gòu)建簡(jiǎn)單的命令行工具或個(gè)人項(xiàng)目,否則您的應(yīng)用程序應(yīng)該使用結(jié)構(gòu)化的日志庫(kù),該庫(kù)可以為日志添加時(shí)間戳,并提供對(duì)日志級(jí)別的控制。最后一部分特別重要,因?yàn)樗鼘⒃试S您突出顯示應(yīng)用程序記錄的所有錯(cuò)誤和警告。通過(guò)幫助將它們與信息級(jí)日志分開,這將為您節(jié)省無(wú)數(shù)時(shí)間。
微服務(wù)架構(gòu)還應(yīng)該在日志行中包含服務(wù)的名稱以及機(jī)器實(shí)例的名稱。默認(rèn)情況下記錄這些時(shí),程序代碼不必?fù)?dān)心包含它們。您也可以在日志的結(jié)構(gòu)化部分中記錄其他字段,例如收到的錯(cuò)誤(如果您不想將其嵌入日志消息本身)或有問(wèn)題的請(qǐng)求或響應(yīng)。只需確保您的日志沒有泄露任何敏感數(shù)據(jù),例如密碼、API 密鑰或用戶的個(gè)人數(shù)據(jù)!
對(duì)于日志庫(kù),我過(guò)去使用過(guò) logrus 和 zerolog,但您也可以選擇其他結(jié)構(gòu)化日志庫(kù)。如果您想了解更多信息,互聯(lián)網(wǎng)上有許多關(guān)于如何使用這些的指南。如果您將應(yīng)用程序部署到云中,您可能需要日志庫(kù)上的適配器來(lái)根據(jù)您的云平臺(tái)的日志 API 格式化日志 - 沒有它,云平臺(tái)可能無(wú)法檢測(cè)到日志級(jí)別等某些功能。
如果您在應(yīng)用程序中使用調(diào)試級(jí)別日志(默認(rèn)情況下通常不記錄),請(qǐng)確保您的應(yīng)用程序可以輕松更改日志級(jí)別,而無(wú)需更改代碼。更改日志級(jí)別還可以暫時(shí)使信息級(jí)別甚至警告級(jí)別的日志靜音,以防它們突然變得過(guò)于嘈雜并開始淹沒錯(cuò)誤。您可以使用在啟動(dòng)時(shí)檢查以設(shè)置日志級(jí)別的環(huán)境變量來(lái)實(shí)現(xiàn)這一點(diǎn)。
原文:
本文介紹一些Go語(yǔ)言的基礎(chǔ)語(yǔ)法。
先來(lái)看一個(gè)簡(jiǎn)單的go語(yǔ)言代碼:
go語(yǔ)言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來(lái)進(jìn)一步介紹go的基礎(chǔ)語(yǔ)法。
go語(yǔ)言中格式化輸出可以使用 fmt 和 log 這兩個(gè)標(biāo)準(zhǔn)庫(kù),
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問(wèn)中的fmt包。
log包實(shí)現(xiàn)了簡(jiǎn)單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來(lái)介紹一下go的數(shù)據(jù)類型
下表列出了go語(yǔ)言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲(chǔ)的是一個(gè)地址,這個(gè)地址存儲(chǔ)最終的值。
常量是在程序編譯時(shí)就確定下來(lái)的值,程序運(yùn)行時(shí)無(wú)法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語(yǔ)言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。
算術(shù)運(yùn)算符:
關(guān)系運(yùn)算符:
邏輯運(yùn)算符:
位運(yùn)算符:
賦值運(yùn)算符:
指針相關(guān)運(yùn)算符:
下面介紹一下go語(yǔ)言中的if語(yǔ)句和switch語(yǔ)句。另外還有一種控制語(yǔ)句叫select語(yǔ)句,通常與通道聯(lián)用,這里不做介紹。
if語(yǔ)法格式如下:
if ... else :
else if:
示例代碼:
語(yǔ)法格式:
另外,添加 fallthrough 會(huì)強(qiáng)制執(zhí)行后面的 case 語(yǔ)句,不管下一條case語(yǔ)句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語(yǔ)句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過(guò)標(biāo)記退出循環(huán):
--THE END--
1、服務(wù)器編程:以前你如果使用C或者C++做的那些事情,用Go來(lái)做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)等。
2、分布式系統(tǒng)、數(shù)據(jù)庫(kù)代理器、中間件:例如Etcd。
3、網(wǎng)絡(luò)編程:這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實(shí)現(xiàn)了。
4、開發(fā)云平臺(tái):目前國(guó)外很多云平臺(tái)在采用Go開發(fā),我們所熟知的七牛云、華為云等等都有使用Go進(jìn)行開發(fā)并且開源的成型的產(chǎn)品。
5、區(qū)塊鏈:目前有一種說(shuō)法,技術(shù)從業(yè)人員把Go語(yǔ)言稱作為區(qū)塊鏈行業(yè)的開發(fā)語(yǔ)言。如果大家學(xué)習(xí)區(qū)塊鏈技術(shù)的話,就會(huì)發(fā)現(xiàn)現(xiàn)在有很多很多的區(qū)塊鏈的系統(tǒng)和應(yīng)用都是采用Go進(jìn)行開發(fā)的,比如ehtereum是目前知名度最大的公鏈,再比如fabric是目前最知名的聯(lián)盟鏈,兩者都有g(shù)o語(yǔ)言的版本,且go-ehtereum還是以太坊官方推薦的版本。
自1.0版發(fā)布以來(lái),go語(yǔ)言引起了眾多開發(fā)者的關(guān)注,并得到了廣泛的應(yīng)用。go語(yǔ)言簡(jiǎn)單、高效、并發(fā)的特點(diǎn)吸引了許多傳統(tǒng)的語(yǔ)言開發(fā)人員,其數(shù)量也在不斷增加。
使用 Go 語(yǔ)言開發(fā)的開源項(xiàng)目非常多。早期的 Go 語(yǔ)言開源項(xiàng)目只是通過(guò) Go 語(yǔ)言與傳統(tǒng)項(xiàng)目進(jìn)行C語(yǔ)言庫(kù)綁定實(shí)現(xiàn),例如 Qt、Sqlite 等。
后期的很多項(xiàng)目都使用 Go 語(yǔ)言進(jìn)行重新原生實(shí)現(xiàn),這個(gè)過(guò)程相對(duì)于其他語(yǔ)言要簡(jiǎn)單一些,這也促成了大量使用 Go 語(yǔ)言原生開發(fā)項(xiàng)目的出現(xiàn)。
Go語(yǔ)言由Google公司開發(fā),并于2009年開源,相比Java/Python/C等語(yǔ)言,Go尤其擅長(zhǎng)并發(fā)編程,性能堪比C語(yǔ)言,開發(fā)效率肩比Python,被譽(yù)為“21世紀(jì)的C語(yǔ)言”。
Go語(yǔ)言在云計(jì)算、大數(shù)據(jù)、微服務(wù)、高并發(fā)領(lǐng)域應(yīng)用應(yīng)用非常廣泛。BAT大廠正在把Go作為新項(xiàng)目開發(fā)的首選語(yǔ)言。
Go語(yǔ)言應(yīng)用范圍:
1、服務(wù)端開發(fā):以前你使用C或者C++做的那些事情,用Go來(lái)做很合適,例如日志處理、文件系統(tǒng)、監(jiān)控系統(tǒng)等;
2、DevOps:運(yùn)維生態(tài)中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語(yǔ)言開發(fā);
3、網(wǎng)絡(luò)編程:大量?jī)?yōu)秀的Web框架如Echo、Gin、Iris、beego等,而且Go內(nèi)置的 net/http包十分的優(yōu)秀;
4、Paas云平臺(tái)領(lǐng)域:Kubernetes和Docker Swarm等;
5、分布式存儲(chǔ)領(lǐng)域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、區(qū)塊鏈領(lǐng)域:區(qū)塊鏈里面有兩個(gè)明星項(xiàng)目以太坊和fabric都使用Go語(yǔ)言;
7、容器虛擬化:大名鼎鼎的Docker就是使用Go語(yǔ)言實(shí)現(xiàn)的;
8、爬蟲及大數(shù)據(jù):Go語(yǔ)言天生支持并發(fā),所以十分適合編寫分布式爬蟲及大數(shù)據(jù)處理。
文章標(biāo)題:go語(yǔ)言日志庫(kù),golang 日志庫(kù)
文章鏈接:http://jinyejixie.com/article42/hsisec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、做網(wǎng)站、網(wǎng)站內(nèi)鏈、微信小程序、域名注冊(cè)、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)