安裝Go語言及搭建Go語言開發環境
下載地址:
Go官網下載地址:https://golang.org/dl/
Go官方鏡像站(推薦):https://golang.google.cn/dl/
版本的選擇
Windows平台和Mac平台推薦下載可執行文件版,Linux平台下載壓縮文件版。

安裝
windows安裝



linux安裝
// 下載
wget https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz
將下載好的文件解壓到/usr/local目錄下:
mkdir -p /usr/local/go # 創建目錄
tar -C /usr/lcoal/go zxvf go1.11.5.linux-amd64.tar.gz. # 解壓
如果提示沒有權限,加上sudo以root用戶的身份再運行。執行完就可以在/usr/local/下看到go目錄了。
配置環境變量: Linux下有兩個文件可以配置環境變量,其中/etc/profile是對所有用戶生效的;
$HOME/.profile是對當前用戶生效的,根據自己的情況自行選擇一個文件打開,添加如下兩行代碼,保存退出。
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
修改/etc/profile后要重啟生效,修改$HOME/.profile后使用source命令加載$HOME/.profile文件即可生
效。
檢查:
~ go version
go version go1.11.5 linux/amd64
可以打開終端窗口,輸入go version命令,查看安裝的Go版本。
配置GOPATH
GOPATH是一個環境變量,用來表明你寫的go項目的存放路徑(工作目錄)。
GOPATH路徑最好只設置一個,所有的項目代碼都放到GOPATH的src目錄下。
補充說明:Go1.11版本之后,開啟go mod模式之后就不再強制需要配置GOPATH了。
Linux和Mac平台就參照上面配置環境變量的方式將自己的工作目錄添加到環境變量中即可。 Windows平台按下面的步驟將D:\code\go添加到環境變量:



在 Go 1.8 版本之前,GOPATH環境變量默認是空的。從 Go 1.8 版本開始,Go 開發包在安裝完成后會為 GOPATH設置一個默認目錄,參見下表。
GOPATH在不同操作系統平台上的默認值
| 平台 | GOPATH默認值 | 舉例 |
|---|---|---|
| Windows | %USERPROFILE%/go | C:\Users\用戶名\go |
| Unix | $HOME/go | /home/用戶名/go |
同時,我們將 GOROOT下的bin目錄及GOPATH下的bin目錄都添加到環境變量中。
配置環境變量之后需要重啟終端(cmd、VS Code里面的終端和其他編輯器的終端)。
Go項目結構
在進行Go語言開發的時候,我們的代碼總是會保存在$GOPATH/src目錄下
在工程經過go build、go install或go get等指令后,會將下載的第三方包源代碼文件放在$GOPATH/src目錄下
產生的二進制可執行文件放在 $GOPATH/bin目錄下,生成的中間緩存文件會被保存在 $GOPATH/pkg 下。
如果我們使用版本管理工具(Version Control System,VCS。常用如Git)來管理我們的項目代碼時,我們只需要
添加$GOPATH/src目錄的源代碼即可。bin 和 pkg 目錄的內容無需版本控制。
適合個人開發者
們知道源代碼都是存放在GOPATH的src目錄下,那我們可以按照下圖來組織我們的代碼

目前流行的項目結構
Go語言中也是通過包來組織代碼文件,我們可以引用別人的包也可以發布自己的包,但是為了防止不同包的項目名沖突,我們通常使用頂級域名來作為包名的前綴,這樣就不擔心項目名沖突的問題了。
因為不是每個個人開發者都擁有自己的頂級域名,所以目前流行的方式是使用個人的github用戶名來區分不同的包。

適合企業開發者

Go開發編輯器
Go采用的是UTF-8編碼的文本文件存放源代碼,理論上使用任何一款文本編輯器都可以做Go語言開發,這里推薦
使用VS Code和Goland。 VS Code是微軟開源的編輯器,而Goland是jetbrains出品的付費IDE。
我們這里使用VS Code 加插件做為go語言的開發工具。
GO語言介紹及其其他補充
靜態與動態
-靜態:(類型在程序運行過程中不允許改變)類型固定 a=10
-動態:(類型在程序運行過程中允許改變) 類型固定 a=10 a="qqq" (python)
強類型與弱類型
-強類型:(go,python是強類型)強類型 ,不通類型之間不允許直接運算 10+"ttt"
-弱類型:js 不通類型之間可以直接運算 10+"ttt"
解釋型與編譯型
-編譯型:先編譯再執行 編譯成可執行文件--可執行文件執行
-c 編譯成dll(動態鏈接庫),就是可執行文件
-解釋型:(解釋型:js,php,python)
-解釋型語言,代碼要運行在解釋器之上
-java:解釋型還是編譯型?有個編譯過程,並不是編譯成可執行文件,.class文件,不能直接運行在操作系統之上,它需要運行在jvm(java虛擬機之上,就可以當做解釋器)
-不論在什么平台執行java程序,最少需要裝java虛擬機, 一處編碼,處處運行(跨平台)
跨平台編譯
-跨平台編譯 (可以跨平台編譯:在不通平台可以編譯出另一個平台的可執行文件)
c/c++ :不通平台的軟件,需要現場編譯成可執行文件
python :需要安裝解釋器(不通平台)
java :不通平台需要裝java虛擬機
go :只要編譯完了,直接拿着執行就可以了(不通平台編譯不通平台的可執行文件)
垃圾回收機制
有垃圾回收機制的: python,go,java (gc),c沒有垃圾回收,變量定義了,不使用了,自己釋放掉
補充
ps補充: 支持面向對象和面向過程(go不是一門純粹的面向對象語言,沒有類的概念,但是可以實現面向對象的特
性:繼承封裝多態)
ps補充: go 1.5以后自己實現自己 --也是由 c寫起來的 之后就是自己的代碼寫的了的)
誰在用?
-google:k8s(容器編排),都是go寫的
-docker:(不是谷歌公司的),用go寫的
-騰訊藍鯨
-手機百度 后端大量的go
-區塊鏈:用go寫(可以用任何語言寫,第一款開源的區塊鏈項目,用go寫的)
第一個Go程序
Hello World
現在我們來創建第一個Go項目——hello。在我們的GOPATH下的src目錄中創建hello目錄。
在該目錄中創建一個main.go文件:
package main // 必須指明是哪個包 main包
//表示導入fmt包,對比python即可
import "fmt"
func main() { //定義了一個main函數
fmt.Println("hello world") //打印出helloworld
}
//go代碼跟格式縮進沒關系,你的代碼需要格式化,好看
//1 以后再寫go代碼,必須把代碼放在 main包下的main函數中(go程序的入口,是main包下的main函數)
//2 fmt.Println("hello world") 你看到的a... 其實是goland給你提示的,函數的形參是a...
//3 go語言中,包導入必須使用,否則報錯,注釋掉,包自動刪除(goland做的,其他編輯器 沒有)
go中的注釋
//go當中的注釋(跟js一樣,java) 單行注釋
// goland快捷鍵:ctrl+/ 快速單行注釋,解開注釋
/* 多行注釋 */
go代碼的執行
//執行go代碼
1 goland上點擊右鍵 Run 就可以執行(僅限於goland,vs code其他編輯器,都沒有)
2 先編譯,再執行正統的用法(go是編譯型語言),用命令
編譯:go build s1.go 編譯,編譯成當前平台的可執行文件 s1.exe
執行:s1.exe
3 編譯並執行(在vs code上的命令窗口下執行go文件)
go run s1.go 相當於2中的所有步驟,不產生可執行文件 s1.exe不產生
變量
變量定義:定義方式三種,其他的都是變形
func main(){
//1 第一種:全定義
//var(關鍵字) 變量名 變量類型 = 變量值
var name string = "long"
fmt.Println(name)
}
func main(){
//2 第二種:類型推導(自動推導出變量類型)
var name = "long"
fmt.Println(name)
}
fmt.Printf("%T",a) //查看a的類型
func main(){
//3 第三種:簡略聲明(這個用的多) 冒號跟等號是一起的
a := 10
fmt.Println(a)
}
變形定義
// 只定義變量,不賦值
var a int //int類型空值,是0
聲明多個變量,三種方式都可以
var a,b,c int=10,11,12
var a,b,c=10,11,12
var a,b,c=10,11,"xxx"
a,b,c:=11,12,"xxx"
變量不能重復定義
var a int
var a=90 //重復定義
a :=90 //重復定義
a=90
特殊情況
var a int
var a,b=10,20 // 不允許
1 變量定義了必須使用,否則報錯(只有go要求這樣)
2 查看變量沒寫
3 變量要先定義再使用
4 變量類型是固定的,不允許中途改變(靜態語言)
5 如果只是定義變量,必須指定類型,只能用第一種定義方式(var a int)
6 變量不允許重復定義
以后所有類型的變量定義,就參照變量定義的三種方式 (a :=90)
變量類型
類型: 數字,字符串,布爾
數字:
-int:整數類型(包括負數) int,int8,int16,int32,int64
-int8:表示能存儲的長度 8個比特位,8個小格,一個格只能放0和1,能表示的范圍是:正的2的七次方-1到, 負的2的7次方-1
-int16,32...類推
-int:在32位機器上,表示int32,在64位機器上表示int64
-python中int類型,遠遠比go的int64大,大很多,python中一切皆對象,int int對象
-uint:正整數 uint,uint8,uint16,uint32,uint64
-uint8:范圍:正2的8次方減一,有個0
-float:小數 float32,float64
-complex:復數(高等數學學得,實部和虛部,了解) complex32,complex64
-byte:uint8的別名,byte:翻譯過來是字節,一個字節是多少,8個比特位,uint8就占8個比特位
-rune:int32的別名,4個字節,表示一個字符
字符串:
-string:
用雙引號表示的(單引號表示的不是字符串)
var a string="my name is lqz"
反引號,就是python中的三引號,可以換行
var a string = `我很帥`
布爾:
-bool:true,false(都是小寫)
var a bool=true
var a =false
a:=false
常量
package main
import "fmt"
//常量:恆定不變的量,只賦值一次,以后再也不能改了,數據庫連接地址,端口號
//const關鍵字 變量名 變量類型 = 值
const name string= "lqz"
//類型推導
const name = "lqz"
//簡略聲明 不可以
//同時定義多個常量
const name,age ="lqz",19
func main() {
//name="long" //不允許修改
fmt.Println(name)
}
