我為什麼喜歡Go語言

2022-05-10 09:37:53 字數 2731 閱讀 8967

從2023年至今,也寫了11年**了,期間用過vb、delphi、c#、c++、ruby、python,一直在尋找一門符合自己心意和理念的 語言。我很在意寫**時的手感和執行的效率,所以在go出現之前一直沒有找到。在熟悉go之後,我雖沒有停下腳步,也去體驗了d語言,但幾乎立即就放棄 了,它的設計還是太複雜。

就說說go吧。它的好其實也就兩個字——簡潔!

很多東西,要整體去體會,才能感覺到真正的強大。沒有前面這些語法上的各種「看起來沒什麼用」的支援,怎麼能做到後面提到的那些設計上的簡潔?

我堅信,少就是多,簡單就是強大,不能減一分的設計才是真正的好設計!

簡潔的變數宣告和賦值

拿最簡單的宣告變數和賦值來看,下面這一句完成了宣告型別到賦值,最後還有那個常見的分號作為語句的結束。

var i int = 10;

這個一點都不簡潔對吧?為什麼非要有「var」?為什麼不能自己推導變數型別?為什麼結尾非要加上分號?這三個問題,我相信go語言的設計者也問過,並且都針對性的給了改進。重新來過。

i := 10

怎麼樣?「:=」是宣告並推導型別的語法糖,結尾的分號也省了,因為這裡我換行了,編譯器明白的。

還可以一次性宣告並賦值多個變數。

i, j, k := 1, 2, 3

不同的型別也可以。

i, j, k := 1, 1.0, 「hello」

如果要宣告一堆變數,但暫時不賦值呢?可以這樣。

var (

i, j int
s string

u, v, s = 2.0, 3.0, "bar"

go的設計者甚至覺得多打幾個「var」都不應該!

簡潔的if

有點意思了對吧?我學習一門新語言的時候,第一眼看變數型別和宣告,第二眼就會去看邏輯控制的語法。現在來看看都有些什麼?

if i > 10 else if b else if c else

神奇一點的switch,嘿嘿,與if異曲同工之妙。
switch x := f();
還有這個,有了這個更加明確的寫法,你真的還會if…else if…else if…else…嗎?

switch
條件判斷舒服了,迴圈呢?

孤單的for

其實我一直不太明白,為什麼一門語言裡面要提供多個迴圈語法呢?for、while、do…while…都是不可替代的?用哪乙個呢?似乎都是看個 人愛好吧?可能大家隨便就可以舉個例子出來證明這三個東西存在的必要和細微的差別,但對於我來說,做同一件事情如果有多種方法其實就是設計上的冗餘,會對 使用者造成或多或少的困擾。來看看go的迴圈吧。

for i := 0; i < 10; i++

簡化這個,go給出了乙個關鍵字「range」,先看用法。

for i, value := range somearray

for i, s := range a 這裡只是提到了幾點最基本的語法場景,go裡面還有很多!

函式可以返回多個值

其實能夠在一行多重賦值的語言挺多的,但乙個函式能返回多個值的就很少了,比如在c#裡面如果要返回兩個int,通常會這麼幹。

public class twoints

public int a;

public int b;

public class foo

public twoints returntwoint();

然後就可以 twoints ti = foo.calctwoint() 覺得悲催嗎?也許你都麻木了對嗎?很多語言都是這麼設計的。函式只能返回乙個值最大的問題是會導致出現很多沒必要的資料結構。上面就體現了這個冗餘,當 然,你說可以用out關鍵字讓函式返回,但這個語法用起來就不是那麼安全了。而這個問題在go裡面解決起來太容易了,因為go的函式可以返回多個值!

func returntwoint() (int, int) 這個介面。有了這個概念,即使沒有泛型也能有效的降低設計複雜度。

多執行緒還能更簡單點嗎?

要寫多執行緒,你要懂thread,懂各種鎖,懂各種訊號量。在各類系統裡面,「非同步」邏輯通常代表「困難」。這是go最強勁的部分,你見過比下面這個還簡單的非同步**嗎(以下**摘自go的官方範例)?

func isready(what string, minutes int64)

go isready("tea", 6);

go isready("coffee", 2);

fmt.println("i'm waiting....");

執行的結果是,列印:

i'm waiting.... (right away)

coffee is ready (2 min later)

tea is ready (6 min later)

go語言內建了「go」這個語法,任何go的方法,都將會被非同步執行。那非同步方法之前傳遞訊息呢?用channel唄。意如其名,就是乙個管道,乙個往裡寫,另外乙個等著讀。

ch := make(chan int) //建立乙個只能傳遞整型的管道

func pump(ch chan int) //往管道裡寫值 }

func suck(ch chan int) //這裡會等著直到有

值從管道裡面出來 }

go pump(ch) //非同步執行pump

go suck(ch) //非同步執行suck

嘿嘿,然後你就看到控制台上輸出了一堆數字。

我為什麼喜歡Go語言

從2000年至今,也寫了11年 了,期間用過vb delphi c c ruby python,一直在尋找一門符合自己心意和理念的 語言。我很在意寫 時的手感和執行的效率,所以在go出現之前一直沒有找到。在熟悉go之後,我雖沒有停下腳步,也去體驗了d語言,但幾乎立即就放棄 了,它的設計還是太複雜。就...

我為什麼喜歡Go語言

從2000年至今,也寫了11年 了,期間用過vb delphi c c ruby python,一直在尋找一門符合自己心意和理念的語言。我很在意寫 時的手感和執行的效率,所以在go出現之前一直沒有找到。在熟悉go之後,我雖沒有停下腳步,也去體驗了d語言,但幾乎立即就放棄了,它的設計還是太複雜。就說說...

我為什麼喜歡程式設計

日期 2009年10月18日 這個週末,我在家核對more joel on software 的最後定稿。此書已經在申請書號了,一拿到書號,就可以印刷和銷售了。所以,不出意外的話,年底之前就能上架。在複核的過程中,我又讀到了書中讓我最有共鳴的一段話 joel談為什麼公正對程式設計師很重要。我不知道別...