我斷斷續(xù)續(xù)的,無(wú)聊的時(shí)候會(huì)看一些Golang 的書(shū),也會(huì)用它做一些小的Demo,我甚至還想去做一份Golang 的工作。
它的優(yōu)點(diǎn)大家都知道,就是并發(fā)。Medium搜一下go會(huì)有一篇關(guān)于如何用go實(shí)現(xiàn)百萬(wàn)級(jí)的并發(fā)的文章,代碼精髓又簡(jiǎn)單。
但是我想說(shuō)說(shuō)它的一些讓人不爽的地方。
Swift有一個(gè)很重的概念就是面向協(xié)議,可以去看看各大Swift 的庫(kù),都很注重面向協(xié)議這個(gè)概念。Golang也是如此,只是說(shuō)法是面向接口(interface).
但是Golang的面向接口不需要聲明接口,這個(gè)真的很操蛋的。如果你去看代碼,如果有用接口作為參數(shù)的話你就慘了。你根本不知道哪些Struct實(shí)現(xiàn)了那個(gè)接口。所以寫(xiě)Go的時(shí)候如果你不把那個(gè)接口和實(shí)現(xiàn)接口的Struct寫(xiě)在一起那簡(jiǎn)直就是災(zāi)難,對(duì)于那些習(xí)慣細(xì)致的讀代碼的人來(lái)說(shuō)真的很痛苦,比如說(shuō)我。不需要申明接口的另一個(gè)糟糕的地方就是你可能在寫(xiě)代碼的時(shí)候,碰巧就實(shí)現(xiàn)了一個(gè)接口,如果那個(gè)Struct命名和你想用來(lái)實(shí)現(xiàn)接口的Struct的命名很像的話,很可能就被寫(xiě)成參數(shù),后果就是一個(gè)Crash。
Golang 的面向接口是如此的粗糙與敷衍,Swift完全不會(huì)有這個(gè)問(wèn)題。
Golang 沒(méi)有實(shí)現(xiàn)泛型,所以寫(xiě)起代碼來(lái)會(huì)束手束腳,這要我想起了被OC支配的恐懼。你可能需要寫(xiě)更多無(wú)聊的代碼來(lái)實(shí)現(xiàn)一個(gè)功能。
Golang的一個(gè)方法返回值可以直接用在方法里面,不需要額外的聲明。這樣看似好酷的感覺(jué),其實(shí)傻逼至極,你在寫(xiě)代碼的時(shí)候會(huì)感到一種混淆的感覺(jué),私以為老老實(shí)實(shí)的申明返回值然后再return會(huì)更友好。
Golang申明參數(shù)有一種方式。比如
x, y, z int
哇,這種申明方式真的很傻逼的,你會(huì)發(fā)線其它的語(yǔ)言也可以這樣,這似乎就是一個(gè)一直沿用至今的錯(cuò)誤(我個(gè)人認(rèn)為)。Golang 發(fā)揚(yáng)了這個(gè)錯(cuò)誤,可以這樣子寫(xiě)在方法的參數(shù)里面。這樣子你會(huì)覺(jué)得x的類型是y,然后出現(xiàn)一個(gè)z,最后才發(fā)現(xiàn)都是int,會(huì)有一種被調(diào)戲的感覺(jué)。所以我一直覺(jué)得這種設(shè)計(jì)方式就是一個(gè)錯(cuò)誤,因?yàn)槿祟惗枷矚g直觀,簡(jiǎn)單,程序員也是如此。
Golang的Array和Map也是十分的古怪,讀起來(lái)十分的不友好,不像Swift來(lái)的直觀。尤其是Map里面是一個(gè)復(fù)雜的類型,那會(huì)是一個(gè)災(zāi)難。不一直長(zhǎng)期的寫(xiě)的話,你會(huì)很不習(xí)慣它。
所以Golang真的只是一個(gè)實(shí)現(xiàn)工程的語(yǔ)言,比起和它出生差不多的Swift而言。它省了一些不該省的,創(chuàng)新了一些垃圾的語(yǔ)法。當(dāng)Swift 加入了并發(fā)的語(yǔ)法更加的成熟之后,我不認(rèn)為golang還會(huì)有現(xiàn)在的市場(chǎng)。