久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

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

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

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

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

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

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

一般情況下,空格符、水平制表符、回車符和換行符都會(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ō)編寫的Go語(yǔ)言源碼文件必須是UTF-8編碼格式的)。

Go語(yǔ)言的語(yǔ)言符號(hào)又稱為詞法元素,共包括5類:標(biāo)識(shí)符(identifier)、關(guān)鍵字(keyword)、操作符(operator)、分隔符(delimiter)、以及字面量(literal)。一般情況下,空格符、水平制表符、回車符和換行符都會(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ō)編寫的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è)常量、類型、變量、函數(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包名稱并不會(huì)出現(xiàn)在任何一個(gè)作用域中。代碼包聲明語(yǔ)句的目的是為了鑒別若干源碼文件是否屬于同一個(gè)代碼包,或者指定導(dǎo)入代碼包時(shí)的默認(rèn)代碼包引用名稱。

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

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

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

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

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

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

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

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

  • 所有基本數(shù)據(jù)類型的名稱。
  • 接口類型error
  • 常量true,false和iota
  • 所有內(nèi)建函數(shù)的名稱,即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í)候,可以編寫如下導(dǎo)入語(yǔ)句:

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

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

2、關(guān)鍵字

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

類別 關(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ù)類型的體系之上的。例如關(guān)鍵字chan、func、interface、map和struct,分別于Go語(yǔ)言的復(fù)合數(shù)據(jù)類型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類:

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

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

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

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

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

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

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

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

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

4、類型

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

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

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

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

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

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

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

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

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

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

注意:

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

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

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

則類型isString的潛在類型就是string類型。

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

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

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

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

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

5、操作符

操作符就是用于執(zhí)行特定算術(shù)運(yùn)算或邏輯操作的符號(hào)。(這里不詳細(xì)講解了,跟C語(yǔ)言的操作符類似),不過(guò)Go語(yǔ)言中沒有三元操作符,所以除了一元操作符以外都必定是二元操作符。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 代表了元素類型為 byte的通道類型值,則<- ch表示從ch中接收byte類型值的操作。

重點(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ù)類型,使用這一個(gè)操作就相當(dāng)于對(duì)這個(gè)操作數(shù)和其整數(shù)類型的最大值進(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類型的值,這保證了一元操作符^的唯一操作數(shù)一定是一個(gè)無(wú)符號(hào)整數(shù)類型的值。

(2). 操作是有符號(hào)的整數(shù)類型,這一操作就相當(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、<- 接收操作符,只作用于通道類型的值。使用時(shí),需要注意兩點(diǎn):

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

一個(gè)由接收操作符和通道類型的操作數(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è)布爾類型的值。這個(gè)值代表了接收操作的成功與否。如果這個(gè)值為false,就說(shuō)明這個(gè)通道已經(jīng)被關(guān)閉了。(之后講解通道類型會(huì)詳細(xì)介紹)。

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

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

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

基本表達(dá)式

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

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

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

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

例如,如果在一個(gè)結(jié)構(gòu)體類型中存在字段f,我們就可以在這個(gè)結(jié)構(gòu)體類型的變量x上應(yīng)用一個(gè)選擇符號(hào)來(lái)訪問這個(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為字典類型,x為字典的鍵。該索引表達(dá)式的結(jié)果是一對(duì)值,而不是單一值。第一個(gè)值的類型就是該字典類型的元素類型,而第二個(gè)值則是布爾類型。與變量ok綁定的布爾值代表了在字典類型a中是否包含了以x為鍵的鍵值對(duì)。如果在a中包含這樣的鍵值對(duì),那么賦給變量ok的值就是true,否則就為false。

**注意:**雖然當(dāng)字典類型的變量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)類似,只不過(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)”的字符串類型的變量a,那么切片表達(dá)式a[1:3]的結(jié)果不是“o并”,而a[1:5]的結(jié)果才是“o并”。

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

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

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

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

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

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

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

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

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

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

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

注意: 在這種場(chǎng)景下,即使類型斷言失敗也不會(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è)代表代碼包名稱(或者其別名)的標(biāo)識(shí)符就是一個(gè)代表結(jié)構(gòu)體類型的方法的名稱的標(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)稱可變參函數(shù)。在Go語(yǔ)言中,在可變參函數(shù)的參數(shù)列表的最后總會(huì)出現(xiàn)一個(gè)可變長(zhǎng)參數(shù),這個(gè)可變長(zhǎng)參數(shù)的類型聲明形如…T。Go語(yǔ)言會(huì)在每次調(diào)用函數(shù)f的時(shí)候創(chuàng)建一個(gè)切片類型值,并用它來(lái)存放這些實(shí)際函數(shù)。這個(gè)切片類型值的長(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綁定的切片類型值為[]string{”C”,”B”,”A”},包含了實(shí)際參數(shù)”C”,”B”和”A”。

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

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

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

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

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
成人影视亚洲图片在线| 欧美freesex黑人又粗又大| 热三久草你在线| 精品视频自拍| 麻豆极品一区二区三区| 国产精品一区毛片| 国产精品欧美在线观看| 免费亚洲婷婷| 高清久久一区| 日韩一区二区在线免费| 蜜桃精品在线| 欧美成人精品| 国产中文一区| 欧美日韩四区| 婷婷综合亚洲| 久久视频国产| 国产一级久久| 日韩有吗在线观看| 国产精品午夜av| 水蜜桃精品av一区二区| 日韩欧美二区| 日韩视频精品在线观看| 最新国产精品| 国产精品免费99久久久| 国产剧情一区二区在线观看| 欧美国产三级| bbw在线视频| 国产在线不卡| 亚洲天堂免费| 国产精品视频一区二区三区综合| 69堂精品视频在线播放| 你懂的网址国产 欧美| 激情视频网站在线播放色 | 日韩一级精品| 亚洲精选av| 国产美女视频一区二区| 激情久久99| 欧美福利专区| 日韩国产在线一| 精品国产亚洲一区二区三区在线 | 欧美专区18| 日韩av不卡一区二区| 另类欧美日韩国产在线| 在线日韩视频| 欧美日韩91| 在线一区视频观看| 亚洲天堂免费| 久久男人av资源站| 另类激情亚洲| 国产精品videosex极品| 国产精品99一区二区| 日韩精品免费视频人成 | 久久精品观看| 日韩激情精品| 婷婷综合六月| 日本h片久久| 99久久婷婷这里只有精品| 日韩精品久久久久久久软件91| 福利在线一区| 视频一区二区不卡| 精品国产精品国产偷麻豆| 日韩视频二区| 色婷婷亚洲mv天堂mv在影片| 中文字幕一区二区三区在线视频| 久久精品99久久久| 米奇777超碰欧美日韩亚洲| 国产日韩免费| 99视频一区| 欧美国产极品| 奶水喷射视频一区| 精品亚洲自拍| 日韩欧美中文字幕在线视频| 在线日韩一区| 精品视频在线一区二区在线| 午夜在线精品偷拍| 国产白浆在线免费观看| 欧美亚洲三级| 欧美日韩国产高清电影| 久久99偷拍| 久久夜色精品| 久久久久中文| 精品理论电影在线| 国产探花在线精品一区二区| 在线综合亚洲| 不卡福利视频| 久久影院资源站| 亚洲精一区二区三区| 欧美日韩色图| 久久久久久夜| 国产精品视频一区二区三区四蜜臂| 一区在线观看| 亚洲播播91| 日韩av在线播放网址| 久久国产人妖系列| aa亚洲婷婷| 日韩三区免费| 成人午夜网址| 国产精品国码视频| 一区二区三区四区精品视频| 欧美a级片一区| 电影亚洲精品噜噜在线观看| 国产精品毛片视频| 日韩精品a在线观看91| 99国产精品自拍| 久久国产亚洲| 午夜av成人| 日韩网站中文字幕| 神马午夜在线视频| 国产一区二区色噜噜| 国产精品视频一区二区三区综合 | 成人免费电影网址| 黄在线观看免费网站ktv| 加勒比视频一区| 久久av中文| 国产欧美三级| 国产伦乱精品| 国产伦一区二区三区| 亚洲最新av| 日韩中文字幕亚洲一区二区va在线| 亚洲激情婷婷| 亚洲自拍另类| 午夜在线播放视频欧美| 亚洲一区欧美二区| 91精品福利| 欧美午夜不卡| 水野朝阳av一区二区三区| 99热精品在线| 日韩制服丝袜av| 亚洲精品伊人| 日本三级亚洲精品| 国产亚洲高清一区| 国产精品777777在线播放| 麻豆成人av在线| 一区二区精品伦理...| 久久天堂av| 日韩一区二区免费看| 亚洲精品字幕| 久久爱www成人| 精品久久精品| 蜜桃av在线播放| 亚洲视频综合| 亚洲欧美日韩在线观看a三区| 深夜日韩欧美| 国产精品一区亚洲| 91视频久久| 香蕉精品视频在线观看| 热久久久久久久| 97久久超碰| 久久精品二区亚洲w码| 久久国产成人午夜av影院宅| 亚洲一区二区三区无吗| 国产毛片久久久| 国产精品福利在线观看播放| 亚洲成人va| 亚洲香蕉久久| 国产福利资源一区| 九色porny丨国产首页在线| 另类av一区二区| 国产精品视频3p| 群体交乱之放荡娇妻一区二区| 久久大逼视频| 国产精品亚洲综合色区韩国| 国产色播av在线| 亚洲激情不卡| 青青草精品视频| 9999国产精品| 在线精品观看| 韩日一区二区| 91高清一区| 91精品国产自产在线丝袜啪| 成人在线视频免费| 亚洲一级在线| 高清av一区| 亚洲小说春色综合另类电影| 九九九精品视频| 亚洲制服少妇| 精品视频久久| 美女久久一区| 国产一区二区三区四区大秀| 中文在线不卡| 精品国产乱码久久久| 国产偷自视频区视频一区二区| 国产九九精品| 视频福利一区| 国产探花一区| 婷婷综合亚洲| 精品一区二区三区中文字幕 | www.51av欧美视频| 男人的天堂亚洲一区| 久久gogo国模啪啪裸体| 亚洲欧洲一区| 久久尤物视频| 免费人成在线不卡| 久久男人天堂| 国产一级成人av| 久久国产精品亚洲77777| 国产一区二区三区精品在线观看| 国产亚洲精品自拍| 91日韩在线| 国产欧美日韩一区二区三区四区|