前言
本人是.Net/C#開發(fā)小白杜窄,在大佬們的建議下,開始學(xué)習Go語言算途,特此記錄下自己的學(xué)習過程塞耕。
由于本文時自己參考書籍以及網(wǎng)絡(luò)資料寫的,如果有錯誤嘴瓤,請大佬指出扫外,我感謝不盡
Go的Hello World
作為最常用最喜歡的入門第一段程序就是輸出Hello Wrold啦莉钙,這里直接貼代碼給上。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
將上述代碼內(nèi)容復(fù)制到go后綴的文件中筛谚,如main.go磁玉,將終端路徑定位到文件上級,輸入指令
go run main.go
就可以看到萬眾期待的Hello World啦
關(guān)于Go的安裝和配置
Golang的安裝十分簡單驾讲,可以點擊此處鏈接到達下載頁面蚊伞。此處建議下載Go1.13以上版本進行學(xué)習和開發(fā)。本文使用的Go版本是基于1.17進行編寫的吮铭。
安裝完畢之后时迫,開發(fā)者要及時將Go的bin目錄添加到環(huán)境變量的path中。
Go的環(huán)境變量設(shè)置
使用Go指令go env谓晌,既可以查看當前Go的環(huán)境變量設(shè)置掠拳。
go env
這里給出比較推薦的Go全局環(huán)境變量設(shè)置
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
第一行是開啟自Go1.11版本開始,并且至今也比較流行的Go module 包管理工具纸肉。
第二行是切換到七牛云Go下載代理地址溺欧,可以加快國內(nèi)環(huán)境的包獲取速度。
Go常用指令及其一般功能介紹
1.go help
在終端輸入該指令可以獲得所有g(shù)o指令的介紹和使用說明柏肪。
2.go env
該指令可以獲得當前目錄環(huán)境下的go環(huán)境變量數(shù)據(jù)姐刁,也可以通過該指令來更改全局或者當前局部的環(huán)境變量。
3.go mod init XXX
對當前環(huán)境的下創(chuàng)建model為XXX的go.mod文件预吆,即使用gomod包管理工具龙填,一般是一個項目的起點。
4. go mod tidy
主動添加需要用到但go.mod中查不到的模塊拐叉。
5. go run xxx.go
編譯并執(zhí)行xxx.go的main方法岩遗。
6. go build xxx.go(該文件下有main方法)
一般用于編輯和打包生產(chǎn)可執(zhí)行文件,會根據(jù)設(shè)置的環(huán)境變量的OS屬性生成不同系統(tǒng)適用的可執(zhí)行文件凤瘦。
7. go get XXXXX
用于獲取XXX地址的包宿礁。
8. go version
用于查看當前go版本
Go的文件格式說明
package main
import "fmt"
const (
PI = 3.14
)
var (
name = "icesfeaters"
)
func init() {
fmt.Println("init")
}
func main() {
fmt.Println("Hello World")
}
package 包
包的特性如下:
- 一個目錄下的同級文件歸屬一個包。
- 包名可以與其目錄不同名蔬芥。
- 包名為 main 的包為應(yīng)用程序的入口包梆靖,編譯源碼沒有 main 包時,將無法編譯輸出可執(zhí)行的文件笔诵。只有main包下的main函數(shù)才是程序的入口返吻。
import 導(dǎo)入包
當前程序需要使用到其他包的方法時,需要在import中聲明,并且可以在import中自定義指定方法名來使用乎婿,如下方程序所示测僵。該處理方式主要用于解決1.壓縮包名;2.解決不同包直接的命名沖突問題。
import (
fmtkk "fmt"
)
func main() {
fmtkk.Println("hello world")
}
匿名包
存在部分包捍靠,需要該包的初始化沐旨,但實際程序編寫并不會使用的情況,比如:數(shù)據(jù)庫驅(qū)動方法包榨婆。則需要使用匿名包寫法來聲明磁携,寫法如下。
import (
_ "github.com/jinzhu/gorm/dialects/mysql"
)
//此處聲明的是mysql驅(qū)動包
const 全局常量聲明
先說明常量的概念:常量:只能讀良风,不能修改谊迄,聲明時必須確定值,且只能是布爾型拖吼、數(shù)字型(整數(shù)型鳞上、浮點型和復(fù)數(shù))和字符串型。
常量聲明的完整寫法如下:const thisNum int = 9
吊档。
其中[type] (int)字段篙议,Go可以根據(jù)后面的值來判斷并自動識別聲明,所以可以省略怠硼。
注意點:常量聲明中鬼贱,只能使用=
,不能使用:=
香璃。
var 全局變量聲明
全局變量聲明必須攜帶關(guān)鍵字var
这难,并且只能使用=
,不能使用:=
葡秒。
全局變量的聲明的完整寫法如下:var thisNum int = 10
與常量聲明不同之處在于:
- 全局變量聲明可以不給予初始值姻乓,但相對的必須聲明參數(shù)類型,如
var thisNum int
- 變量的類型不僅限于基礎(chǔ)類型眯牧,包括
func()
,interface{}
,struct{}
等蹋岩。
init 初始化方法
init()函數(shù)會在每個包完成初始化后自動執(zhí)行,并且執(zhí)行優(yōu)先級比main函數(shù)高学少。
init 函數(shù)通常被用來:
- 對變量進行初始化
- 檢查/修復(fù)程序的狀態(tài)
- 注冊
- 運行一次計算
初始化順序規(guī)則: (1)引入的包 (2) 當前包中的變量常量 (3) 當前包的init (4)main函數(shù)
注意init()函數(shù)不能被主動調(diào)用剪个!
當出現(xiàn)多個init()函數(shù)時,安裝聲明的先后順序依次執(zhí)行版确,測試程序如下:
package main
import "fmt"
func init() {
fmt.Println("init1")
}
func init() {
fmt.Println("init2")
}
func main() {
fmt.Println("main")
}
輸出結(jié)果
init1
init2
main
函數(shù)聲明
此處僅列出函數(shù)聲明的完整格式扣囊,具體方法說明后續(xù)內(nèi)容會說明
func funcName(param1 type,param2 type ...)(res1 type,res2 type ...){}
到時候會將跳轉(zhuǎn)地址在此處列出
額外說明
- Go如何區(qū)分公有權(quán)限和私有權(quán)限
go中根據(jù)首字母的大小寫來確定可以訪問的權(quán)限。無論是方法名绒疗、常量侵歇、變量名還是結(jié)構(gòu)體的名稱,如果首字母大寫吓蘑,則可以被其他的包訪問盒至;如果首字母小寫,則只能在本包中使用。
可以簡單的理解成枷遂,首字母大寫是公有的,首字母小寫是私有的棋嘲。
- 關(guān)于Go的定義未使用問題
在Go中酒唉,禁止出現(xiàn)未被使用的包、未被使用的局部變量沸移,所以在學(xué)習使用Go的時候要額外注意這一點痪伦。
Go的關(guān)鍵字列舉
- 包相關(guān):
import
,package
- 聲明相關(guān):
var
,const
,type
,struct
,interface
,func
,chan
,map
,go
- 循環(huán)相關(guān):
for
,range
- 條件判斷相關(guān):
if
,else
,switch
,select
,case
- 中斷或返回:
return
,goto
,fallthrough
,break
,default
,continue
- 延遲執(zhí)行:
defer
- 預(yù)聲明常量:
true
,false
,iota
,nil
- 預(yù)聲明類型:(整型)
int
,int8
,int16
,int32
,int64
;(無符號整型)uint
,uint8
,uint16
,uint32
,uint64
,uintptr
;(浮點型)float32
,float64
,complex64
,complex128
;(其他)bool
,byte
,rune
,string
,error
- 預(yù)聲明函數(shù):
make
,len
,cap
,new
,append
,copy
,close
,delete
,complex
,real
,imag
,panic
,recover