Go語言 自學(xué)講解與資料
簡單說下自己情況,本人目前已有一年多開發(fā)經(jīng)驗(yàn)(前端+后端nodejs),再次基礎(chǔ)上自學(xué)golang,并成功找到一家用 golang 的公司,下面開始表演真正的技術(shù)時候。
各位老鐵,如果你想轉(zhuǎn)語言或者學(xué)習(xí)新的語言,我再這里墻裂推薦 Golang 既騷氣又帥氣 Google 親兒子。
?
一. Go 語言簡介
go語言 全稱:"Go Programming Language" 為了避免與 go 這個英文單詞沖突 就簡稱為 golang
?
Go 的來歷
很久以前,有一個IT公司,這公司有個傳統(tǒng),允許員工擁有20%自由時間來開發(fā)實(shí)驗(yàn)性項(xiàng)目。在2007的某一天,公司的幾個大牛,正在用 c + + 開發(fā)一些比較繁瑣但是核心的工作,主要包括龐大的分布式集群,大牛覺得很鬧心,后來 c + +委員會來他們公司演講,說 c + + 將要添加大概35種新特性。這幾個大牛的其中一個人,名為:Rob Pike,聽后心中一萬個xxx飄過,“ c + +特性還不夠多嗎?簡化 c + +應(yīng)該更有成就感吧”。于是乎,Rob Pike和其他幾個大牛討論了一下,怎么解決這個問題,過了一會,Rob Pike說要不我們自己搞個語言吧,名字叫“go”,非常簡短,容易拼寫。其他幾位大牛就說好啊,然后他們找了塊白板,在上面寫下希望能有哪些功能(詳見文尾)。接下來的時間里,大牛們開心的討論設(shè)計(jì)這門語言的特性,經(jīng)過漫長的歲月,他們決定,以c語言為原型,以及借鑒其他語言的一些特性,來解放程序員,解放自己,然后在2009年,go語言誕生。
而這個IT公司就是現(xiàn)在的 Google
?
Go 創(chuàng)始人黃金三人團(tuán)
Go 語言是由谷歌公司在 2007 年開始開發(fā)的一門語言,目的是能在多核心時代高效編寫網(wǎng)絡(luò)應(yīng)用程序。Go 語言的創(chuàng)始人 Robert Griesemer、Rob Pike 和 Ken Thompson 都是在計(jì)算機(jī)發(fā)展過程中作出過重要貢獻(xiàn)的人。
-
Rob Pike:Go 語言項(xiàng)目總負(fù)責(zé)人,貝爾實(shí)驗(yàn)室的Unix團(tuán)隊(duì)和Plan9操作系統(tǒng)計(jì)劃成員,與Thompson工同創(chuàng)造了UTF-8字符編碼
-
Robert Griesemer:制作Java的HotSpot編譯器和Chrome瀏覽器的JavaScript引擎V8
-
Ken Thompson: 是C語言和Unix的創(chuàng)造者。(1983年圖靈獎和1988國家技術(shù)獎)

從左到右分別是羅伯特·格瑞史莫(Robert Griesemer)、羅伯·派( Rob Pike)和肯·湯普遜(Ken Thompson)。
?
Go 的特點(diǎn)
Go是一種編譯型語言,一種并發(fā)的、帶垃圾回收的、快速編譯的語言。它具有以下特點(diǎn):
-
它可以在一臺計(jì)算機(jī)上用幾秒鐘的時間編譯一個大型的Go程序。
-
Go為軟件構(gòu)造提供了一種模型,它使依賴分析更加容易,且避免了大部分C風(fēng)格include文件與庫的開頭。
-
Go是靜態(tài)類型的語言,它的類型系統(tǒng)沒有層級。因此用戶不需要在定義類型之間的關(guān)系上花費(fèi)時間,這樣感覺起來比典型的面向?qū)ο笳Z言更輕量級。
-
Go完全是垃圾回收型的語言,并為并發(fā)執(zhí)行與通信提供了基本的支持。
Go 的基本結(jié)構(gòu)
Go語言專門針對多處理器系統(tǒng)應(yīng)用程序的編程進(jìn)行了優(yōu)化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持并行進(jìn)程。而且并結(jié)合類似 Python 的語法簡潔。
任何一個編程語言都有自己的基礎(chǔ)架構(gòu),只有在了解了編程語言的基礎(chǔ)架構(gòu)后才能開始進(jìn)行一些簡單的編程的邏輯,然后組合簡單結(jié)構(gòu)變?yōu)閺?fù)雜的數(shù)據(jù)結(jié)構(gòu),其實(shí)編程很多的時候都是一種藝術(shù),寫出的代碼也是一種藝術(shù),給人賞心悅目的感覺,這需要持續(xù)不斷的努力和精進(jìn)才能達(dá)到。
基本結(jié)構(gòu)有:
-
命名
-
常量
-
變量
-
賦值
-
類型
-
包和文件
-
作用域
命名:
Go語言的函數(shù)名,變量名,常量名,類型名和包的命名也是都遵循這一規(guī)則的:
一個一個名字必須以一個字母(Unicode字母)或下劃線開頭,后面可以跟任意數(shù)量的字母、數(shù)字或下劃線。
大寫字母和小寫字母是不同的:Car和car是兩個不同的名字。
Go語言中只有 25 個關(guān)鍵字;且關(guān)鍵字不能用于自定義名字,只能在特定語法結(jié)構(gòu)中使用.
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
除此之外Go語言中還有30多個預(yù)定義的名字,比如int和ture等:
內(nèi)建常量: true false iota nil
內(nèi)建類型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64 bool byte rune string error
內(nèi)建函數(shù): make len cap new append copy close delete complex real imag panic recover
常量:
在Go語言中,常量是指編譯期間就已知且不可改變的值。常量可以是數(shù)值類型(包括整型、浮點(diǎn)型和復(fù)數(shù)類型)、布爾類型、字符串類型等。 下面我們使用const 關(guān)鍵字來定義常量:
package main
import "fmt"
import "math"
// "const" 關(guān)鍵字用來定義常量
const s string = "appropriate"
func main() {
fmt.Println(s)
// "const"關(guān)鍵字可以出現(xiàn)在任何"var"關(guān)鍵字出現(xiàn)的地方
// 區(qū)別是常量必須有初始值
const n = 20
// 常量表達(dá)式可以執(zhí)行任意精度數(shù)學(xué)計(jì)算
const d = 3e20 / n
fmt.Println(d)
// 數(shù)值型常量沒有具體類型,除非指定一個類型
// 比如顯式類型轉(zhuǎn)換
fmt.Println(int64(d))
// 數(shù)值型常量可以在程序的邏輯上下文中獲取類型
// 比如變量賦值或者函數(shù)調(diào)用。
// 例如,對于math包中的Sin函數(shù),它需要一個float64類型的變量
fmt.Println(math.Sin(n))
}
變量:
通常用var聲明語句可以創(chuàng)建一個特定類型的變量,然后給變量附加一個名字,并且設(shè)置變量的初始值。
Go的基本類型有:
* bool
* string
* int int8 int16 int32 int64
* uint uint8 uint16 uint32 uint64 uintptr
* byte // uint8 的別名
* rune // int32 的別名 代表一個Unicode碼
* float32 float64
* complex64 complex128
變量的聲明的語法一般是:
var 變量名字 類型 = 表達(dá)式
通常我們在編程的過程中,也用簡短聲明變量。它以“名字 := 表達(dá)式”形式聲明變量,變量的類型根據(jù)表達(dá)式來自動推導(dǎo)。
destination := 12
result := rand.Float64() * 3.0
?
二. Go語言 自學(xué)資料
首先來說下自己的自學(xué)路徑吧:
之前我是搞 Node.js 的,他是用c++ 搞出來的產(chǎn)物,所以你要是想弄透它,你還得熟練個 c++ 。而對于 Go語言 來說在 1.5 版本開始作者就開始用 Go 本身來寫自己的底層的一些東西比如 gc 。所以對于學(xué)習(xí)Go語言的小伙伴門,你有什么不明白的函數(shù)方法都可以直接進(jìn)入源碼直接查看,這是我學(xué)習(xí)Go的過程中感覺很爽的一點(diǎn)。
1. 基本語法學(xué)習(xí)
書籍篇:
1.1 個人推介 《The Go Programming Language》Go語言圣經(jīng)(中文版)。國人翻譯過來還是不錯的,如果你英語沒問題可以直接上 原版。

這本書每個知識點(diǎn)都講的較為清晰詳細(xì),里面舉例代碼基本是Go自身標(biāo)準(zhǔn)代碼庫里面的源碼。里面的概念性的東西也許你剛開始看理解不透徹,但是當(dāng)我用過一段時間Golang 后也會回來再看,這時看起來理解的東西又不一樣了。
1.2 《Go in Action》Go語言實(shí)戰(zhàn) 這本書網(wǎng)上沒有電子圖書版本,你可以上當(dāng)當(dāng)或者淘寶購買實(shí)體書。

這本書也很不錯,里面不僅闡述了GO 的基礎(chǔ)概念,也加入了實(shí)際可操作的實(shí)例代碼。如果你嫌看書太慢,我推介你微信公眾號關(guān)注 “飛雪無情” 寫的Go語言實(shí)戰(zhàn)筆記系列文章,或直接網(wǎng)頁打開 飛雪無情的博客
1.3 還有一本 go web 這本書是 謝大 開源在他的 github 上的,star目前2W+,如果想快速上手 web開發(fā)的 推介給各位。

以上基本每本書我都有看翻看過所有才推介給大家,對于go 相關(guān)的書籍還有很多這里就不一一介紹了。
?
視頻篇:
直接上干貨了:
- 無聞老師的全套 這是基礎(chǔ)視頻 他還有強(qiáng)化的進(jìn)階視頻,這里給出他的個人 github 無聞go教程地址
- 某私人組織的公開視頻 講的較為基礎(chǔ),可以了解下,給出他們的教程文檔地址:
Go 零基礎(chǔ)編程入門教程 - 還有套視頻 是現(xiàn)在慕課網(wǎng)掛在首頁的 谷歌工程師講解收費(fèi)的 go語言視頻教程,由于是特殊渠道這里就不直接公布了,可以聯(lián)系我分享給你。
其實(shí)我覺得視頻這個東西屬于被動學(xué)習(xí),還是以自己開文檔主動學(xué)習(xí)較好,視頻速度偏慢,當(dāng)然我也有看過,就是覺得文檔看夠了有點(diǎn)累,換著看看視頻也不錯的。
?
網(wǎng)站資料篇:
除了官網(wǎng)給出的學(xué)習(xí)資料外(其實(shí)官網(wǎng)的資料就已經(jīng)很不錯了),我在這里提供一些之外的資料:
- Go by Example 這個是必須的,里面包括了 Golang 幾乎所有常用的方法,都是一個個的demo,給一個中文版本,這個可以反復(fù)敲打自行體驗(yàn)(尤其是關(guān)于并發(fā)和通道部分)。
- Golang標(biāo)準(zhǔn)庫文檔 這個給出的是中文版本的,你可以快速根據(jù)需求進(jìn)行查詢觀看。
- GO語言中文網(wǎng) 這是一個golang的社區(qū)
- GO中國技術(shù)社區(qū)
Go 技能樹全展示
給出一張 GO中國 發(fā)出來的技術(shù)圖譜
你也可以直接去這個頁面查看鏈接 Golang 技術(shù)棧
[圖片上傳失敗...(image-a76033-1525424812881)]