久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Go語(yǔ)言的詞法元素有幾類(lèi)

      Go語(yǔ)言的詞法元素有5類(lèi):1、標(biāo)識(shí)符,由若干字母(由Unicode編碼即可)、下劃線和數(shù)字組成的字符序列;2、關(guān)鍵字,是被編程語(yǔ)言保留而不讓編程人員作為標(biāo)識(shí)符使用的字符序列,也可以稱(chēng)為保留字;3、操作符,是用于執(zhí)行特定算術(shù)運(yùn)算或邏輯操作的符號(hào);4、分隔符;5、字面量,是值的一種標(biāo)記法。

      Go語(yǔ)言的詞法元素有幾類(lèi)

      本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

      Go語(yǔ)言的語(yǔ)言符號(hào)又稱(chēng)為詞法元素,共包括5類(lèi):標(biāo)識(shí)符(identifier)、關(guān)鍵字(keyword)、操作符(operator)、分隔符(delimiter)、以及字面量(literal),它們是組成Go語(yǔ)言代碼和程序的最基本單位。

      一般情況下,空格符、水平制表符、回車(chē)符和換行符都會(huì)被忽略,除非它們作為多個(gè)語(yǔ)言符號(hào)之間的分隔符的一部分。在Go語(yǔ)言中不需要顯示地插入分號(hào),在必要時(shí),Go語(yǔ)言會(huì)自動(dòng)為代碼插入分號(hào)以進(jìn)行語(yǔ)句分隔。

      Go語(yǔ)言代碼由若干個(gè)Unicode字符組成,Go語(yǔ)言的所有源代碼都必須由Unicode編碼規(guī)范的UTF-8編碼格式進(jìn)行編碼(也就是說(shuō)編寫(xiě)的Go語(yǔ)言源碼文件必須是UTF-8編碼格式的)。

      Go語(yǔ)言的語(yǔ)言符號(hào)又稱(chēng)為詞法元素,共包括5類(lèi):標(biāo)識(shí)符(identifier)、關(guān)鍵字(keyword)、操作符(operator)、分隔符(delimiter)、以及字面量(literal)。一般情況下,空格符、水平制表符、回車(chē)符和換行符都會(huì)被忽略,除非它們作為多個(gè)語(yǔ)言符號(hào)之間的分隔符的一部分。在Go語(yǔ)言中不需要顯示地插入分號(hào),在必要時(shí),Go語(yǔ)言會(huì)自動(dòng)為代碼插入分號(hào)以進(jìn)行語(yǔ)句分隔。

      Go語(yǔ)言代碼由若干個(gè)Unicode字符組成,Go語(yǔ)言的所有源代碼都必須由Unicode編碼規(guī)范的UTF-8編碼格式進(jìn)行編碼(也就是說(shuō)編寫(xiě)的Go語(yǔ)言源碼文件必須是UTF-8編碼格式的)。

      1、標(biāo)識(shí)符

      Go語(yǔ)言的標(biāo)識(shí)符是由若干字母(由Unicode編碼即可)、下劃線和數(shù)字組成的字符序列;該字符序列的第一個(gè)字符必須為字母。

      注意:

      • 在Go語(yǔ)言代碼中,每一個(gè)標(biāo)識(shí)符都必須在使用前進(jìn)行聲明。

      • 一個(gè)聲明將一個(gè)非空的標(biāo)識(shí)符與一個(gè)常量、類(lèi)型、變量、函數(shù)或代碼包綁定在一起。

      • 在同一個(gè)代碼塊中,不允許重復(fù)聲明同一個(gè)標(biāo)識(shí)符(除了賦值語(yǔ)句例外)。

      • 在一個(gè)源碼文件和一個(gè)代碼包中的標(biāo)識(shí)符都需要遵循此規(guī)則。

      • 一個(gè)已被聲明的標(biāo)識(shí)符的作用域與其直接所屬的代碼塊的范圍相同。

      嚴(yán)格來(lái)講,代碼包聲明語(yǔ)句并不算是一個(gè)聲明。因?yàn)榇a包名稱(chēng)并不會(huì)出現(xiàn)在任何一個(gè)作用域中。代碼包聲明語(yǔ)句的目的是為了鑒別若干源碼文件是否屬于同一個(gè)代碼包,或者指定導(dǎo)入代碼包時(shí)的默認(rèn)代碼包引用名稱(chēng)。

      限定標(biāo)識(shí)符用來(lái)訪問(wèn)其他代碼包中的變量或類(lèi)型。例如,當(dāng)我需要訪問(wèn)代碼包os中名為O_RDONLY的常量時(shí),需要這樣寫(xiě)os.O_RDONLY。

      限定標(biāo)識(shí)符能夠使用,需要滿足兩個(gè)前提條件:

      • 要訪問(wèn)的代碼包必須被事先導(dǎo)入;

      • 這個(gè)代碼包中的標(biāo)識(shí)符必須是可導(dǎo)出的。

      一個(gè)可導(dǎo)出的標(biāo)識(shí)符也需要滿足兩個(gè)前提條件:

      • 標(biāo)識(shí)符名稱(chēng)中的第一個(gè)字符必須為大寫(xiě)(Go語(yǔ)言根據(jù)標(biāo)識(shí)符名稱(chēng)中的第一個(gè)字符的大小寫(xiě)來(lái)確定這個(gè)標(biāo)識(shí)符的訪問(wèn)權(quán)限的,當(dāng)標(biāo)識(shí)符名稱(chēng)的第一個(gè)字符為大寫(xiě)時(shí),其訪問(wèn)權(quán)限為“公開(kāi)的”,也就是該標(biāo)識(shí)符可以被任何代碼包中的任何代碼通過(guò)限定標(biāo)識(shí)符訪問(wèn)到;當(dāng)標(biāo)識(shí)符的第一個(gè)字符為小寫(xiě)時(shí),其訪問(wèn)權(quán)限就是"包級(jí)私有的",也就是只有與該標(biāo)識(shí)符同在一個(gè)代碼包的代碼才能夠訪問(wèn)到它);

      • 標(biāo)識(shí)符必須是被聲明在一個(gè)代碼包中的變量或者類(lèi)型的名稱(chēng),或者是屬于某個(gè)結(jié)構(gòu)體類(lèi)型的字段名稱(chēng)或方法的名稱(chēng)。

      Go語(yǔ)言的預(yù)定義標(biāo)識(shí)符:

      • 所有基本數(shù)據(jù)類(lèi)型的名稱(chēng)。
      • 接口類(lèi)型error
      • 常量true,false和iota
      • 所有內(nèi)建函數(shù)的名稱(chēng),即append、cap、close、complex、copy、delete、imag、len、make、new、panic、print、println、real和recover。

      Go語(yǔ)言中有一個(gè)空標(biāo)識(shí)符,它由一個(gè)下劃線表示,一般用于一個(gè)不需要引入一個(gè)新綁定的聲明中。例如,當(dāng)我們只想執(zhí)行一下某個(gè)代碼包中的初始化函數(shù),而不需要使用這個(gè)代碼包中的任何程序?qū)嶓w的時(shí)候,可以編寫(xiě)如下導(dǎo)入語(yǔ)句:

      import _ "runtime/cgo"1.
      登錄后復(fù)制

      其中,"runtime/cgo"代表了一個(gè)標(biāo)準(zhǔn)庫(kù)代碼包的標(biāo)識(shí)符。

      2、關(guān)鍵字

      關(guān)鍵字(也稱(chēng)為保留字)是被編程語(yǔ)言保留而不讓編程人員作為標(biāo)識(shí)符使用的字符序列。

      類(lèi)別 關(guān)鍵字
      程序聲明 import, package
      程序?qū)嶓w聲明和定義 chan, const, func, interface, map, struct, type, var
      程序控制流程 go, select, break, case, continue, default, defer, else, fallthrough, for, goto, if, range, return, switch

      在Go語(yǔ)言中,程序?qū)嶓w的聲明和定義是建立在其數(shù)據(jù)類(lèi)型的體系之上的。例如關(guān)鍵字chan、func、interface、map和struct,分別于Go語(yǔ)言的復(fù)合數(shù)據(jù)類(lèi)型Channel(通道)、Function(函數(shù))、Interface(接口)、Map(字典)和Struct(結(jié)構(gòu)體)相對(duì)應(yīng)。

      程序控制流程的關(guān)鍵字,一共15個(gè)。其中g(shù)o和select,這兩個(gè)主要用于Go語(yǔ)言并發(fā)編程。

      3、字面量

      簡(jiǎn)單來(lái)說(shuō),字面量就是值的一種標(biāo)記法。但是,在Go中,字面量的含義要更加廣泛一些。

      Go語(yǔ)言代碼中用到的字面量有以下3類(lèi):

      1、表示基礎(chǔ)數(shù)據(jù)類(lèi)型值的各種字面量。例如,表示浮點(diǎn)數(shù)類(lèi)型值的12E-3。

      2、構(gòu)造各種自定義的復(fù)合數(shù)據(jù)類(lèi)型的類(lèi)型字面量。例如,下面表示一個(gè)名稱(chēng)為Person的自定義結(jié)構(gòu)體類(lèi)型:

      type Person struct { 	Name 	string 	Age	uint8 	Address	string }
      登錄后復(fù)制

      3、表示復(fù)合數(shù)據(jù)類(lèi)型的值的復(fù)合字面量

      被用來(lái)構(gòu)造類(lèi)型Struct(結(jié)構(gòu)體)、Array(數(shù)組)、Slice(切片)和Map(字典)的值。例如,下面的字面量用于表示上面名稱(chēng)為Person的結(jié)構(gòu)體類(lèi)型的值:

      Person { 	Name:"Huazie", 	Age: "21", 	Address: "Nanjing, China" }
      登錄后復(fù)制

      注意:
      對(duì)復(fù)合字面量的每次求值都會(huì)導(dǎo)致一個(gè)新的值被創(chuàng)建。因此,如上該復(fù)合字面量每被求值一次就會(huì)創(chuàng)建一個(gè)新的Person類(lèi)型的值。

      Go語(yǔ)言不允許在一個(gè)此類(lèi)的復(fù)合字面變量中,出現(xiàn)重復(fù)的鍵。如下都是錯(cuò)誤,無(wú)法通過(guò)編譯,因?yàn)殒I都有重復(fù)。

      //表示結(jié)構(gòu)體類(lèi)型值,有重復(fù)的鍵 Name Person {Name: "Huazie",Age: "21", Name: "Unknown"} //表示字典類(lèi)型值,有重復(fù)的鍵 Age map[string]string{ Name: "Huazie",Age: "21", Age: "21"} //表示切片類(lèi)型值,有重復(fù)的鍵 0 []string{0: "0", 1: "1", 0: "-1"}
      登錄后復(fù)制

      4、類(lèi)型

      一個(gè)類(lèi)型確定了一類(lèi)值的集合,以及可以在這些值上施加的操作。類(lèi)型可以由類(lèi)型名稱(chēng)或者類(lèi)型字面量指定,分為基本類(lèi)型和復(fù)合類(lèi)型,基本類(lèi)型的名稱(chēng)可以代表其自身。

      var bookName string1.
      登錄后復(fù)制

      如上聲明了一個(gè)類(lèi)型為string(基本類(lèi)型中的一個(gè))、名稱(chēng)為bookName的變量。

      其他基本類(lèi)型(預(yù)定義類(lèi)型)有bool、byte、rune、int/uint、int8/uint8、int16/uint16、int32/uint32、int64/uint64、float32、float64、complex64和complex128。除了bool和string之外的其他基本類(lèi)型也叫做數(shù)值類(lèi)型。

      復(fù)合類(lèi)型一般由若干(也包括零)個(gè)其他已被定義的類(lèi)型組合而成。復(fù)合類(lèi)型有Channel(通道)、Function(函數(shù))、Interface(接口)、Map(字典)、Struct(結(jié)構(gòu)體)、Slice(切片)、Array(數(shù)組)和Pointer(指針)。

      Go語(yǔ)言中的類(lèi)型又可以分為靜態(tài)類(lèi)型和動(dòng)態(tài)類(lèi)型。一個(gè)變量的靜態(tài)類(lèi)型是指在變量聲明中給出的那個(gè)類(lèi)型。絕大多數(shù)類(lèi)型的變量都只有靜態(tài)類(lèi)型。唯獨(dú)接口類(lèi)型的變量例外,它除了擁有靜態(tài)類(lèi)型之外,還擁有動(dòng)態(tài)類(lèi)型(接口類(lèi)型在后面會(huì)講到)。

      每一個(gè)類(lèi)型都會(huì)有一個(gè)潛在類(lèi)型。如果這個(gè)類(lèi)型是一個(gè)預(yù)定義類(lèi)型(也就是基本類(lèi)型),或者是一個(gè)由類(lèi)型字面量構(gòu)造的復(fù)合類(lèi)型,那么它的潛在類(lèi)型就是它自身。如string類(lèi)型的潛在類(lèi)型就是string類(lèi)型,上面自定義的Person類(lèi)型的潛在類(lèi)型就是Person。如果一個(gè)類(lèi)型并不屬于上述情況,那么這個(gè)類(lèi)型的潛在類(lèi)型就是類(lèi)型聲明中的那個(gè)類(lèi)型的潛在類(lèi)型。

      如下聲明一個(gè)自定義類(lèi)型

      type MyString string1.
      登錄后復(fù)制

      如上可以把類(lèi)型MyString看作string類(lèi)型的一個(gè)別名類(lèi)型,那么MyString類(lèi)型的潛在類(lèi)型就是string類(lèi)型。Go語(yǔ)言基本數(shù)據(jù)類(lèi)型中的rune類(lèi)型可以看作是uint32類(lèi)型的一個(gè)別名類(lèi)型,其潛在類(lèi)型就是uint32。

      注意:

      • 類(lèi)型MyString和類(lèi)型string是兩個(gè)不相同的類(lèi)型。不能將其中一個(gè)類(lèi)型的值賦給另一個(gè)類(lèi)型的變量。
      • 別名類(lèi)型與它的源類(lèi)型的不同僅僅體現(xiàn)在名稱(chēng)上,它們的內(nèi)部結(jié)構(gòu)是一致的;下面的類(lèi)型轉(zhuǎn)換的表達(dá)式都是合法的:MyString(“ABC”) 和string(MyString(“ABC”))。這種類(lèi)型轉(zhuǎn)換并不會(huì)創(chuàng)建新的值。

      一個(gè)類(lèi)型的潛在類(lèi)型具有可傳遞性,如下:

      type iString MyString1.
      登錄后復(fù)制

      則類(lèi)型isString的潛在類(lèi)型就是string類(lèi)型。

      這里聲明一個(gè)類(lèi)型,如下:

      type MyStrings [3]string1.
      登錄后復(fù)制

      **注意:**類(lèi)型MyStrings的潛在類(lèi)型并不是[3]string。[3]string既不是一個(gè)預(yù)定義的類(lèi)型,也不是一個(gè)由類(lèi)型字面量構(gòu)造的復(fù)合類(lèi)型,而是一個(gè)元素類(lèi)型為string的數(shù)組類(lèi)型。

      根據(jù)上面的定義可知類(lèi)型MyStrings的潛在類(lèi)型就是[3]string的潛在類(lèi)型string。

      Go語(yǔ)言規(guī)定,一個(gè)數(shù)組類(lèi)型的潛在類(lèi)型決定了在該類(lèi)型的變量中可以存放哪一個(gè)類(lèi)型的元素。

      5、操作符

      操作符就是用于執(zhí)行特定算術(shù)運(yùn)算或邏輯操作的符號(hào)。(這里不詳細(xì)講解了,跟C語(yǔ)言的操作符類(lèi)似),不過(guò)Go語(yǔ)言中沒(méi)有三元操作符,所以除了一元操作符以外都必定是二元操作符。Go語(yǔ)言一共有21個(gè)操作符,包括算術(shù)操作符、比較操作符、邏輯操作符、地址操作符和接收操作符。

      符號(hào) 說(shuō)明 示例
      && 邏輯與操作。二元,邏輯操作符 true && false //表達(dá)式結(jié)果是false
      == 相等判斷操作。二元,比較操作符 “abc” == “abc”//結(jié)果是true
      != 不等判斷操作。二元,比較操作符 “abc” != “Abc”//結(jié)果是true
      < 小于判斷操作。二元,比較操作符 1 < 2 //表達(dá)式結(jié)果是true
      <= 小于或等于。二元,比較操作符 1 <= 2 //表達(dá)式結(jié)果是true
      > 大于判斷操作。二元,比較操作符 3 > 2 //表達(dá)式結(jié)果是true
      >= 大于或等于。二元,比較操作符 3 >= 2 //表達(dá)式結(jié)果是true
      + 表示求和,一元又是二元,算術(shù)操作符 +1 //結(jié)果為1 (1+2) //結(jié)果是3
      表示求差,一元又是二元,算術(shù)操作符 -1 //結(jié)果為-1 (1 – 2) //結(jié)果是-1
      按位或操作,二元,算術(shù)操作符 5 11 //表達(dá)式的結(jié)果是15
      ^ 按位異或,一元又是二元,算術(shù)操作符 511//結(jié)果是14(5)//結(jié)果是-6
      * 求積或取值,一元,二元,算術(shù),地址 *p //取值操作
      / 求商操作,二元,算術(shù)操作符 10 / 5 //表達(dá)式的結(jié)果為2
      % 求余數(shù)操作,二元,算術(shù)操作符 12 % 5 //表達(dá)式的結(jié)果為2
      << 按位左移操作,二元,算術(shù)操作符 4 << 2 //表達(dá)式的結(jié)果為16
      >> 按位右移操作,二元,算術(shù)操作符 4 >> 2 //表達(dá)式的結(jié)果為1
      & 按位與操作,一元,二元,算術(shù),地址 &v //取地址操作
      &^ 按位清除操作,二元,算術(shù)操作符 5 &^ 11 //表達(dá)式的結(jié)果為4
      ! 邏輯非操作,一元,邏輯操作符 !b //若b為true,結(jié)果為false
      <- 接收操作,一元,接收操作符 <- ch

      注意:假設(shè)上面的ch 代表了元素類(lèi)型為 byte的通道類(lèi)型值,則<- ch表示從ch中接收byte類(lèi)型值的操作。

      重點(diǎn)講解3個(gè)操作符

      1、&^ 實(shí)現(xiàn)了按位清除操作,按位清除就是根據(jù)第二個(gè)操作數(shù)的二進(jìn)制值對(duì)第一個(gè)操作數(shù)的二進(jìn)制值進(jìn)行相應(yīng)的清零操作,如果第二個(gè)操作數(shù)的某個(gè)二進(jìn)制位上的數(shù)組為1,就把第一個(gè)操作數(shù)的對(duì)應(yīng)二進(jìn)制位上的數(shù)值設(shè)置為0。否則,第一個(gè)操作數(shù)的對(duì)應(yīng)二進(jìn)制位上的數(shù)值不變。這樣的操作并不會(huì)改變第一個(gè)操作數(shù)的原值,只會(huì)根據(jù)兩個(gè)操作數(shù)的二進(jìn)制值計(jì)算出結(jié)果值。這樣就可以理解上面的5 &^ 11的結(jié)果為4了。

      2、^ 作為一元操作符,分兩種情況:

      (1). 操作數(shù)是無(wú)符號(hào)的整數(shù)類(lèi)型,使用這一個(gè)操作就相當(dāng)于對(duì)這個(gè)操作數(shù)和其整數(shù)類(lèi)型的最大值進(jìn)行二元的按位異或操作,如下:

      ^uint8(1)           = 254      //無(wú)符號(hào)整數(shù)的一元按位異或操作00000001 ^ 11111111 = 11111110//對(duì)應(yīng)的二進(jìn)制數(shù)運(yùn)算1.2.3.
      登錄后復(fù)制

      如上,內(nèi)置函數(shù)uint8會(huì)將一個(gè)整數(shù)字面量轉(zhuǎn)換為一個(gè)uint8類(lèi)型的值,這保證了一元操作符^的唯一操作數(shù)一定是一個(gè)無(wú)符號(hào)整數(shù)類(lèi)型的值。

      (2). 操作是有符號(hào)的整數(shù)類(lèi)型,這一操作就相當(dāng)于對(duì)這個(gè)操作數(shù)和-1進(jìn)行二元按位異或操作。例如:

      ^1                  = -2  //有符號(hào)整數(shù)的一元按位異或操作00000001 ^ 11111111 = 11111110//對(duì)應(yīng)的二進(jìn)制運(yùn)算1.2.
      登錄后復(fù)制

      **注意:**以上的操作數(shù)的二進(jìn)制值都是以補(bǔ)碼形式表示;默認(rèn)情況下整數(shù)字面量是有符號(hào)的,所以(2)中操作數(shù)1不需要顯示使用內(nèi)置函數(shù)int8 。

      3、<- 接收操作符,只作用于通道類(lèi)型的值。使用時(shí),需要注意兩點(diǎn):

      (1). 從一個(gè)通道類(lèi)型的空值(即nil)接收值的表達(dá)式將會(huì)永遠(yuǎn)被阻塞。
      (2). 從一個(gè)已被關(guān)閉的通道類(lèi)型值接收值會(huì)永遠(yuǎn)成功并立即返回一個(gè)其元素類(lèi)型的零值。

      一個(gè)由接收操作符和通道類(lèi)型的操作數(shù)所組成的表達(dá)式可以直接被用于變量賦值或初始化,如下所示(在賦值語(yǔ)句講解時(shí),再細(xì)說(shuō))

      v1 := <-ch v2 = <-ch1.2.
      登錄后復(fù)制

      特殊標(biāo)記 = 用于將一個(gè)值賦給一個(gè)已被聲明的變量或常量。
      特殊標(biāo)記 := 則用于在聲明一個(gè)變量的同時(shí)對(duì)這個(gè)變量進(jìn)行賦值,且只能在函數(shù)體內(nèi)使用。

      又如下:

      v, ok = <-ch v, ok := <-ch1.2.
      登錄后復(fù)制

      當(dāng)同時(shí)對(duì)兩個(gè)變量進(jìn)行賦值或初始化時(shí),第二個(gè)變量將會(huì)是一個(gè)布爾類(lèi)型的值。這個(gè)值代表了接收操作的成功與否。如果這個(gè)值為false,就說(shuō)明這個(gè)通道已經(jīng)被關(guān)閉了。(之后講解通道類(lèi)型會(huì)詳細(xì)介紹)。

      操作符優(yōu)先級(jí)

      優(yōu)先級(jí) 操作符
      5 * / % << >> & &^
      4 + – ^
      3 == != < <= > >=
      2 &&
      1

      擴(kuò)展知識(shí):表達(dá)式

      基本表達(dá)式

      (1) 使用操作數(shù)來(lái)表示;

      (2) 使用類(lèi)型轉(zhuǎn)換來(lái)表示;

      (3) 使用內(nèi)建函數(shù)調(diào)用來(lái)表示;

      (4) 一個(gè)基本表達(dá)式和一個(gè)選擇符號(hào)組成選擇表達(dá)式;

      例如,如果在一個(gè)結(jié)構(gòu)體類(lèi)型中存在字段f,我們就可以在這個(gè)結(jié)構(gòu)體類(lèi)型的變量x上應(yīng)用一個(gè)選擇符號(hào)來(lái)訪問(wèn)這個(gè)字段f,即x.f。其中,.f就是一個(gè)選擇符號(hào)。注意:前提是這個(gè)變量x的值不能是nil。在Go語(yǔ)言中,nil用來(lái)表示空值。

      (5) 一個(gè)基本表達(dá)式和一個(gè)索引符號(hào)組成索引表達(dá)式;

      索引符號(hào)由狹義的表達(dá)式(僅由操作符和操作數(shù)組成)和外層的方括號(hào)組成,例如[]int{1,2,3,4,5}[2]就是索引表達(dá)式。
      Go語(yǔ)言允許如下的賦值語(yǔ)句:

      v, ok := a[x]1.
      登錄后復(fù)制

      如上a為字典類(lèi)型,x為字典的鍵。該索引表達(dá)式的結(jié)果是一對(duì)值,而不是單一值。第一個(gè)值的類(lèi)型就是該字典類(lèi)型的元素類(lèi)型,而第二個(gè)值則是布爾類(lèi)型。與變量ok綁定的布爾值代表了在字典類(lèi)型a中是否包含了以x為鍵的鍵值對(duì)。如果在a中包含這樣的鍵值對(duì),那么賦給變量ok的值就是true,否則就為false。

      **注意:**雖然當(dāng)字典類(lèi)型的變量a的值為nil時(shí),求值表達(dá)式a[x]并不會(huì)發(fā)生任何錯(cuò)誤,但是在這種情況下對(duì)a[x]進(jìn)行賦值卻會(huì)引起一個(gè)運(yùn)行時(shí)恐慌( Go語(yǔ)言異常)。

      (6) 一個(gè)基本表達(dá)式和一個(gè)切片符號(hào)組成切片表達(dá)式;

      切片符號(hào)由2個(gè)或3個(gè)狹義的表達(dá)式和外層的方括號(hào)組成,這些表達(dá)式之間由冒號(hào)分隔。切片符號(hào)作用與索引符號(hào)類(lèi)似,只不過(guò)索引符號(hào)針對(duì)的是一個(gè)點(diǎn),切片符號(hào)針對(duì)的是一個(gè)范圍。例如,要取出一個(gè)切片[]int{1,2,3,4,5}的第二個(gè)到第四個(gè)元素,那么可以使用切片符號(hào)的表達(dá)式[]int{1,2,3,4,5}[1:4],該結(jié)果還是一個(gè)切片。

      切片表達(dá)式a[x:y:z],a是切片符號(hào)[x:y]的操作對(duì)象。其中,x代表了切片元素下界索引,y代表了切片的元素上界索引,而z則代表了切片的容量上界索引。約束如下:

      0 <= 元素下界索引 <= 元素上界索引 <= 容量上界索引 <= 操作對(duì)象的容量

      設(shè)a的值為[]int{1,2,3,4,5},則切片表達(dá)式a[:3]等同于a[0:3],這是因?yàn)榍衅?hào)的元素下界索引的默認(rèn)值為0,相應(yīng)的元素上界的索引的默認(rèn)值為操作對(duì)象的長(zhǎng)度值或容量值,即切片表達(dá)式a[3:]等同于a[3:5]。同樣,切片表達(dá)式a[:]等同于復(fù)制a所代表的值并將這個(gè)復(fù)制品作為表達(dá)式的求值結(jié)果。

      注意: UTF-8 編碼格式會(huì)以3個(gè)字節(jié)來(lái)表示一個(gè)中文字符,而切片操作是針對(duì)字節(jié)進(jìn)行的。

      如果有“Go并發(fā)編程實(shí)戰(zhàn)”的字符串類(lèi)型的變量a,那么切片表達(dá)式a[1:3]的結(jié)果不是“o并”,而a[1:5]的結(jié)果才是“o并”。

      (7) 一個(gè)基本表達(dá)式和一個(gè)類(lèi)型斷言符號(hào)組成;

      類(lèi)型斷言符號(hào)以一個(gè)英文句號(hào)為前綴,并后跟一個(gè)被圓括號(hào)括起來(lái)的類(lèi)型名稱(chēng)或類(lèi)型字面量。類(lèi)型斷言符號(hào)用于判斷一個(gè)變量或常量是否為一個(gè)預(yù)期的類(lèi)型,并根據(jù)判斷結(jié)果采取不同的響應(yīng)。例如,如果要判斷一個(gè)int8類(lèi)型的變量num是否是int類(lèi)型,可以這樣編寫(xiě)表達(dá)式:interface{}(num).(int)。

      對(duì)于一個(gè)求值結(jié)果為接口類(lèi)型值的表達(dá)式x和一個(gè)類(lèi)型T,對(duì)應(yīng)的類(lèi)型斷言為:

      x.(T)1.
      登錄后復(fù)制

      該表達(dá)式的作用是判斷“x不為nil且存儲(chǔ)在其中的值是T類(lèi)型的”是否成立。

      如果T不是一個(gè)接口類(lèi)型,那么x.(T)會(huì)判斷類(lèi)型T是否為x的動(dòng)態(tài)類(lèi)型(一個(gè)變量的動(dòng)態(tài)類(lèi)型就是在運(yùn)行期間存儲(chǔ)在其中的值的實(shí)際類(lèi)型);而這個(gè)實(shí)際類(lèi)型必須是該變量聲明的那個(gè)類(lèi)型的一個(gè)實(shí)現(xiàn)類(lèi)型,否則就根本不可能在該變量中存儲(chǔ)這一類(lèi)型的值。所以類(lèi)型T必須為x的類(lèi)型的一個(gè)實(shí)現(xiàn)類(lèi)型,而在Go語(yǔ)言中只有接口類(lèi)型可以被其他類(lèi)型實(shí)現(xiàn),所以x的求值結(jié)果必須是一個(gè)接口類(lèi)型的值。

      所以上面表達(dá)式interface{}(num).(int)中表達(dá)式interface{}(num)的含義就是將變量num轉(zhuǎn)換為interface{}類(lèi)型的值(即它的結(jié)果值是接口類(lèi)型的),而這剛好符合前面的定義。

      知識(shí)點(diǎn): interface{}是一個(gè)特殊的接口類(lèi)型,代表空接口。所有類(lèi)型都是它的實(shí)現(xiàn)類(lèi)型。

      在對(duì)變量的賦值或初始化的時(shí)候,也可以使用類(lèi)型斷言,如下:

      v, ok := x.(T)1.
      登錄后復(fù)制

      當(dāng)使用類(lèi)型斷言表達(dá)式同時(shí)對(duì)兩個(gè)變量進(jìn)行賦值時(shí),如果類(lèi)型斷言成功,那么賦給第一個(gè)變量的將會(huì)是已經(jīng)被轉(zhuǎn)換為T(mén)類(lèi)型的表達(dá)式x的求值結(jié)果,否則賦給第一個(gè)變量的就是類(lèi)型T的零值。布爾類(lèi)型會(huì)被賦給變量ok,它體現(xiàn)了類(lèi)型斷言的成功(true)與否(false)。

      注意: 在這種場(chǎng)景下,即使類(lèi)型斷言失敗也不會(huì)引發(fā)運(yùn)行時(shí)恐慌。

      (8) 一個(gè)基本表達(dá)式和一個(gè)調(diào)用符號(hào)組成。

      調(diào)用符號(hào)只針對(duì)于函數(shù)或者方法。與調(diào)用符號(hào)組合的基本表達(dá)式不是一個(gè)代表代碼包名稱(chēng)(或者其別名)的標(biāo)識(shí)符就是一個(gè)代表結(jié)構(gòu)體類(lèi)型的方法的名稱(chēng)的標(biāo)識(shí)符。調(diào)用符號(hào)由一個(gè)英文句號(hào)為前綴和一個(gè)被圓括號(hào)括起來(lái)的參數(shù)列表組成,多個(gè)參數(shù)列表之間用逗號(hào)分隔。例如,基本表達(dá)式os.Open(“/etc/profile”)表示對(duì)代碼包os中的函數(shù)Open的調(diào)用。

      可變長(zhǎng)參數(shù)

      如果函數(shù)f可以接受的參數(shù)的數(shù)量是不固定的,那么函數(shù)f就是一個(gè)能夠接受可變長(zhǎng)參數(shù)的函數(shù),簡(jiǎn)稱(chēng)可變參函數(shù)。在Go語(yǔ)言中,在可變參函數(shù)的參數(shù)列表的最后總會(huì)出現(xiàn)一個(gè)可變長(zhǎng)參數(shù),這個(gè)可變長(zhǎng)參數(shù)的類(lèi)型聲明形如…T。Go語(yǔ)言會(huì)在每次調(diào)用函數(shù)f的時(shí)候創(chuàng)建一個(gè)切片類(lèi)型值,并用它來(lái)存放這些實(shí)際函數(shù)。這個(gè)切片類(lèi)型值的長(zhǎng)度就是當(dāng)前調(diào)用表達(dá)式中與可變長(zhǎng)參數(shù)綁定的實(shí)際參數(shù)的數(shù)量。

      可變參函數(shù)appendIfAbsent聲明如下(函數(shù)體省略):

      func appendIfAbsent(s []string, t ...string) []string1.
      登錄后復(fù)制

      針對(duì)此函數(shù)的調(diào)用表達(dá)式如下:

      appendIfAbsent([]string(“A”,”B”,”C”),”C”,”B”,”A”)1.
      登錄后復(fù)制

      其中,與可變參數(shù)t綁定的切片類(lèi)型值為[]string{”C”,”B”,”A”},包含了實(shí)際參數(shù)”C”,”B”和”A”。

      也可以直接把一個(gè)元素類(lèi)型為T(mén)的切片類(lèi)型值賦給…T類(lèi)型的可變長(zhǎng)參數(shù),如下調(diào)用:

      appendIfAbsent([]string(“A”,”B”,”C”), []string(”C”,”B”,”A”)...)1.
      登錄后復(fù)制

      或者如果有一個(gè)元素類(lèi)型為stirng的切片類(lèi)型的變量s的話,如下調(diào)用:

      appendIfAbsent([]string(“A”,”B”,”C”), s...)1.
      登錄后復(fù)制

      對(duì)于將切片類(lèi)型的變量賦給可變長(zhǎng)參數(shù)的情況,Go語(yǔ)言不會(huì)專(zhuān)門(mén)創(chuàng)建一個(gè)切片類(lèi)型值來(lái)存儲(chǔ)其中的實(shí)際參數(shù)。因?yàn)?,這樣的切片類(lèi)型值已經(jīng)存在了,可變長(zhǎng)參數(shù)t的值就是變量s的值。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)