golang 基本詞法

在編程語言中,詞法是代碼的構成法則。也就是說,詞法規定了我們敲入怎樣的字符才能編寫出編譯器 能夠識別的代碼,所以要掌握一門語言,那麼語言的詞法是我們要學習的第一步,Go語言也不過如此。

  • 源代碼表示

Go語言的代碼是由若干Unicode字符組成,Unicode編碼規範是一種在計算機上使用的字符編碼 方式,它爲世界上存在的各種語言的每個字符都設定了統一且唯一的二進制編碼。因此,它能夠滿足跨語言、 跨平臺的轉換和文本處理需求,關於Unicode更詳細說明,參見官網 Unicode。 當前,你只需要記住一條規則:

Go語言的源代碼是由Unicode編碼規範的UTF-8格式進行編碼的。
  • 註釋

- 行註釋: 用兩斜槓"//"開始到這一行結束
- 塊註釋: 從"/*" 開始到 "*/"結束

Go語言的詞法元素包括4類:

  1. 標誌符 (identifier)

  2. 關鍵字 (keyword)

  3. 運算符 (operator)和分隔符 (delimiter)

  4. 字面量 (literal)

一般情況下,空格符、製表符、回車符和換行符都會被忽略,除非它們作爲多個語言符號之間的分隔符的一部分。 另外,Go語言會自動爲代碼插入分號以進行語句分隔,所以不在特殊情況下不需要顯示的插入分號;

標誌符

標誌符就是對變量、常量、函數以及自定義類型進行命名。Go語言標誌符的命名規範是由若干字母、下劃線"_"和數字組成的字符序列,字符序列的第一個字符必須爲字母,且首字母 標誌符是區分大小寫的。在使用標誌符之前必須進行聲明,一個聲明就是將一個非空的標誌符與常量、類型、變量、函數或代碼包綁定在一起。在 同一個代碼區塊中,不允許重複聲明同一個標誌符,並且該標誌符的作用域與所屬代碼區塊的範圍相同。

  • 預定義標誌符

Go語言中有一類特殊的標誌符,被叫做預定義標誌符。這類標誌符是在Go語言的源代碼中被聲明的,具體聲明如下:

基本數據類型名: int、float、string...
接口類型名:error
常量名:true,false和iota
內建函數名:append,cap,close,complex,copy,delete,imag,len,make,new,panic,print,println,real,recover
  • 空標誌符

Go語言有一個名爲 "_" 的特殊標誌符,叫(blank identifier)。通常作爲忽略佔位符使用,可以作表達式左值,但無法讀取內容。 空標誌符也常用來臨時規避對未使用變量和導入包的錯誤檢查,但需注意的是,它也屬於預定義標誌符。

  • 限定標誌符

在Go語言開發過程中,會經常訪問其他代碼包中的變量或類型,這時就需要用到限定標誌符。 可以把代碼包名稱稱作是限定標誌符前綴,前綴和包中的標誌符之間用英文的點(".")符號分隔。 要應用其它代碼包中的標誌符時,需要滿足兩個前提:

  1. 代碼包必須被提前導入到該代碼文件中

  2. 該標誌符在代碼包必須是可被導出的

怎麼纔算是標誌符可被導出的呢?

  1. 標誌符名稱中的第一個字符必須大寫

  2. 標誌符必須是被聲明在一個代碼包中的變量、類型、結構體類型的字段名、函數或方法名稱等。

因爲Go語言根據標誌符名稱中的第一個字母的大小寫來確定該標誌符的訪問權限;具體規則是當標誌符名稱的第一個字符爲小寫時, 其訪問權限就是"包級私有的",只有與該標誌符在一個代碼包的代碼才能訪問到它。 當標誌符名稱的第一個字符爲大寫時,其訪問權限爲"公開的", 意味着該標誌符可以被任何代碼包的任何代碼通過限定標誌符訪問。

用一個例子來總結上面的內容!

package main    //main 包名標誌符import (        //import 導入其它代碼包
    "fmt"       //fmt 標準代碼包名標誌符
    "strconv"   // strconv 標準代碼包名標誌符)func main() {   //main 函數名標誌符
    var s string = "10010"    //string 預定義標誌符
    v, _ := strconv.Atoi(s) //v自定義標誌符,_空白標誌符
    fmt.Printf("%T, %v", v, v) //fmt.Printf 限定標誌符}
注意: 代碼包標誌符並不屬於任何一個作用域,代碼包聲明只是爲了區分若干源代碼文件
是否屬於同一個代碼包。或者指定導入代碼包時代表該代碼包的引用名稱。

命名建議:

  1. 儘量使用短命名,長名字並非你想象的那麼更易讀,多加文檔和註釋比格外長的名字更實用

  2. 混合大小寫,且使用駝峯拼寫格式,注意首字母的大小寫願意

  3. 保持package的名字和目錄保持一致,儘量採取簡短有意義的包名,不要和標準庫名稱衝突,包名應該爲小寫單詞,不要使用下劃線或者混合大小寫

  4. 函數參數和返回值以小寫字母開頭

  5. 不要使用保留關鍵字作爲標誌符

  6. 不建議使用與預定義常量、類型、內置函數相同的名字作爲標誌符

  7. 專有名字通常全部大寫

字面量

在計算機科學中,字面量是用於表達源代碼中一個固定基本值的表示法(notation)。幾乎所有計算機編程 語言都具有對基本值的字面量表示,比如:整數、浮點數、字符串、字符和布爾類型的數值都有對應的 字面量表示; 比如:數字15這個值是唯一的,但表示的方式有很多種:

二進制表達:1111
八進制表達:017
十進制表達:15
十六進制表達:0xF

對於開發者來說,當然知道要表達的意思,但是要把這種思想傳達給編譯器, 因爲編譯器對源代碼做詞法分析時會自動判決當前用戶的輸入屬於哪一類字面量;

go語言的字面量與變量類型應關係:

字面量種類變量的類型舉例
布爾booltrue/false
字符rune包含在單引號''之中的字符
整型int15, 017與0xF
浮點float640.,1.1,1.e+0.1E6,.25,.25e+5
複數complex128
字符串string包含在雙引號 ""或反引號 ``之中

舉例說明一下:

package mainimport (    "fmt"
    "reflect")func main() {
    i := 0xf
    f := .25
    c := 'c'
    s := `go`
    cx := 011i

    fmt.Println(reflect.ValueOf(i), reflect.TypeOf(i))
    fmt.Println(reflect.ValueOf(f), reflect.TypeOf(f))
    fmt.Println(reflect.ValueOf(c), reflect.TypeOf(c))
    fmt.Println(reflect.ValueOf(s), reflect.TypeOf(s))
  fmt.Println(reflect.ValueOf(cx), reflect.TypeOf(cx))
}
輸出:15 int0.25 float6499 int32go string(0+11i) complex128

字面量的通俗理解:編譯器根據用戶的輸入,推論出輸入的數據屬於什麼數據類型。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章