1. 程式人生 > >《GO語言聖經》學習初感與建議

《GO語言聖經》學習初感與建議

前言

今天剛看了《GO語言聖經》的前二十頁,感觸頗深,深感此書之精髓,令人歎服,決定從今日起,記錄下啃書的收穫與感悟,與君共勉!!!
在記錄中,我會有選擇的進行分享,對那些自我感覺比較關鍵的細細解讀,一些不是太重要的我就簡單略過了,以此節省大家的時間。有興趣的小夥伴可以邊看書邊看我的部落格,一起交流一起進步一起成長,效果想必是極好的。

學習建議

首先說一下,我自學GO語言已經大概兩個月了,大致學完了GO的所有基本語法,本以為看這本書會輕鬆一些,沒想到從第一章就處處是玄機,處處是奧妙,揭示了我對GO的諸多盲區,因此建議其他想看這本書的小夥伴,在零基礎時候不建議看這本書,最好在學習一個月之後再開始看這本書,有利於掃掉盲區,加深對go的理解。
開始

翻開此書,首先是前言部分,拋開那些寫書的雜七雜八的感謝詞不說,首先就是這張GO語言的進化圖,這張圖揭示了GO語言的進化史,GO的三個重要的祖先CSP、ALGOL和C直接就顯示出GO語言的幾個特點,比如匯入包的設定,垃圾回收機制,用於程序之間通訊的管道,動態陣列切片等,都來源於這些語言中的思想。
這裡寫圖片描述

下面進入第一章!
1.1Hello World
很多人看到Hello world心裡都會一陣放鬆,心想這也太SB了,侮辱我智商嘛這不是,更有甚者直接跳過了這一段,但是這裡的學問同樣不可小覷,看了這一篇之後,引人深思,小編腦洞大開,感興趣的朋友可以戳傳送門,記錄了我從hello world引申出來的一些想法和實踐。:

戳瞭解——>Golang打印出世界上所有的語言文字!

1.2命令列引數
這裡開始就有值得細細品味的了,據說是UNIX命令echo的實現,這個命令會在當前所在行打印出命令列引數。

echo1:

func main() {
	var s,sep string
	for i:=1;i<len(os.Args) ;i++  {
		s+=sep+os.Args[i]
		sep=" "
	}
	fmt.Println(s)
}

這是書中的原始碼,乍一看,挺簡單的,s用來存放所有的命令列字元,sep用來加上空格,便於區分,os.Args會返回字串切片型別,不是挺簡單的嘛,但是細細品來,這段程式碼卻是很精闢的,不信?我們來看:
第一次進入迴圈時,sep還沒有被賦值,此時sep為空,所以在第一次“s+=”操作時,前面沒有空格,s加完後sep被賦值為空格,以後每次"s+="操作時都相當於加上一個“空格+命令列”,如此執行下來,s中便不會出現頭尾有空格的情況,因此這裡的sep賦值的位置和"s+="的位置是很考究的,要知道在計算機中是不能出現多一個空格,少一個空格的情況的。這裡讓我很是受用。
看完這裡之後,我就想起來我昨天做的一個程式設計題,並去優化了一下,因為平時敲程式碼的時候,我會選擇使用strings.Trimspace函式來去掉頭尾空格,這樣看似效果一樣,但是不是最優解,比較繁瑣,若是像書中的這段程式碼一樣,注意好邏輯,便能省下不少步驟。

echo2:
這裡寫圖片描述
這一段程式碼只是echo1的改版,個人覺得亮點如下:
使用了自動推倒型別,這是GO語言特有的一種簡便方法,值得注意的是,自動推倒型別不能作全域性變數使用。
使用了for range迭代的方法,for range遍歷一般返回兩個值,第一個為下標索引,第二個為下標所對應的值,一般使用自動推倒型別接收兩個值較為方便,值得注意的是GO語言中不能有沒有被使用的值出現,因此若是不需要的值,可以使用_下劃線來丟棄,比如此段程式碼中的索引值是不需要的。
os.Args的返回值為[]string,字元切片,是一種go語言中特有的動態陣列,可以使用[n:m]這樣地方法進行切割所需,比如這段程式碼中就是用了os.Args[1:],意思是取從下標為1的值到後面所有!

echo3
這裡寫圖片描述
到這裡,已經將我們之前的程式碼簡化成短短一行了,效果是一樣的,這裡主要是使用了strings.join這個函式,可以將字元切片通過第二個引數連線起來,非常好用!

練習題
最後,本書丟擲了三個練習題給我們
這裡寫圖片描述
過於簡單,這裡就不多比比了,只要能把上面的echo1~echo3搞懂,相信這裡就是小意思了。

有任何問題都可以通過各種方式給我留言哦,歡迎大家一起交流,一起學習GO語言