真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Go語言重構(gòu) go重構(gòu)php項(xiàng)目

為什么許多原本的 Java 項(xiàng)目都試圖用 go 進(jìn)行重寫開源?

項(xiàng)目推倒重構(gòu)是項(xiàng)目開發(fā)大忌,一方面我們要盡量避免做項(xiàng)目推倒重構(gòu),盡量在前期就規(guī)劃好,另一方面,我們又希望項(xiàng)目能常做小重構(gòu),這對項(xiàng)目可持續(xù)性開發(fā)是很有幫助的。而語言的重構(gòu),把Java項(xiàng)目用Go語言重寫一遍,無疑是一次重大的推倒重來。

創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),稷山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:稷山等地區(qū)。稷山做網(wǎng)站價(jià)格咨詢:13518219792

一、Go語言的優(yōu)勢在哪里

Go語言領(lǐng)先于Java的最大優(yōu)勢,就在于快。Go語言會被編譯成機(jī)器代碼,直接執(zhí)行;Java語言則使用JVM運(yùn)行其代碼,這比Go語言要慢了很多。另外,Java語言的內(nèi)存管理,相比于Go語言,也復(fù)雜得多,而內(nèi)存管理,不管對于程序運(yùn)行,還是對程序員的開發(fā),都極為重要。最后,Go語言沒有引用只有指針,這比Java語言處處引用,又領(lǐng)先了一個(gè)身位。

二、Go語言為什么更適合開源

開源,也就是開放源代碼,最大的好處在于,可以利用全世界的程序員資源,來幫助你完善你的產(chǎn)品,開發(fā)新需求,或者修復(fù)產(chǎn)品BUG。這對產(chǎn)品的可持續(xù)發(fā)展,是非常有幫助的,很多企業(yè)紛紛將自己的產(chǎn)品開源,其實(shí)就是這個(gè)道理。而Go語言更易學(xué),更易避錯(cuò),更易閱讀等特點(diǎn),就決定了它更適合用來做開源項(xiàng)目。

三、Java語言的優(yōu)勢

Java語言是目前軟件開發(fā)中使用率最廣泛,也是最重要的程序之一,它的地位,絕對不是目前Go語言可以比擬的。Java在WEB應(yīng)用的開發(fā)中,有著很重要的地位。但是,Java語言相對復(fù)雜的并發(fā)設(shè)計(jì),相當(dāng)龐大的項(xiàng)目體系,使其在開發(fā)、測試階段都略為復(fù)雜,在某些方面已經(jīng)逐步落后于其他語言。

調(diào)試Go語言的核心轉(zhuǎn)儲(Core Dumps)

英文原文鏈接【Go, the unwritten parts】 發(fā)表于2017/05/22 作者JBD是Go語言開發(fā)小組成員

檢查程序的執(zhí)行路徑和當(dāng)前狀態(tài)是非常有用的調(diào)試手段。核心文件(core file)包含了一個(gè)運(yùn)行進(jìn)程的內(nèi)存轉(zhuǎn)儲和狀態(tài)。它主要是用來作為事后調(diào)試程序用的。它也可以被用來查看一個(gè)運(yùn)行中的程序的狀態(tài)。這兩個(gè)使用場景使調(diào)試文件轉(zhuǎn)儲成為一個(gè)非常好的診斷手段。我們可以用這個(gè)方法來做事后診斷和分析線上的服務(wù)(production services)。

在這篇文章中,我們將用一個(gè)簡單的hello world網(wǎng)站服務(wù)作為例子。在現(xiàn)實(shí)中,我們的程序很容易就會變得很復(fù)雜。分析核心轉(zhuǎn)儲給我們提供了一個(gè)機(jī)會去重構(gòu)程序的狀態(tài)并且查看只有在某些條件/環(huán)境下才能重現(xiàn)的案例。

作者注 : 這個(gè)調(diào)試流程只在Linux上可行。我不是很確定它是否在其它Unixs系統(tǒng)上工作。macOS對此還不支持。Windows現(xiàn)在也不支持。

在我們開始前,需要確保核心轉(zhuǎn)儲的ulimit設(shè)置在合適的范圍。它的缺省值是0,意味著最大的核心文件大小是0。我通常在我的開發(fā)機(jī)器上將它設(shè)置成unlimited。使用以下命令:

接下來,你需要在你的機(jī)器上安裝 delve 。

下面我們使用的 main.go 文件。它注冊了一個(gè)簡單的請求處理函數(shù)(handler)然后啟動了HTTP服務(wù)。

讓我們編譯并生產(chǎn)二進(jìn)制文件。

現(xiàn)在讓我們假設(shè),這個(gè)服務(wù)器出了些問題,但是我們并不是很確定問題的根源。你可能已經(jīng)在程序里加了很多輔助信息,但還是無法從這些調(diào)試信息中找出線索。通常在這種情況下,當(dāng)前進(jìn)程的快照會非常有用。我們可以用這個(gè)快照深入查看程序的當(dāng)前狀態(tài)。

有幾個(gè)方式來獲取核心文件。你可能已經(jīng)熟悉了奔潰轉(zhuǎn)儲(crash dumps)。它們是在一個(gè)程序奔潰的時(shí)候?qū)懭氪疟P的核心轉(zhuǎn)儲。Go語言在缺省設(shè)置下不會生產(chǎn)奔潰轉(zhuǎn)儲。但是當(dāng)你把 GOTRACEBACK 環(huán)境變量設(shè)置成“crash”,你就可以用 Ctrl+backslash 才觸發(fā)奔潰轉(zhuǎn)儲。如下圖所示:

上面的操作會使程序終止,將堆棧跟蹤(stack trace)打印出來,并把核心轉(zhuǎn)儲文件寫入磁盤。

另外個(gè)方法可以從一個(gè)運(yùn)行的程序獲得核心轉(zhuǎn)儲而不需要終止相應(yīng)的進(jìn)程。 gcore 可以生產(chǎn)核心文件而無需使運(yùn)行中的程序退出。

根據(jù)上面的操作,我們獲得了轉(zhuǎn)儲而沒有終止對應(yīng)的進(jìn)程。下一步就是把核心文件加載進(jìn)delve并開始分析。

差不多就這些。delve的常用操作都可以使用。你可以backtrace,list,查看變量等等。有些功能不可用因?yàn)槲覀兪褂玫暮诵霓D(zhuǎn)儲是一個(gè)快照而不是正在運(yùn)行的進(jìn)程。但是程序執(zhí)行路徑和狀態(tài)全部可以訪問。

講講go語言的結(jié)構(gòu)體

作為C語言家族的一員,go和c一樣也支持結(jié)構(gòu)體??梢灶惐扔趈ava的一個(gè)POJO。

在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個(gè)新類型。

新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。

這里要引入一個(gè)底層類型的概念。

如果一個(gè)新類型是基于某個(gè) Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型

在上面的例子中,int就是T1的底層類型。

但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int

底層類型是很重要的,因?yàn)閷蓚€(gè)變量進(jìn)行顯式的類型轉(zhuǎn)換,只有底層類型相同的變量間才能相互轉(zhuǎn)換。底層類型是判斷兩個(gè)類型本質(zhì)上是否相同的根本。

這種類型定義方式通常用在 項(xiàng)目的漸進(jìn)式重構(gòu),還有對已有包的二次封裝方面

類型別名表示新類型和原類型完全等價(jià),實(shí)際上就是同一種類型。只不過名字不同而已。

一般我們都是定義一個(gè)有名的結(jié)構(gòu)體。

字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。

還有一個(gè)點(diǎn)提一下

如果換行來寫

Age: 66,后面這個(gè)都好不能省略

還有一個(gè)點(diǎn),觀察e3的賦值

new返回的是一個(gè)指針。然后指針可以直接點(diǎn)號賦值。這說明go默認(rèn)進(jìn)行了取值操作

e3.Age 等價(jià)于 (*e3).Age

如上定義了一個(gè)空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。

有什么用呢?

基于空結(jié)構(gòu)體類型內(nèi)存零開銷這樣的特性,我們在日常 Go 開發(fā)中會經(jīng)常使用空 結(jié)構(gòu)體類型元素,作為一種“事件”信息進(jìn)行 Goroutine 之間的通信

這種以空結(jié)構(gòu)體為元素類建立的 channel,是目前能實(shí)現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。

這種形式需要說的是幾個(gè)語法糖。

語法糖1:

對于結(jié)構(gòu)體字段,可以省略字段名,只寫結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名

這種方式稱為 嵌入字段

語法糖2:

如果是以嵌入字段形式寫的結(jié)構(gòu)體

可以省略嵌入的Reader字段,而直接訪問ReaderName

此時(shí)book是一個(gè)各個(gè)屬性全是對應(yīng)類型零值的一個(gè)實(shí)例。不是nil。這種情況在Go中稱為零值可用。不像java會導(dǎo)致npe

結(jié)構(gòu)體定義時(shí)可以在字段后面追加標(biāo)簽說明。

tag的格式為反單引號

tag的作用是可以使用[反射]來檢視字段的標(biāo)簽信息。

具體的作用還要看使用的場景。

比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對象時(shí)可以利用的規(guī)則。比如omitempty表示該字段沒有值就不打印出來。


分享名稱:Go語言重構(gòu) go重構(gòu)php項(xiàng)目
轉(zhuǎn)載源于:http://weahome.cn/article/ddoshph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部