? ? ? ? ? ? ? ?Go語言核心編程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?原創(chuàng)者:文思? ?
?? ? ? ? ? ? ?
一、認識Go語言
1、Go簡介及應(yīng)用場景
Go語言,我們可以簡單的寫成Golang,是Google公司創(chuàng)造和主推的。
Go可以做什么?區(qū)塊鏈開發(fā)、Go服務(wù)端開發(fā)、Golang分布式/云計算
Go的優(yōu)勢:處理大并發(fā)、處理數(shù)據(jù)、計算能力
Go目前的應(yīng)用領(lǐng)域:區(qū)塊鏈應(yīng)用、后端服務(wù)應(yīng)用支撐(排序、推薦、搜索、按條件分流等)、云計算/云服務(wù)(盛大云計算:CND調(diào)度|分發(fā)系統(tǒng)|監(jiān)控系統(tǒng)|短域名服務(wù)、京東消息推送云服務(wù)及京東分布式文件系統(tǒng)后端全部用go實現(xiàn))
2、Golang的學習方法
高效;先建立整體框架,然后細節(jié);先know how再know why;多琢磨別人怎么做;總結(jié)學習經(jīng)驗;后期注重技術(shù)基礎(chǔ)及細節(jié)原理的認識
Go語言的吉祥物,金花鼠

3、Go語言小故事

為何要創(chuàng)造Go語言?

發(fā)展歷程:
2007年原型
2009年開源發(fā)布
2015年1.5版本中移除了最后的殘余的C代碼
2017年2月17日1.8版本
2017年8月24日1.9版本,1.9.2版本
2018年2月16日1.10版本
4、Go語言特點:
(1)? Go=C+Python,兼顧運行速度與動態(tài)語言的快速開發(fā)。繼承了C的理念,保留了C的編譯執(zhí)行方式,但弱化了指針。
(2) 引入包的概念,用于組織程序結(jié)構(gòu),Go語言的每一個文件都要屬于一個包,而不能單獨存在。
(3) 垃圾回收機制。內(nèi)存自動回收,不需要開發(fā)人員管理
(4)? 天然并發(fā)(重要特點):從語言層面支持并發(fā),實現(xiàn)簡單;goroutine輕量級線程,可實現(xiàn)大并處理,高效利用多核;基于CPS并發(fā)模型實現(xiàn)。
(5)? 吸收了管道通信機制,形成了Go語言特有的管道Channel,通過管道可以實現(xiàn)不同goroute之間的通信。
(6) 函數(shù)可以返回多個值,且go語句后面不需要寫分號(編譯器會自動加分號)
(7) 新的創(chuàng)新:比如切片slice、延時執(zhí)行defer等。
5、Go語言的開發(fā)工具
1、visual? studio?code (VSCode)運行于主流操作系統(tǒng)智商,默認提供Go語言語法高亮,安裝Go語言插件后可以智能提示、編譯運行。
2、Sublime Text可免費試用默認也支持Go語法,但一定次數(shù)后提示是否購買。
3、Vim 是從vi發(fā)展出來的,代碼補全、編譯、錯誤跳轉(zhuǎn)等方便編程的功能豐富。
4、Emacs 傳說中的神器,不僅是一個編輯器,可稱為一個集成運行環(huán)境。
5、Eclipse
6、LiteIDE 中國人開發(fā)專門Go語言開發(fā)
7、JetBrains公司的產(chǎn)品,付費,需要安裝Go語言
建議學習時使用VSCode或vim。一定階段后工作使用時用Eclipsse等自動化較強的開發(fā)工具。
二、開發(fā)實戰(zhàn)
創(chuàng)建一個文件夾gocode,類似java的workspace
package main//歸屬到main包下
import "fmt"http://引入fmt包
func main(){
????fmt.Println("hello")//輸出hello
}
1、安裝開發(fā)環(huán)境、sdk
https://www.golangtc.com/download下載sdk然后解壓即可:

配置環(huán)境變量:
GOROOT 指定sdk的安裝路徑
Path 添加sdk的/bin目錄
GOPATH 工作目錄,以后go項目存放的路徑
例如:

2、快速入門
go程序的目錄結(jié)構(gòu)
d:/goproject
??|--src
??????|--go code
????????????????????????? |--project1(項目)
開始hello,world

通過go build命令進行編譯源文件:go build? heelo.go

運行hello.exe文件即可:hello.ext

也可以用go? run編譯后直接執(zhí)行,go run hello.go:

大家注意,go和java在編譯時不同的一點是,go可以指定編譯后的文件名稱。比如:

執(zhí)行流程:
先編譯再執(zhí)行:類似java,編譯后的exe相當于java的class
使用go? run直接編譯執(zhí)行:底層也是先編譯再執(zhí)行。
先編譯再執(zhí)行的好處就是可以把exe拷貝到?jīng)]有g(shù)o的安裝環(huán)境下執(zhí)行
編譯后的exe文件會將依賴的庫也編譯進來,所以exe會比go文件大很多。
注意事項:?????
Go應(yīng)用程序的執(zhí)行入口是main函數(shù)(和java一樣)。
Go語言嚴格區(qū)分大小寫。
Go方法由一條一條語句構(gòu)成,語句后不需要加分號。
Go語言一條一條編譯,不能把多條語句寫在統(tǒng)一行。
Go語言定義的變量或者import引入的包引入后沒有被使用,代碼不能編譯通過(和java不同)。
大括號成對出現(xiàn),缺一不可。
3、轉(zhuǎn)義字符及注釋、規(guī)范的編碼風格
\t?? 制表位
\n?? 換行符
\\?? 一個\
\”?? 一個”
\r?? 一個回車
1)行注釋://
2)塊注釋:/**/
編碼風格:官方推薦用行注釋來注釋方法和語句。
正確的縮進和空白,可以使用鍵盤進行縮進,也能使用gofmt命令來進行格式化(gofmt –w main.go該指令將格式化后的內(nèi)容重新寫入到文件)。
運算符兩邊習慣性各加一個空格。比如:2 + 3
一行盡量不要超過80個字符,如果超長建議使用換行符
左側(cè)大括號要寫在函數(shù)同一行,比如:
func main{
}
4、官方編程指南和標準庫API
點擊tour選擇中文,可以看中文版
Golang的中文網(wǎng)站https://studygolang.com/

對應(yīng)api一般都可以在源碼下找到

5、變量
Golang的變量是有數(shù)據(jù)類型的。
1定義變量? 2聲明變量? 3使用變量
var?i?int
i = 10
變量使用的三種方式:
1指定變量類型,聲明后若不賦值,使用默認值
2根據(jù)值自行判斷變量類型
3省略var,變量名 := 變量值???????
使用變量及一次性聲明多個變量,示例:
packagemain
import "fmt"
func main(){
????var i int
????fmt.Println(i)
????var t = 100
????fmt.Println(t)
????a := 1000
????fmt.Println(a)
//以下是一次性聲明多個變量的三種方式
????var n1,n2,n3 int
????fmt.Println(n1,",",n2,",",n3)
????var m1,m2,m3 = 10000,"tom",20000
????fmt.Println(m1,",",m2,",",m3)
????a1,a2,a3 := 100000,"jack",300000
????fmt.Println(a1,",",a2,",",a3)
}
運行輸出:
0
100
1000
0, 0 , 0
10000, tom , 20000
100000, jack , 300000
全局變量:在函數(shù)外部定義的變量就是全局變量。也可以分開創(chuàng)建聲明和使用,也可以一次性聲明,示例:
import "fmt"
var n1 = 1
var n2 = 2
var n3 = 3
//以下是一次性聲明多個全局變量
var(
????m1 = 11
????m2 = 22
????m3 = 33
)
func main(){
????fmt.Println(n1,",",n2,",",n3)
????fmt.Println(m1,",",m2,",",m3)
}
運行輸出:
1, 2 , 3
11, 22 , 33
局部變量有默認的值,全局變量沒有默認值。(這點和java相反)

6、數(shù)據(jù)類型
6.1基本數(shù)據(jù)類型
整數(shù)類型:int(有符號),int8,int16,int32,int64,uint(無符號),uint8,uint16,uint32,uint64,byte,
rune(等價于int32用于unicode碼)
浮點型:float32,float64
字符型:沒有專門的字符型,使用byte來保存單個字母字符
布爾型:bool
字符串:string(golang將string歸屬為基本數(shù)據(jù)類型,這和java不同)
6.2派生/復(fù)雜數(shù)據(jù)類型
指針,數(shù)組,結(jié)構(gòu)體,管道,函數(shù),切片,接口,map
6.3整數(shù)類型詳解:
int8 有符號,占用1字節(jié),表數(shù)范圍-128 -
127
int16有符號,占用2字節(jié),表數(shù)范圍-2(15次方) - 2(15次方)-1
int32有符號,占用4字節(jié),表數(shù)范圍-2(31次方) - 2(31次方)-1
int64有符號,占用8字節(jié),表數(shù)范圍-2(63次方) - 2(63次方)-1
其具體的大小和系統(tǒng)有關(guān)。
6.4變量使用細節(jié)
Golang默認的整數(shù)類型為int類型,Golang程序中整型變量在使用時遵守“保小不保大”的原則,即:在保證程序正確運行下,盡量使用占用空間小的數(shù)據(jù)類型。
bit是計算機中最小的存儲單位,byte是計算機中最基本的存儲單元。1byte = 8 bit
當我們var t =
100使用程序自行判斷變量類型時,我們怎么知道變量的類型和字節(jié)大小呢,可以用fmt的Printf輸出:
packagemain
import "fmt"
import "unsafe"
func main(){
??? var t? =100 //t是什么類型
??? //fmt.Println()可以用作格式化輸出
???fmt.Printf("t的類型 %T",t)
???fmt.Printf("\n")
???fmt.Printf("t占用的字節(jié) %d",unsafe.Sizeof(t))
}
挨個import太麻煩,也不專業(yè),可以一次性集中引入,真正開發(fā)中的寫法都是import集中引入:
packagemain
import(
??? "fmt"
??? "unsafe"
)
func main(){
??? var t? =100 //t是什么類型
??? //fmt.Println()可以用作格式化輸出
???fmt.Printf("t的類型 %T",t)
???fmt.Printf("\n")
???fmt.Printf("t占用的字節(jié) %d",unsafe.Sizeof(t))
}
運行程序顯示:
t的類型 int
t占用的字節(jié) 8

未完,待續(xù)......