您好,登錄后才能下訂單哦!
在編程語言中,詞法是代碼的構成法則。也就是說,詞法規定了我們敲入怎樣的字符才能編寫出編譯器 能夠識別的代碼,所以要掌握一門語言,那么語言的詞法是我們要學習的第一步,Go語言也不過如此。
源代碼表示
Go語言的代碼是由若干Unicode字符組成,Unicode編碼規范是一種在計算機上使用的字符編碼 方式,它為世界上存在的各種語言的每個字符都設定了統一且唯一的二進制編碼。因此,它能夠滿足跨語言、 跨平臺的轉換和文本處理需求,關于Unicode更詳細說明,參見官網 Unicode。 當前,你只需要記住一條規則:
Go語言的源代碼是由Unicode編碼規范的UTF-8格式進行編碼的。
注釋
- 行注釋: 用兩斜杠"http://"開始到這一行結束 - 塊注釋: 從"/*" 開始到 "*/"結束
Go語言的詞法元素包括4類:
標志符 (identifier)
關鍵字 (keyword)
運算符 (operator)和分隔符 (delimiter)
字面量 (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語言開發過程中,會經常訪問其他代碼包中的變量或類型,這時就需要用到限定標志符。 可以把代碼包名稱稱作是限定標志符前綴,前綴和包中的標志符之間用英文的點(".")符號分隔。 要應用其它代碼包中的標志符時,需要滿足兩個前提:
代碼包必須被提前導入到該代碼文件中
該標志符在代碼包必須是可被導出的
怎么才算是標志符可被導出的呢?
標志符名稱中的第一個字符必須大寫
標志符必須是被聲明在一個代碼包中的變量、類型、結構體類型的字段名、函數或方法名稱等。
因為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
字面量的通俗理解:編譯器根據用戶的輸入,推論出輸入的數據屬于什么數據類型。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。