這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在程式設計語言中,詞法是代碼的構成法則。也就是說,詞法規定了我們敲入怎樣的字元才能編寫出編譯器 能夠識別的代碼,所以要掌握一門語言,那麼語言的詞法是我們要學習的第一步,Go語言也不過如此。
Go語言的代碼是由若干Unicode字元組成,Unicode編碼規範是一種在電腦上使用的字元編碼 方式,它為世界上存在的各種語言的每個字元都設定了統一且唯一的二進位編碼。因此,它能夠滿足跨語言、 跨平台的轉換和文本處理需求,關於Unicode更詳細說明,參見官網聽Unicode。 當前,你只需要記住一條規則:
Go語言的原始碼是由Unicode編碼規範的UTF-8格式進行編碼的。
-聽行注釋:聽用兩斜杠"//"開始到這一行結束-聽塊注釋:聽從"/*"聽開始到聽"*/"結束
Go語言的詞法元素包括4類:
標誌符 (identifier)
關鍵字 (keyword)
運算子 (operator)和分隔字元 (delimiter)
字面量 (literal)
一般情況下,空格符、定位字元、斷行符號符和分行符號都會被忽略,除非它們作為多個語言符號之間的分隔字元的一部分。 另外,Go語言會自動為代碼插入分號以進行語句分隔,所以不在特殊情況下不需要顯示的插入分號;
標誌符
標誌符就是對變數、常量、函數以及自訂類型進行命名。Go語言標誌符的命名規範是由若干字母、底線"_"和數字組成的字元序列,字元序列的第一個字元必須為字母,且首字母 標誌符是區分大小寫。在使用標誌符之前必須進行聲明,一個聲明就是將一個非空的標誌符與常量、類型、變數、函數或程式碼封裝綁定在一起。在 同一個代碼區塊中,不允許重複聲明同一個標誌符,並且該標誌符的範圍與所屬代碼區塊的範圍相同。
Go語言中有一類特殊的標誌符,被叫做預定義標誌符。這類標誌符是在Go語言的原始碼中被聲明的,具體聲明如下:
基礎資料型別 (Elementary Data Type)名:聽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語言開發過程中,會經常訪問其他程式碼封裝中的變數或類型,這時就需要用到限定標誌符。 可以把程式碼封裝名稱稱作是限定標誌符首碼,首碼和包中的標誌符之間用英文的點(".")符號分隔。 要應用其它程式碼封裝中的標誌符時,需要滿足兩個前提:
程式碼封裝必須被提前置入到該代碼檔案中
該標誌符在程式碼封裝必須是可被匯出的
怎麼才算是標誌符可被匯出的呢?
標誌符名稱中的第一個字元必須大寫
標誌符必須是被聲明在一個程式碼封裝中的變數、類型、結構體類型的欄位名、函數或方法名稱等。
因為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聽限定標誌符}
注意:聽程式碼封裝標誌符並不屬於任何一個範圍,程式碼封裝聲明只是為了區分若干原始碼檔案是否屬於同一個程式碼封裝。或者指定匯入程式碼封裝時代表該程式碼封裝的引用名稱。
命名建議:
盡量使用短命名,長名字並非你想象的那麼更易讀,多加文檔和注釋比格外長的名字更實用
混合大小寫,且使用駝峰拼字格式,注意首字母的大小寫願意
保持package的名字和目錄保持一致,盡量採取簡短有意義的包名,不要和標準庫名稱衝突,包名應該為小寫單詞,不要使用底線或者混合大小寫
函數參數和傳回值以小寫字母開頭
不要使用保留關鍵字作為標誌符
不建議使用與預定義常量、類型、內建函數相同的名字作為標誌符
專有名字通常全部大寫
字面量
在電腦科學中,字面量是用於表達原始碼中一個固定基本值的標記法(notation)。幾乎所有電腦編程 語言都具有對基本值的字面量表示,比如:整數、浮點數、字串、字元和布爾類型的數值都有對應的 字面量表示; 比如:數字15這個值是唯一的,但表示的方式有很多種:
二進位表達:1111八進位表達:017十進位表達:15十六進位表達:0xF
對於開發人員來說,當然知道要表達的意思,但是要把這種思想傳達給編譯器, 因為編譯器對原始碼做詞法分析時會自動判決目前使用者的輸入屬於哪一類字面量;
go語言的字面量與變數類型應關係:
| 字面量種類 |
變數的類型 |
舉例 |
| 布爾 |
bool |
true/false |
| 字元 |
rune |
包含在單引號''之中的字元 |
| 整型 |
int |
15, 017與0xF |
| 浮點 |
float64 |
0.,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
字面量的通俗理解:編譯器根據使用者的輸入,推論出輸入的資料屬於什麼資料類型。
本文出自 “博學於文,約之於禮” 部落格,轉載請與作者聯絡!