Golang 的槽點
Golang雖然說打著簡潔的名號,但是很多設計實際上並不簡潔,且由於Go1相容性保證的原因,這些都不能被修正。
宣告方式太多
var x int = 1 var x = 1 var x int; x = 1 var x = int(1) x := 1
初始化方式太多
x := MyStruct{} var x MyStruct; x = MyStruct{} x := new(MyStruct)
對於map, slice, channel還要算上make
。
糟糕的錯誤處理
if err != nil
這絕對是Gopher最常見的程式碼之一。懷念大Python的try...except...
多餘的返回值變數宣告
func Bla() (i int, err error) {}
有時候看一個變數到底是什麼型別,結果一路往上看都沒找到宣告或者初始化的地方,結果最後發現
是在返回值那裡進行宣告的。這種宣告方式加劇了Golang的不易讀性。而這種方式唯一的作用就是,當你需要在defer裡修改返回值時,就
需要這種奇怪的返回方式。
沒有泛型
這就導致很多程式碼必須與interface搭上勾,這樣做就失去了型別安全。如果想要型別安全,那麼就得為每一種型別寫上一份相同的程式碼。
沒有好用的ORM
上述的種種底層原因,就導致了業務上的不好用之處,沒有一個好用的ORM。不過沒關係,sqlx夠用。
建議
我一直認為,統一和簡潔是非常重要的,因此個人遵循如下原則
-
不用
new
,除了channel
之外,也不使用make。統一使用MyStruct{}
,map[string]interface{}{}
這樣的方式來初始化 -
對於同一個block內多次使用的變數,在最頂部使用
var x int
進行宣告 -
對於需要指定型別的變數,使用
vat x uint = 1
進行宣告並初始化 - 等Go2的錯誤處理和泛型