
首先介紹下GO語言的起源
Go語言是一個(gè)開源的編程語言,它能讓構(gòu)造簡單,可靠且高效的軟件變得容易。
GO是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā)。2009年11月開源,在2012年早些時(shí)候發(fā)布了GO 1穩(wěn)定版本?,F(xiàn)在GO的開發(fā)已經(jīng)是完全開放的,并且擁有一個(gè)活躍的社區(qū)。
Go語言最主要的特性
- 自動(dòng)垃圾回收
- 更豐富的內(nèi)置類型
- 函數(shù)多返回值
- 錯(cuò)誤處理
- 匿名函數(shù)和閉包
- 類型和接口
- 并發(fā)編程
- 反射
- 語言交互性
Go語言結(jié)構(gòu)
在學(xué)習(xí)之前先來了解下Go語言最簡單程序結(jié)構(gòu)。
Go語言的基礎(chǔ)組成有一下幾個(gè)部分
- 包聲明
- 引入包
- 函數(shù)
- 變量
- 語句&表達(dá)式
- 注釋
package main
import "fmt"
func main(){
fmt.Println("My,first Go applition")
}
讓我們來看下以上程序的各個(gè)部分
-
package main定義了包名,你必須在源文件中非注釋的第一行指明這個(gè)文件屬于哪個(gè)包,每個(gè)Go應(yīng)用程序都包含一個(gè)名為main的包。 -
import "fmt"是告訴Go編輯器這個(gè)程序需要使用fmt包(的函數(shù),或其他元素),fmt包實(shí)現(xiàn)了格式化IO(輸入/輸出)的函數(shù)。 -
func main()是程序開始執(zhí)行的函數(shù)。main函數(shù)是每一個(gè)可執(zhí)行程序所必須包含的,一般來說都是在啟動(dòng)后第一個(gè)執(zhí)行的函數(shù)(如果有init()函數(shù)則會(huì)先執(zhí)行該函數(shù)) -
/*...*/是Go語言的注釋標(biāo)識(shí)。 -
fmt.Println(...)可以將字符串輸出到控制臺(tái),并在最后自動(dòng)增加換行字符 \n,使用fmt.Print("My,first Go applition\n")可以得到相同的結(jié)果。 - 當(dāng)標(biāo)識(shí)符(包括常量、變量、類型、函數(shù)名、結(jié)構(gòu)字段等等)以一個(gè)大寫字母開頭,如:Group1,那么使用這種形式的標(biāo)識(shí)符的對(duì)象就可以被外部包的代碼所使用(客戶端程序需要先導(dǎo)入這個(gè)包),這被稱為導(dǎo)出(像面向?qū)ο笳Z言中的 public);標(biāo)識(shí)符如果以小寫字母開頭,則對(duì)包外是不可見的,但是他們?cè)谡麄€(gè)包的內(nèi)部是可見并且可用的(像面向?qū)ο笳Z言中的 protected )。
Go語言基礎(chǔ)語法
Go標(biāo)記
Go 程序可以由多個(gè)標(biāo)記組成,可以是關(guān)鍵字,標(biāo)識(shí)符,常量,字符串,符號(hào)。如以下 GO 語句由 6 個(gè)標(biāo)記組成:
fmt.Println("Hello, World!")
1. fmt
2. .
3. Println
4. (
5. "Hello, World!"
6. )
行分隔符
在 Go 程序中,一行代表一個(gè)語句結(jié)束。每個(gè)語句不需要像 C 家族中的其它語言一樣以分號(hào) ; 結(jié)尾,因?yàn)檫@些工作都將由 Go 編譯器自動(dòng)完成。
如果你打算將多個(gè)語句寫在同一行,它們則必須使用 ; 人為區(qū)分,但在實(shí)際開發(fā)中我們并不鼓勵(lì)這種做法。
標(biāo)識(shí)符
標(biāo)識(shí)符用來命名變量、類型等程序?qū)嶓w。一個(gè)標(biāo)識(shí)符實(shí)際上就是一個(gè)或是多個(gè)字母(AZ和az)數(shù)字(0~9)、下劃線_組成的序列,但是第一個(gè)字符必須是字母或下劃線而不能是數(shù)字。
//有效的標(biāo)識(shí)符
mahesh kumar abc move_name a_123
myname50 _temp j a23b9 retVal
//無效的標(biāo)識(shí)符
123asd //(以數(shù)字開頭)
case //(Go 語言的關(guān)鍵字)
a+b //(運(yùn)算符是不允許的)
關(guān)鍵字
下面列舉了 Go 代碼中會(huì)使用到的 25 個(gè)關(guān)鍵字或保留字
| 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 |
除了以上介紹的這些關(guān)鍵字,Go 語言還有 36 個(gè)預(yù)定義標(biāo)識(shí)符
| append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
|---|---|---|---|---|---|---|---|---|
| copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
| int32 | int64 | iota | len | make | new | nil | panic | uint64 |
| println | real | recover | string | true | uint | uint8 | uintptr |
程序一般由關(guān)鍵字、常量、變量、運(yùn)算符、類型和函數(shù)組成。
程序中可能會(huì)使用到這些分隔符:括號(hào) (),中括號(hào) [] 和大括號(hào) {}。
程序中可能會(huì)使用到這些標(biāo)點(diǎn)符號(hào):.、,、;、: 和 …
Go 語言的空格
Go 語言中變量的聲明必須使用空格隔開
var age int;
Go語言結(jié)構(gòu)小結(jié)
導(dǎo)入多包時(shí)
import "fmt"
import "io"
//也可以
import {
"fmt",
"io"
}
Go 程序的一般結(jié)構(gòu): basic_structure.go
//當(dāng)前程序包名
package main
//導(dǎo)入其他包
import "fmt"
//常量定義
const PI = 3.14
//全局變量聲明
var name = "duxian"
//一般類型聲明
type newType int
//結(jié)構(gòu)的聲明
type gopher struct()
//接口的聲明
type golang interface()
//由main函數(shù)作為程序入口點(diǎn)啟動(dòng)
func main(){
Println(name)
}
GO語言的數(shù)據(jù)類型
在Go編程語言中,數(shù)據(jù)類型用于聲明函數(shù)和變量。
數(shù)據(jù)類型的出現(xiàn)是為了把數(shù)據(jù)分成所需內(nèi)存大小不同的數(shù)據(jù),編程的時(shí)候需要用大數(shù)據(jù)的時(shí)候才需要申請(qǐng)大內(nèi)存,就可以充分利用內(nèi)存。
Go語言按類別有以下幾種數(shù)據(jù)類型
- 布爾型
布爾型的值只可以是常量 true 或者 false。一個(gè)簡單的例子:var b bool = true。 - 數(shù)字類型
整型 int 和浮點(diǎn)型 float32、float64,Go 語言支持整型和浮點(diǎn)型數(shù)字,并且原生支持復(fù)數(shù),其中位的運(yùn)算采用補(bǔ)碼。 - 字符竄類型
Go語言的字符串的字節(jié)使用UTF-8編碼標(biāo)識(shí)Unicode文本 - 派生類型
- 指針類型
- 數(shù)組類型
- 結(jié)構(gòu)化類型
- Channel類型
- 函數(shù)類型
- 切片類型
- 接口類型
- Map類型
數(shù)字類型
整數(shù)型
- uint8
無符號(hào) 8 位整型 (0 到 255) - uint16
無符號(hào) 16 位整型 (0 到 65535) - uint32
無符號(hào) 32 位整形 (0 到 4294967295) - uint64
無符號(hào) 64 位整型 (0 到 18446744073709551615) - int8
有符號(hào) 8 位整型 (-128 到 127) - int16
有符號(hào) 16 位整型 (-32768 到 32767) - int32
有符號(hào) 32 位整型 (-2147483648 到 2147483647) - int64
有符號(hào) 64 位整型 (-9223372036854775808 到 9223372036854775807)
浮點(diǎn)型
- float32
IEEE-754 32位浮點(diǎn)型數(shù) - float64
IEEE-754 64位浮點(diǎn)型數(shù) - complex64
32 位實(shí)數(shù)和虛數(shù) - complex128
64 位實(shí)數(shù)和虛數(shù)
其他數(shù)字類型
- byte
類似 uint8 - rune
類似 int32 - uint
32 或 64 位 - int
與 uint 一樣大小 - uintptr
無符號(hào)整型,用于存放一個(gè)指針
Go語言變量
變量來源于數(shù)學(xué),是計(jì)算機(jī)語言中能存儲(chǔ)計(jì)算結(jié)果或能表示值抽象概念。變量可以通過變量名訪問。
Go 語言變量名用字母,數(shù)字,下劃線組成。其中首字母不能使數(shù)字。
聲明變量的一般形式是使用var關(guān)鍵字
var identifier type
變量聲明
//第一種,指定變量類型,聲明后若不賦值,使用默認(rèn)值。
var v_name v_type
v_name = value
//第二種,根據(jù)值自行判定變量類型。
var v_name = value
//第三種,省略var, 注意 :=左側(cè)的變量不應(yīng)該是已經(jīng)聲明過的,否則會(huì)導(dǎo)致編譯錯(cuò)誤。
v_name := value
//// 例如
var a int = 10
var b = 10
c := 10
多變量聲明
//類型相同多個(gè)變量, 非全局變量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要顯示聲明類型,自動(dòng)推斷
vname1, vname2, vname3 := v1, v2, v3 //出現(xiàn)在:=左側(cè)的變量不應(yīng)該是已經(jīng)被聲明過的,否則會(huì)導(dǎo)致編譯錯(cuò)誤
// 這種因式分解關(guān)鍵字的寫法一般用于聲明全局變量
var (
vname1 v_type1
vname2 v_type2
)
值類型和引用類型
所有像 int、float、bool 和 string 這些基本類型都屬于值類型
簡短形式,使用 := 賦值操作符
全局變量是允許聲明但不使用,但是函數(shù)內(nèi)變量聲明后必須使用否則會(huì)得到錯(cuò)誤 “變量 declared and not used”