天天看點

Go基礎文法(一)

Go基礎文法(一)

image.png

先講一下,寫這種筆記的目的:

  1. 自己在學的過程中能一字一句讀下來并且寫出來,便于了解加深記憶,這樣做比隻看教程記憶會更加深刻。
  2. 當我某些細的點遺忘的時候我可以快速查詢,因為筆記是我自己寫的我知道知識點寫在哪部分。
  3. 可以分享出來給其他熱愛go的入門者或者在上學的同學看,因為這邊記錄的是把官方内容精簡了些。

什麼是Golang

Go 亦稱為 Golang(譯注:按照 Rob Pike 說法,語言叫做 Go,Golang 隻是官方網站的網址),是由谷歌開發的一個開源的編譯型的靜态語言。

Golang 的主要關注點是使得高可用性和可擴充性的 Web 應用的開發變得簡便容易。(譯注:Go 的定位是系統程式設計語言,隻是對 Web 開發支援較好)

Go 語言一些優點:

  • 并發是語言的一部分(并非通過标準庫實作),是以編寫多線程程式會是一件很容易的事。後續教程将會讨論到,并發是通過 Goroutines 和 channels 機制實作的。
  • Golang 是一種編譯型語言。源代碼會編譯為二進制機器碼。而在解釋型語言中沒有這個過程,如 Nodejs 中的 Python。
  • 語言規範十分簡潔。所有規範都在一個頁面展示,你甚至都可以用它來編寫你自己的編譯器呢。
  • Go 編譯器支援靜态連結。所有 Go 代碼都可以靜态連結為一個大的二進制檔案(譯注:相對現在的磁盤空間,其實根本不大),并可以輕松部署到雲伺服器,而不必擔心各種依賴性。

安裝

Mac OS

官網下載下傳

https://golang.org/dl/

安裝程式。輕按兩下開始安裝,會将 Golang 安裝到

/usr/local/go

目錄下,同時

/usr/local/go/bin

檔案夾也會被添加到

PATH

環境變量中。

(這裡隻介紹Mac OS下的安裝,其他平台請自行查閱)

建立工作區

在 Mac 或 Linux 作業系統下,Go 工作區應該設定在

$HOME/go

。是以我們要在

$HOME

目錄下建立 go 目錄。

也可以通過設定 GOPATH ,用其他目錄來作為工作區。我這邊使用的ide是這個

Go基礎文法(一)

設定GOPATH的方式:

Go基礎文法(一)

所有 Go 源檔案都應該放置在工作區裡的 src 目錄下。請在剛添加的 go 目錄下面建立目錄 src。

所有 Go 項目都應該依次在 src 裡面設定自己的子目錄。我們在 src 裡面建立一個目錄 hello 來放置整個 hello 項目。

建立上述目錄之後,其目錄結構如下:

go
   src
      hello
          hello.go
           

hello.go中寫入代碼:

package main

import "fmt"

func main() {  
    fmt.Println("Hello World")
}

           
  1. 使用指令go run hello.go名運作:
    Go基礎文法(一)
  2. 使用 go install hello 指令

    當你輸入 go install hello 時,go 工具會在工作區中搜尋 hello 包。接下來它會在工作區的 bin 目錄下,建立一個名為 hello(Windows 下名為 hello.exe)的二進制檔案。運作 go install hello 後,其目錄結構如下所示:

go
  bin
    hello
  src
    hello
      hello.go
           

代碼中第一行:

package main ,每一個 Go 檔案都應該在開頭進行 package name 的聲明(譯注:隻有可執行程式的包名應當為 main)。包(Packages)用于代碼的封裝與重用,這裡的包名稱是main。

變量

變量:變量指定了某存儲單元(Memory Location)的名稱,該存儲單元會存儲特定類型的值。在 Go 中,有多種文法用于聲明變量。

package main

import (
    "fmt"
    "math"
)

func main() {
    var age int // 變量聲明
    fmt.Println("my age is", age)

    age = 10   //變量指派
    fmt.Println("my age is", age)

    age = 30  //變量指派
    fmt.Println("my age is", age)

    var name string = "allen" // 聲明變量并初始化
    fmt.Println("my name is", name)

    var num = 29 // 可以推斷類型
    fmt.Println("my num is", num)

    var width, height int = 100, 50 // 聲明多個變量
    fmt.Println("width is", width, "height is", height)

    var a, b int //省略初始化,預設值為0
    fmt.Println("width is", a, "height is", b)

    //一個語句中聲名不同類型變量
    var (
        c  = "jie"
        d    = 24
        e int
    )
    fmt.Println("my c is", c, ", d is", d, "and e is", e)

    m, n := "allen", 29 // 簡短聲明
    fmt.Println("m name is", m, "n is", n)

    //變量也可以在運作時進行指派
    q, p := 145.8, 543.8
    e1 := math.Min(q, p)
    fmt.Println("minimum value is ", e1)

}
           
  1. 聲明單個變量 :var name type
  2. 聲明變量并初始化 : var name type = initialvalue
  3. 類型推斷(Type Inference) : 如果變量有初始值,那麼 Go 能夠自動推斷具有初始值的變量的類型。是以,如果變量有初始值,就可以在變量聲明中省略 type。例:var name = initialvalue
  4. 聲明多個變量 : var name1, name2 type = initialvalue1, initialvalue2。
  5. 一個語句中聲明不同類型的變量 :

    var (

    name1 = initialvalue1,

    name2 = initialvalue2

    )

  6. 簡短聲明 : name := initialvalue,

    簡短聲明要求 := 操作符左邊的所有變量都有初始值。

    簡短聲明的文法要求 := 操作符的左邊至少有一個變量是尚未聲明的。

  7. 由于 Go 是強類型(Strongly Typed)語言,是以不允許某一類型的變量指派為其他類型的值。

類型

基本類型:

  • bool
  • 數字類型

    int8, int16, int32, int64, int

    uint8, uint16, uint32, uint64, uint

    float32, float64

    complex64, complex128

    byte

    rune

  • string

有符号整型:

Go基礎文法(一)

int:根據不同的底層平台(Underlying Platform),表示 32 或 64 位整型。除非對整型的大小有特定的需求,否則你通常應該使用 int 表示整型。

在 Printf 方法中,使用

%T

列印變量類型。

Go 的

unsafe

包提供了一個

Sizeof

函數,該函數接收變量并傳回它的位元組大小。

func main()  {
    a := true
    b := false
    fmt.Println("a:", a, "b:", b)
    c := a && b //僅當 a 和 b 都為 true 時,操作符 && 才傳回 true
    fmt.Println("c:", c)
    d := a || b //當 a 或者 b 為 true 時,操作符 || 傳回 true
    fmt.Println("d:", d)


    var a1 int = 89
    b1 := 95
    fmt.Println("a1 is", a1, "and b is", b1)
    fmt.Printf("type of a is %T, size of a is %d", a1, unsafe.Sizeof(a1)) // a 的類型和大小
    fmt.Printf("\ntype of b is %T, size of b is %d", b1, unsafe.Sizeof(b1)) // b 的類型和大小
}
           

在32位系統下,位元組大小為4,64位下,位元組大小為8。

無符号整型

Go基礎文法(一)

uint:根據不同的底層平台,表示 32 或 64 位無符号整型。

浮點型

float32:32 位浮點數

float64:64 位浮點數

package main

import (  
    "fmt"
)

func main() {
    a, b := 5.67, 8.97 //a 和 b 的類型根據指派推斷得出,float64 是浮點數的預設類型
    fmt.Printf("type of a %T b %T\n", a, b)
    sum := a + b
    diff := a - b
    fmt.Println("sum", sum, "diff", diff)

    no1, no2 := 56, 89
    fmt.Println("sum", no1+no2, "diff", no1-no2)
}
           

a 和 b 的類型根據指派推斷得出,float64 是浮點數的預設類型。

複數類型

complex64:實部和虛部都是 float32 類型的的複數。

complex128:實部和虛部都是 float64 類型的的複數。

其他數字類型

byte 是 uint8 的别名。

rune 是 int32 的别名。

string 類型

在 Golang 中,字元串是位元組的集合。如果你現在還不了解這個定義,也沒有關系。我們可以暫且認為一個字元串就是由很多字元組成的。後面會在一個教程中深入學習字元串。

package main

import (  
    "fmt"
)

func main() {  
    first := "Zhao"
    last := "Alle"
    name := first +" "+ last
    fmt.Println("My name is",name)
}
           

類型轉換

Go 有着非常嚴格的強類型特征。Go 沒有自動類型提升或類型轉換。

package main

import (  
    "fmt"
)

func main() {
    i := 55      //int
    j := 67.8    //float64
    sum := i + int(j) //j is converted to int
    fmt.Println(sum)

    q := 10
    var w float64 = float64(q) // 若沒有顯式轉換,該語句會報錯
    fmt.Println("w", w)
}
           

把 v 轉換為 T 類型的文法是 T(v)。

指派的情況也是如此。把一個變量指派給另一個不同類型的變量,需要顯式的類型轉換。

常量

定義:在 Go 語言中,術語"常量"用于表示固定的值。

使用關鍵字

const

表示常量。

package main

func main() {  
    const a = 55 // 允許
    a = 89       // 不允許重新指派
}
           
  1. 常量不能再重新指派為其他的值。是以上面的代碼将不能正常工作,它将出現一個編譯錯誤: cannot assign to a
  2. 常量的值會在編譯的時候确定。因為函數調用發生在運作時,是以不能将函數的傳回值指派給常量。

字元串常量

const a = "Hello World"

上面的例子,我們把 Hello World 配置設定給常量 a。現在常量 a 是沒有類型的。

無類型的常量有一個與它們相關聯的預設類型(上邊預設類型是string),并且當且僅當一行代碼需要時才提供它。在聲明中 var b = "Sam" , b 需要一個類型,它從字元串常量 Sam 的預設類型中擷取。

建立一個帶類型的常量:

const c string = "Hello World"

常量c就是一個string類型的。

Go 是一個強類型的語言,在配置設定過程中混合類型是不允許的。

布爾常量

布爾常量和字元串常量用法相同,他們是兩個無類型的常量 true 和 false。

package main

func main() {  
    const trueConst = true
    type myBool bool
    var defaultBool = trueConst // 允許
    var customBool myBool = trueConst // 允許
    defaultBool = customBool // 不允許
}
           

數字常量

包含整數、浮點數和複數的常量

func main() {
    const a = 5
    var intVar int = a
    var int32Var int32 = a
    var float64Var float64 = a
    var complex64Var complex64 = a
    fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}
           

常量a 的值是 5 ,a 的文法是通用的(它可以代表一個浮點數、整數甚至是一個沒有虛部的複數),是以可以将其配置設定給任何相容的類型。這些常量的預設類型可以被認為是根據上下文在運作中生成的。 var intVar int = a 要求 a 是 int,是以它變成一個 int 常量。 var complex64Var complex64 = a 要求 a 是 complex64,是以它變成一個複數類型。

數字表達式

func main() {  
    var a = 5.9/8
    fmt.Printf("a's type %T value %v",a, a)
}
           

在上面的程式中, 5.9 在文法中是浮點型,8 是整型,5.9/8 是允許的,因為兩個都是數字常量。除法的結果是 0.7375 是一個浮點型,是以 a 的類型是浮點型。

如果内容對你有幫助,記得關注作者給個贊哦~,後續會持續更新。