越是接觸的編程語言多了堕绩,越是做的項(xiàng)目多了,就越是覺得Go語言的簡單是多么一件不簡單的事——在一個慣有思維的世界中肺缕,舍棄了這么舊世界的東西左医,是非常不簡單的。
是的同木,我的觀點(diǎn)就是浮梢,加法大家都會做,但對一件事情做減法泉手、提煉精華黔寇,卻是相當(dāng)?shù)牟蝗菀椎摹?/p>
簡在哪里偶器?
沒有類
Go語言中沒有類(class)斩萌。
接觸過Lua或JavaScript的都知道,Lua和JavaScript沒有class關(guān)鍵字屏轰,要實(shí)現(xiàn)對象功能颊郎,是通過“原型”來實(shí)現(xiàn)的(prototype)。
type BaseObject struct { // 基類
field1 int
}
type TestObject struct { // 繼承自BaseObject
BaseObject
field2 int
}
沒有try, catch
Go語言沒有try和catch關(guān)鍵字霎苗?姆吭!
我想用慣了try和catch捕獲錯誤的工程師們肯定會非常驚訝。但我也是那種比較痛恨try-catch的人唁盏,它們的出現(xiàn)經(jīng)常讓錯誤難以偵察内狸。
// C#
try
{
Do1()
Do2()
Do3()
}
catch (Exception e)
{
Log(e.Message)
}
不開玩笑的說检眯,類似的try-catch大包圍非常的常見,到出錯了的時候昆淡,究竟是Do1還是Do2還是Do3的問題懊倘场? 不知道昂灵,好吧只能斷點(diǎn)了避凝。
以往在C#開發(fā)中,我更喜歡以類似的方式
// C#
IsNotNull(Do1, "Error! Do1 is null")
IsTrue(Do2, "Error! Do2 is false")
為錯誤做文字描述眨补,看起來啰嗦管削,但當(dāng)成千上萬的代碼堆積如山時,這樣做的好處卻是非常明顯的撑螺,瞄一眼就能定位到錯誤的地方含思。
Go語言中沒有try-catch,錯誤的捕捉其實(shí)就是類似這樣的方式:
// Go lang
do1Result, err := Do1()
if err != nil {
fmt.Errorf("Do 1 is wrong!")
}
是的甘晤,適當(dāng)?shù)淖址枋鍪菃氯准螅珔s相當(dāng)于為做買好了保險。
沒有構(gòu)建工具
要建個C語言工程是吧安皱?最起碼裝個Turbo C调鬓、Visual Studio C++吧; 要建個Java工程吧酌伊?JVM腾窝、IDE一套東西要弄吧...
編程的世界里,構(gòu)建工具非常的多:make居砖、autoconf虹脯、cmake、Ant奏候、Maven循集、Gradle等等等;
在Go語言中蔗草,“go build”命令间聊,就是你的構(gòu)建工具;“go test”命令就是你的單元測試工具弊攘;開發(fā)握爷、編譯、測試模叙,它全部都幫你做好了歇拆。
強(qiáng)制代碼格式化
我是一個經(jīng)常會為單詞、空格、命名故觅、排版斟酌半天的人厂庇,Go語言的強(qiáng)制格式化十分對我的胃口——所有的空格、字符對齊输吏、花括號({})的位置都是在保存的一瞬間自動強(qiáng)制排版的宋列。
統(tǒng)一排版的代碼,會給大家一種非常舒服的感覺评也。美中不足的是沒有強(qiáng)制添加注釋功能炼杖,要不然就又少一個分歧點(diǎn)了......
比如我手賤,輸入:
const(
ConstA
ConstB
)
經(jīng)過go fmt進(jìn)行格式化盗迟,它就會變成
const (
ConstA
ConstB
)
嗯坤邪,強(qiáng)迫癥患者的最佳療法。
另外一提:
// Go lang
func Func()
{ // Compie error!
}
在C#中罚缕,花括號{是習(xí)慣另起一行的艇纺,而在Go于中,卻會導(dǎo)致編譯錯誤邮弹。
簡得不徹底的地方
Go語言的簡黔衡,是相對于有編程基礎(chǔ)的人來說的。這里提及一下我認(rèn)為他不夠簡的地方腌乡,更多是從小白盟劫、零基礎(chǔ)的人角度去考慮的,會讓他們?nèi)腴T造成困擾的与纽。
指針
Go語言中讓我覺得最不夠簡化的地方侣签,非指針莫屬了。
并不是說我討厭指針急迂,這里針對的是沒有基礎(chǔ)的小白的影所,即毫無編程基礎(chǔ)的普通人。它增加了Go語言入門的一難度僚碎,畢竟像其它的一些腳本語言如Python猴娩,是真的可以像寫英文詩一般快速入門。
標(biāo)準(zhǔn)庫的接口
畢竟定位于系統(tǒng)級編程的Go語言勺阐,標(biāo)準(zhǔn)庫的接口封裝更為抽象一些也是無可厚非的卷中。這使它更健壯、更靈活皆看,但降低了一定的易用成都仓坞。
標(biāo)準(zhǔn)庫的接口封裝抽象是怎么理解背零? 舉個超簡單的例子腰吟,像我們要打印一段文字:
// shell
echo 'hello world'
使用shell來實(shí)現(xiàn),非常簡單。
# Python
print 'hello world'
而在腳本語言python中毛雇,也是非常簡單嫉称。
// Go lang
import "fmt"
func main() {
fmt.Println("hello world")
}
而在Go語言中,就要稍微復(fù)雜灵疮,要導(dǎo)入包了织阅。更不用說像一些文件讀取、寫入方面的接口了震捣。
當(dāng)然了荔棉,系統(tǒng)級編程語言來說,這樣良好的模塊性設(shè)計其實(shí)是一大優(yōu)點(diǎn)蒿赢,只不過我們這里關(guān)注它的“簡”润樱,吹毛求疵。
Go語言更多是我業(yè)余的一些研究羡棵,而在實(shí)際工作中壹若,卻并未應(yīng)用開來。畢竟對領(lǐng)導(dǎo)們來說皂冰,舊有的熟悉的東西店展,才是穩(wěn)定的保證。
但是它更多讓我學(xué)習(xí)到的秃流,是它的思路——足夠的簡單赂蕴,狠心的舍棄不必要的。