Go語言入門系列一

公眾號:暢游碼海 里面有更多精品原創(chuàng)文章~

為什么要學(xué)Go語言?

  1. 開發(fā)效率和運行效率二者的完美融合,天生的并發(fā)編程支持。
  2. 完善的標(biāo)準(zhǔn)庫包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。
  3. 部署起來非常的方便
  4. 擁有強大的編譯檢查、嚴(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ù)...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容