公眾號:暢游碼海 里面有更多精品原創(chuàng)文章~
為什么要學(xué)Go語言?
- 開發(fā)效率和運行效率二者的完美融合,天生的并發(fā)編程支持。
- 完善的標(biāo)準(zhǔn)庫包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。
- 部署起來非常的方便
- 擁有強大的編譯檢查、嚴(yán)格的編碼規(guī)范和完整的軟件生命周期工具
編譯程序
方式一:直接運行
go run xxxx.go
方式二:build方式
go build xxx.go
變量聲明
Go 語言的變量的聲明都是類型信息放在變量之后
/// 如下:
var v1 int
var v2 string
var v3 [10]int //數(shù)組
var v4 []int //數(shù)組切片
var v5 struct {
f int
}
var v6 * int
var v7 map[string] int // map 類型 key 為string value 為int類型
var v8 func(a int) int
// var 可以把var 關(guān)鍵詞使用花括號括起來 這樣可以不用重復(fù)寫var
var {
v1 int
v2 string
}
變量的初始化方式
var v1 int = 10
var v2 = 10 //可以自動推斷類型
v3 := 10 // 可以是這樣初始化一個變量
//缺點:不能提供數(shù)據(jù)類型、只能在函數(shù)內(nèi)部
三種類型聲明的變量都不應(yīng)該聲明過 否則會出現(xiàn)編譯錯誤
避免想修改全局變量結(jié)果不小心定義了一個新的局部變量。
變量賦值
// 新式的賦值方式
i , j = j , i //可以用來交換兩個變量
// 在接受函數(shù)的返回值的時候可以提供匿名變量
func GetName() (firstName, lastName, nickName string){
return "MAy" , "Chan" , "Chibi Maruko"
}
//此時如果只想獲得nickName的話可以
_, _, nickName := GetName
退化賦值
前提:最少有一個新變量被定義,且必須是同一作用域
func main(){
x := 100
···
x := 200 //不滿足至少一個新變量被定義,不會出現(xiàn)退化賦值
//x,y :=200, 300 //滿足條件,會出現(xiàn)退化賦值
{
//x,y := 200, 300 //不在同一作用域,不會出現(xiàn)退化賦值
}
}
通常err變量利用退化賦值,來實現(xiàn)重復(fù)使用
常量
Go 中常量類型可以是數(shù)值類型等
//使用const 可以用來定義常量
const pi float64 = 3.1415
cosnt zero = 0.0
const {
size int64 = 10
eof = -1
}
const u , v float32 = 0.3
const a, b , c = 3 , 4 , "foo"
cosnt mask = 1 << 3 // 這樣是可以的因為這在編譯期間是可以確定的
//預(yù)定義常量 true false iota
//iota是一個每次出現(xiàn)都會自增1 的值 其在每個const的開頭都被重置為0
cosnt {
c0 = iota //0
c1 = iota //1
c3 = iota //2
}
//或者
const{
c0 = iota //0
c1 //1
c3 //2
}
cosnt x = iota //0
const y = iota //0
布爾類型不能夠轉(zhuǎn)換為其它類型
兩種不同類型的整數(shù)是不能進行比較的
取反在C語言中是 ~x ,在go 中是 ^x
浮點數(shù)不是一種精確的表示方式所以不要直接比較可以使用函數(shù) IsEqual()
函數(shù)來比較
復(fù)數(shù)類型
var value complex64 // 實際是由float32構(gòu)成的復(fù)數(shù)類型
//三種賦值形式
value = 3.2 + 12i
value := 3.2 + 12i
value := complex(3.2, 12)
//可以使用real(value) 來獲取實部
//可以使用imag(value)獲取虛部
字符串類型
**字符串可以用來初始化 ,但是和數(shù)組不同 不可以再次改變否則會編譯錯誤,不過可以向數(shù)組一樣進行下表的字符取值 **
我們常常使用len函數(shù)來對字符串進行長度的獲取
Go語言支持UTF-8編碼 因此可以中英文混在一起,源文件注意保存為UTF-8形式
我們常常使用iconv庫來處理文本文檔
每個中文字符在UTF-8中占3個字節(jié)
//兩種遍歷方式
//以字符數(shù)組方式進行遍歷
str := "Hello,世界"
n := len(str)
for i := 0 , i < n , i++ {
ch := str[i]
}
//以Unicode方式遍歷
for i , ch := range str{
fmt.Println(i, ch)
}
引用類型
包含:silice、map、channel這三種預(yù)定義類型
引用類型除分配內(nèi)存外,還須初始化一系列屬性,諸如指針、長度、甚至包括哈希分布和數(shù)據(jù)隊列
new 函數(shù)可為引用類型分配內(nèi)存,但是這不是完整創(chuàng)建的。僅分配了數(shù)據(jù)類型本身(指針包裝)所需的內(nèi)存,并沒有分配鍵值存儲的內(nèi)存,也沒有初始化一些內(nèi)部屬性
類型轉(zhuǎn)換要求:顯式類型轉(zhuǎn)換
自定義類型
使用關(guān)鍵字type定義用戶自定義類型,包括基于現(xiàn)有基礎(chǔ)類型創(chuàng)建,或者是結(jié)構(gòu)體、函數(shù)類型等
注意:即便指定了基礎(chǔ)類型,也只表面它們有相同的底層數(shù)據(jù)結(jié)構(gòu),兩者間不存在任何關(guān)系,屬于完全不同的兩種類型。除操作符外,自定義類型不會繼承基礎(chǔ)類型的其他信息(包括方法)。不能視為別名,不能隱式轉(zhuǎn)換,不能直接用于比較表達式
type flags byte
const {
read flags = 1 << itoa
write
exec
}
func main() {
f := read | exec
fmt.Printf("%b\n",f) //輸出二進制標(biāo)記位
}
未完待續(xù)...