溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

golang 基本詞法

發(fā)布時(shí)間:2020-08-03 16:12:36 來源:網(wǎng)絡(luò) 閱讀:814 作者:100018 欄目:編程語言

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

  • 源代碼表示

Go語言的代碼是由若干Unicode字符組成,Unicode編碼規(guī)范是一種在計(jì)算機(jī)上使用的字符編碼 方式,它為世界上存在的各種語言的每個(gè)字符都設(shè)定了統(tǒng)一且唯一的二進(jìn)制編碼。因此,它能夠滿足跨語言、 跨平臺的轉(zhuǎn)換和文本處理需求,關(guān)于Unicode更詳細(xì)說明,參見官網(wǎng) Unicode。 當(dāng)前,你只需要記住一條規(guī)則:

Go語言的源代碼是由Unicode編碼規(guī)范的UTF-8格式進(jìn)行編碼的。
  • 注釋

- 行注釋: 用兩斜杠"http://"開始到這一行結(jié)束
- 塊注釋: 從"/*" 開始到 "*/"結(jié)束

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

  1. 標(biāo)志符 (identifier)

  2. 關(guān)鍵字 (keyword)

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

  4. 字面量 (literal)

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

標(biāo)志符

標(biāo)志符就是對變量、常量、函數(shù)以及自定義類型進(jìn)行命名。Go語言標(biāo)志符的命名規(guī)范是由若干字母、下劃線"_"和數(shù)字組成的字符序列,字符序列的第一個(gè)字符必須為字母,且首字母 標(biāo)志符是區(qū)分大小寫的。在使用標(biāo)志符之前必須進(jìn)行聲明,一個(gè)聲明就是將一個(gè)非空的標(biāo)志符與常量、類型、變量、函數(shù)或代碼包綁定在一起。在 同一個(gè)代碼區(qū)塊中,不允許重復(fù)聲明同一個(gè)標(biāo)志符,并且該標(biāo)志符的作用域與所屬代碼區(qū)塊的范圍相同。

  • 預(yù)定義標(biāo)志符

Go語言中有一類特殊的標(biāo)志符,被叫做預(yù)定義標(biāo)志符。這類標(biāo)志符是在Go語言的源代碼中被聲明的,具體聲明如下:

基本數(shù)據(jù)類型名: int、float、string...
接口類型名:error
常量名:true,false和iota
內(nèi)建函數(shù)名:append,cap,close,complex,copy,delete,imag,len,make,new,panic,print,println,real,recover
  • 空標(biāo)志符

Go語言有一個(gè)名為 "_" 的特殊標(biāo)志符,叫(blank identifier)。通常作為忽略占位符使用,可以作表達(dá)式左值,但無法讀取內(nèi)容。 空標(biāo)志符也常用來臨時(shí)規(guī)避對未使用變量和導(dǎo)入包的錯(cuò)誤檢查,但需注意的是,它也屬于預(yù)定義標(biāo)志符。

  • 限定標(biāo)志符

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

  1. 代碼包必須被提前導(dǎo)入到該代碼文件中

  2. 該標(biāo)志符在代碼包必須是可被導(dǎo)出的

怎么才算是標(biāo)志符可被導(dǎo)出的呢?

  1. 標(biāo)志符名稱中的第一個(gè)字符必須大寫

  2. 標(biāo)志符必須是被聲明在一個(gè)代碼包中的變量、類型、結(jié)構(gòu)體類型的字段名、函數(shù)或方法名稱等。

因?yàn)镚o語言根據(jù)標(biāo)志符名稱中的第一個(gè)字母的大小寫來確定該標(biāo)志符的訪問權(quán)限;具體規(guī)則是當(dāng)標(biāo)志符名稱的第一個(gè)字符為小寫時(shí), 其訪問權(quán)限就是"包級私有的",只有與該標(biāo)志符在一個(gè)代碼包的代碼才能訪問到它。 當(dāng)標(biāo)志符名稱的第一個(gè)字符為大寫時(shí),其訪問權(quán)限為"公開的", 意味著該標(biāo)志符可以被任何代碼包的任何代碼通過限定標(biāo)志符訪問。

用一個(gè)例子來總結(jié)上面的內(nèi)容!

package main    //main 包名標(biāo)志符import (        //import 導(dǎo)入其它代碼包
    "fmt"       //fmt 標(biāo)準(zhǔn)代碼包名標(biāo)志符
    "strconv"   // strconv 標(biāo)準(zhǔn)代碼包名標(biāo)志符)func main() {   //main 函數(shù)名標(biāo)志符
    var s string = "10010"    //string 預(yù)定義標(biāo)志符
    v, _ := strconv.Atoi(s) //v自定義標(biāo)志符,_空白標(biāo)志符
    fmt.Printf("%T, %v", v, v) //fmt.Printf 限定標(biāo)志符}
注意: 代碼包標(biāo)志符并不屬于任何一個(gè)作用域,代碼包聲明只是為了區(qū)分若干源代碼文件
是否屬于同一個(gè)代碼包。或者指定導(dǎo)入代碼包時(shí)代表該代碼包的引用名稱。

命名建議:

  1. 盡量使用短命名,長名字并非你想象的那么更易讀,多加文檔和注釋比格外長的名字更實(shí)用

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

  3. 保持package的名字和目錄保持一致,盡量采取簡短有意義的包名,不要和標(biāo)準(zhǔn)庫名稱沖突,包名應(yīng)該為小寫單詞,不要使用下劃線或者混合大小寫

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

  5. 不要使用保留關(guān)鍵字作為標(biāo)志符

  6. 不建議使用與預(yù)定義常量、類型、內(nèi)置函數(shù)相同的名字作為標(biāo)志符

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

字面量

在計(jì)算機(jī)科學(xué)中,字面量是用于表達(dá)源代碼中一個(gè)固定基本值的表示法(notation)。幾乎所有計(jì)算機(jī)編程 語言都具有對基本值的字面量表示,比如:整數(shù)、浮點(diǎn)數(shù)、字符串、字符和布爾類型的數(shù)值都有對應(yīng)的 字面量表示; 比如:數(shù)字15這個(gè)值是唯一的,但表示的方式有很多種:

二進(jìn)制表達(dá):1111
八進(jìn)制表達(dá):017
十進(jìn)制表達(dá):15
十六進(jìn)制表達(dá):0xF

對于開發(fā)者來說,當(dāng)然知道要表達(dá)的意思,但是要把這種思想傳達(dá)給編譯器, 因?yàn)榫幾g器對源代碼做詞法分析時(shí)會自動(dòng)判決當(dāng)前用戶的輸入屬于哪一類字面量;

go語言的字面量與變量類型應(yīng)關(guān)系:

字面量種類變量的類型舉例
布爾booltrue/false
字符rune包含在單引號''之中的字符
整型int15, 017與0xF
浮點(diǎn)float640.,1.1,1.e+0.1E6,.25,.25e+5
復(fù)數(shù)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

字面量的通俗理解:編譯器根據(jù)用戶的輸入,推論出輸入的數(shù)據(jù)屬于什么數(shù)據(jù)類型。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI