Go內(nèi)置關(guān)鍵字(25個(gè)均為小寫)
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注釋方法
// :?jiǎn)涡凶⑨?/* */:多行注釋
Go程序的一般結(jié)構(gòu):見代碼
Go程序是通過 package 來組織的(與python類似)
只有 package 名稱為 main 的包可以包含 main 函數(shù)
一個(gè)可執(zhí)行程序 有且僅有 一個(gè) main 包
通過 import 關(guān)鍵字來導(dǎo)入其它非 main 包
通過 const 關(guān)鍵字來進(jìn)行常量的定義
通過在函數(shù)體外部使用 var 關(guān)鍵字來進(jìn)行全局變量的聲明與賦值
通過 type 關(guān)鍵字來進(jìn)行結(jié)構(gòu)(struct)或接口(interface)的聲明
通過 func 關(guān)鍵字來進(jìn)行函數(shù)的聲明




代碼示例
//當(dāng)前程序的包名
package main
//導(dǎo)入其它的包
import (
std "fmt"
)
//常量的定義
const (
PI = 3.14
)
//全局變量的聲明和賦值
var (
name = "song"
)
//一般類型的聲明
type newType int
//結(jié)構(gòu)的聲明
type song struct{}
//接口的聲明
type steven interface{}
//由main 函數(shù)作為程序入口點(diǎn)啟動(dòng)
func main() {
std.Println("hello word")
}
Go基本類型
布爾型:bool
- 長(zhǎng)度:1字節(jié)
- 取值范圍:true, false
- 注意事項(xiàng):不可以用數(shù)字代表true或false
整型:int/uint
- 根據(jù)運(yùn)行平臺(tái)可能為32或64位
8位整型:int8/uint8
- 長(zhǎng)度:1字節(jié)
- 取值范圍:-128~127/0~255
字節(jié)型:byte(uint8別名)
16位整型:int16/uint16
- 長(zhǎng)度:2字節(jié)
- 取值范圍:-32768~32767/0~65535
32位整型:int32(rune)/uint32
- 長(zhǎng)度:4字節(jié)
- 取值范圍:-2^32/2~2^32/2-1/0~2^32-1
64位整型:int64/uint64
- 長(zhǎng)度:8字節(jié)
- 取值范圍:-2^64/2~2^64/2-1/0~2^64-1
浮點(diǎn)型:float32/float64
- 長(zhǎng)度:4/8字節(jié)
- 小數(shù)位:精確到7/15小數(shù)位
復(fù)數(shù):complex64/complex128
- 長(zhǎng)度:8/16字節(jié)
足夠保存指針的 32 位或 64 位整數(shù)型:uintptr
其它值類型:
- array、struct、string
引用類型:
- slice、map、chan
接口類型:inteface
函數(shù)類型:func
類型零值
零值并不等于空值,而是當(dāng)變量被聲明為某種類型后的默認(rèn)值,通常情況下值類型的默認(rèn)值為0,bool為false,string為空字符串

單個(gè)變量的聲明與賦值
:=是聲明并賦值,并且系統(tǒng)自動(dòng)推斷類型,不需要var關(guān)鍵字
- 變量的聲明格式:var <變量名稱> <變量類型>
- 變量的賦值格式:<變量名稱> = <表達(dá)式>
- 聲明的同時(shí)賦值:var <變量名稱> [變量類型] = <表達(dá)式>

多個(gè)變量的聲明與賦值
- 全局變量的聲明可使用 var() 的方式進(jìn)行簡(jiǎn)寫
- 全局變量的聲明不可以省略 var,但可使用并行方式
- 所有變量都可以使用類型推斷
- 局部變量不可以使用 var() 的方式簡(jiǎn)寫,只能使用并行方式

變量的類型轉(zhuǎn)換
Go中不存在隱式轉(zhuǎn)換,所有類型轉(zhuǎn)換必須顯式聲明
轉(zhuǎn)換只能發(fā)生在兩種相互兼容的類型之間
類型轉(zhuǎn)換的格式:
<ValueA> [:]= <TypeOfValueA>(<ValueB>)

常量的初始化規(guī)則與枚舉
-在定義常量組時(shí),如果不提供初始值,則表示將使用上行的表達(dá)式
-使用相同的表達(dá)式不代表具有相同的值
-iota是常量的計(jì)數(shù)器,從0開始,組中每定義1個(gè)常量自動(dòng)遞增1
-通過初始化規(guī)則與iota可以達(dá)到枚舉的效果
-每遇到一個(gè)const關(guān)鍵字,iota就會(huì)重置為0

運(yùn)算符
Go中的運(yùn)算符均是從左至右結(jié)合
優(yōu)先級(jí)(從高到低)
^ () ! (取反 ) (一元運(yùn)算符)
* (乘) / (除) % (取余) <<(二進(jìn)制左移) >> (二進(jìn)制右移) & &^
+ - | ^ (二元運(yùn)算符)
== != < <= >= >
<- (專門用于channel)
&&
||
示例
/*
6:0110
11:1011
----------
& 與 0010 (兩個(gè)是1才是1,其它是0)
| 或 1111 (有一個(gè)是1就是1)
^ 1101 (兩個(gè)當(dāng)中只能有一個(gè)為1)
&^ 0100 (第二個(gè)運(yùn)算值是1的話,第一個(gè)強(qiáng)制為0,結(jié)果為0)
*/
func main() {
fmt.Println(6 & 11)
fmt.Println(6 | 11)
fmt.Println(6 ^ 11)
fmt.Println(6 &^ 11)
}
計(jì)算機(jī)存儲(chǔ)單位
package main
import (
"fmt"
)
const (
_ = iota
KB float64 = 1 << (iota * 10)
MB
GB
TB
PB
EB
ZB
YB
)
func main() {
fmt.Println(KB)
fmt.Println(MB)
fmt.Println(GB)
fmt.Println(TB)
fmt.Println(PB)
fmt.Println(EB)
fmt.Println(ZB)
fmt.Println(YB)
}

指針
Go雖然保留了指針,但與其它編程語言不同的是,在Go當(dāng)中不支持指針運(yùn)算以及”->”運(yùn)算符,
而直接采用”.”選擇符來操作指針目標(biāo)對(duì)象的成員操作符”&”取變量地址,
使用”*”通過指針間接訪問目標(biāo)對(duì)象默認(rèn)值為 nil 而非 NULL
package main
import (
"fmt"
)
func main() {
a := 1
var b *int = &a
fmt.Println(b)//指向b的內(nèi)存地址
fmt.Println(*b)//最出b的值
}

遞增遞減語句
在Go當(dāng)中,++ 與 -- 是作為語句而并不是作為表達(dá)式 如:a++ 不能放在 = 的右側(cè),只能單獨(dú)用
判斷語句if
條件表達(dá)式?jīng)]有括號(hào)
支持一個(gè)初始化表達(dá)式(可以是并行方式)
左大括號(hào)必須和條件語句或else在同一行
支持單行模式
初始化語句中的變量為block級(jí)別,同時(shí)隱藏外部同名變量
1.0.3版本中的編譯器BUG

package main
import (
"fmt"
)
func main() {
a := 10
if a, b := 1, 5; a > 0 {
fmt.Println(a)
fmt.Println(b)
}
fmt.Println(a)
}
循環(huán)語句for
Go只有for一個(gè)循環(huán)語句關(guān)鍵字,但支持3種形式
初始化和步進(jìn)表達(dá)式可以是多個(gè)值
條件語句每次循環(huán)都會(huì)被重新檢查,因此不建議在條件語句中
使用函數(shù),盡量提前計(jì)算好條件并以變量或常量代替
左大括號(hào)必須和條件語句在同一行

選擇語句switch
可以使用任何類型或表達(dá)式作為條件語句
不需要寫break,一旦條件符合自動(dòng)終止
如希望繼續(xù)執(zhí)行下一個(gè)case,需使用fallthrough語句
支持一個(gè)初始化表達(dá)式(可以是并行方式),右側(cè)需跟分號(hào)
左大括號(hào)必須和條件語句在同一行

跳轉(zhuǎn)語句goto, break, continue
三個(gè)語法都可以配合標(biāo)簽使用
標(biāo)簽名區(qū)分大小寫,若不使用會(huì)造成編譯錯(cuò)誤
Break與continue配合標(biāo)簽可用于多層循環(huán)的跳出
Goto是調(diào)整執(zhí)行位置,與其它2個(gè)語句配合標(biāo)簽的結(jié)果并不相同

數(shù)組Array
定義數(shù)組的格式:var <varName> [n]<type>,n>=0
數(shù)組長(zhǎng)度也是類型的一部分,因此具有不同長(zhǎng)度的數(shù)組為不同類型
注意區(qū)分指向數(shù)組的指針和指針數(shù)組
數(shù)組在Go中為值類型
數(shù)組之間可以使用==或!=進(jìn)行比較,但不可以使用<或>
可以使用new來創(chuàng)建數(shù)組,此方法返回一個(gè)指向數(shù)組的指針
Go支持多維數(shù)組
Go語言版冒泡排序
定義數(shù)組的格式:var <varName> [n]<type>,n>=0
數(shù)組長(zhǎng)度也是類型的一部分,因此具有不同長(zhǎng)度的數(shù)組為不同類型
注意區(qū)分指向數(shù)組的指針和指針數(shù)組
數(shù)組在Go中為值類型
數(shù)組之間可以使用==或!=進(jìn)行比較,但不可以使用<或>
可以使用new來創(chuàng)建數(shù)組,此方法返回一個(gè)指向數(shù)組的指針
Go支持多維數(shù)組
Go語言版冒泡排序
package main
import (
"fmt"
)
func main() {
a := [...]int{4, 2, 6, 8, 1, 9, 10}
num := len(a)
for i := 0; i < num; i++ {
for j := i + 1; j < num; j++ {
if a[i] < a[j] {
temp := a[i]
a[i] = a[j]
a[j] = temp
}
}
}
fmt.Println(a)
}
