Go 言語には 5 種類の語彙要素があります: 1. 識別子 (Unicode でエンコードされた) の多数の文字、アンダースコア、数字で構成される文字シーケンス; 2. キーワード (によって予約されています)プログラマが識別子として使用することを許可されていない文字シーケンスも予約語と呼ばれます; 3. 演算子は特定の算術演算または論理演算を実行するために使用される記号です; 4. 区切り文字; 5. リテラル (値)表記です。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語の言語シンボルは語彙要素とも呼ばれ、識別子、キーワード、演算子、区切り文字、リテラルの 5 つのカテゴリが含まれます。 は、Go を構成する最も基本的な単位です。言語コードとプログラム。
一般に、スペース、水平タブ、キャリッジ リターン、ライン フィードは、複数の言語記号の間の区切り文字の一部として使用されない限り無視されます。 Go 言語では、明示的にセミコロンを挿入する必要はなく、必要に応じて、Go 言語はステートメントを区切るためにコードにセミコロンを自動的に挿入します。
Go 言語のコードは、複数の Unicode 文字で構成されています。Go 言語のすべてのソース コードは、Unicode エンコード仕様の UTF-8 エンコード形式でエンコードされる必要があります (つまり、記述された Go 言語のソース コード)ファイルは UTF-8 エンコード形式である必要があります)。
Go 言語の言語シンボルは字句要素とも呼ばれ、identifier (識別子)、keyword (キーワード)、操作文字 # の 5 つのカテゴリが含まれます。 ## (演算子)、区切り文字 (区切り文字)、および リテラル (リテラル)。一般に、スペース、水平タブ、キャリッジ リターン、およびライン フィードは、複数の言語記号の間の区切り文字の一部として使用されない限り無視されます。 Go 言語では、明示的にセミコロンを挿入する必要はなく、必要に応じて、Go 言語はステートメントを区切るためにコードにセミコロンを自動的に挿入します。
Go 言語のコードは、複数の Unicode 文字で構成されています。Go 言語のすべてのソース コードは、Unicode エンコード仕様の UTF-8 エンコード形式でエンコードされる必要があります (つまり、記述された Go 言語のソース コード)ファイルは UTF-8 エンコード形式である必要があります)。注:
Go 言語には空の識別子があり、これはアンダースコアで表され、通常は新しいバインディングの導入を必要としないステートメントで使用されます。たとえば、特定のコード パッケージ内のプログラム エンティティを使用せずに、このコード パッケージ内の初期化関数のみを実行したい場合は、次のインポート ステートメントを記述できます:
このうち、「runtime/cgo」は標準ライブラリコードパッケージの識別子を表します。
キーワード (予約語とも呼ばれます) はプログラミング言語によって予約されており、プログラマが識別子として使用するものではありません。使用する文字シーケンス。
カテゴリ | キーワード | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
プログラム ステートメント | インポート、package | |||||||||||
##chan、const、func、interface、map、struct、type、var | ||||||||||||
go、select、break、case、 continue、default、defer、else、fallthrough、for、goto、if、range、return、switch |
説明 | 例 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
ロジックと操作。二項論理演算子 | true && false //式の結果は false です | |||||||||||
等価判定演算です。バイナリ、比較演算子 | "abc" == "abc" //結果は true | |||||||||||
不等判定演算。バイナリ、比較演算子 | "abc" != "Abc" //結果は true | ##< | ||||||||||
1 < 2 //式の結果は true です。 | <= | |||||||||||
1 <= 2 //式の結果は true です。 | > | |||||||||||
3 > 2 //式の結果は true です | >= | |||||||||||
3 >= 2 //式の結果は true | ||||||||||||
1 //結果は 1 (1 2) //結果は 3 | - | |||||||||||
-1 //結果は -1 (1 – 2) //結果は -1 | \ | |||||||||||
5 \ 11 //式の結果は 15 | ^ | |||||||||||
5 | 11//結果は 14 (5)//結果は -6 | * | ||||||||||
*p //値演算 | / | |||||||||||
10 / 5 //式の結果は2 | % | |||||||||||
12 % 5 //式の結果は2 | << | |||||||||||
4 << 2 //式の結果は16 | ##>> | ビット単位の右シフト演算、バイナリ、算術演算子 | ||||||||||
##& | ビット単位のAND演算、単項、二項、算術, address | |||||||||||
&^ | # #ビット単位のクリア演算、バイナリ、算術演算子 | |||||||||||
! | 論理演算非演算、単項論理演算子 | |||||||||||
##<- | 受信操作、単項、受信演算子 | <- ch | ||||||||||
优先级 | 操作符 |
---|---|
5 | * / % << >> & &^ |
4 | + - \ ^ |
3 | == != < <= > >= |
2 | && |
1 |
(1) 使用操作数来表示;
(2) 使用类型转换来表示;
(3) 使用内建函数调用来表示;
(4) 一个基本表达式和一个选择符号组成选择表达式;
例如,如果在一个结构体类型中存在字段f,我们就可以在这个结构体类型的变量x上应用一个选择符号来访问这个字段f,即x.f。其中,.f就是一个选择符号。注意:前提是这个变量x的值不能是nil。在Go语言中,nil用来表示空值。
(5) 一个基本表达式和一个索引符号组成索引表达式;
索引符号由狭义的表达式(仅由操作符和操作数组成)和外层的方括号组成,例如[]int{1,2,3,4,5}[2]就是索引表达式。
Go语言允许如下的赋值语句:
如上a为字典类型,x为字典的键。该索引表达式的结果是一对值,而不是单一值。第一个值的类型就是该字典类型的元素类型,而第二个值则是布尔类型。与变量ok绑定的布尔值代表了在字典类型a中是否包含了以x为键的键值对。如果在a中包含这样的键值对,那么赋给变量ok的值就是true,否则就为false。
**注意:**虽然当字典类型的变量a的值为nil时,求值表达式a[x]并不会发生任何错误,但是在这种情况下对a[x]进行赋值却会引起一个运行时恐慌( Go语言异常)。
(6) 一个基本表达式和一个切片符号组成切片表达式;
切片符号由2个或3个狭义的表达式和外层的方括号组成,这些表达式之间由冒号分隔。切片符号作用与索引符号类似,只不过索引符号针对的是一个点,切片符号针对的是一个范围。例如,要取出一个切片[]int{1,2,3,4,5}的第二个到第四个元素,那么可以使用切片符号的表达式[]int{1,2,3,4,5}[1:4],该结果还是一个切片。
切片表达式a[x:y:z],a是切片符号[x:y]的操作对象。其中,x代表了切片元素下界索引,y代表了切片的元素上界索引,而z则代表了切片的容量上界索引。约束如下:
0 <= 元素下界索引 <= 元素上界索引 <= 容量上界索引 <= 操作对象的容量
设a的值为[]int{1,2,3,4,5},则切片表达式a[:3]等同于a[0:3],这是因为切片符号的元素下界索引的默认值为0,相应的元素上界的索引的默认值为操作对象的长度值或容量值,即切片表达式a[3:]等同于a[3:5]。同样,切片表达式a[:]等同于复制a所代表的值并将这个复制品作为表达式的求值结果。
注意: UTF-8 编码格式会以3个字节来表示一个中文字符,而切片操作是针对字节进行的。
如果有“Go并发编程实战”的字符串类型的变量a,那么切片表达式a[1:3]的结果不是“o并”,而a[1:5]的结果才是“o并”。
(7) 一个基本表达式和一个类型断言符号组成;
类型断言符号以一个英文句号为前缀,并后跟一个被圆括号括起来的类型名称或类型字面量。类型断言符号用于判断一个变量或常量是否为一个预期的类型,并根据判断结果采取不同的响应。例如,如果要判断一个int8类型的变量num是否是int类型,可以这样编写表达式:interface{}(num).(int)。
对于一个求值结果为接口类型值的表达式x和一个类型T,对应的类型断言为:
该表达式的作用是判断“x不为nil且存储在其中的值是T类型的”是否成立。
如果T不是一个接口类型,那么x.(T)会判断类型T是否为x的动态类型(一个变量的动态类型就是在运行期间存储在其中的值的实际类型);而这个实际类型必须是该变量声明的那个类型的一个实现类型,否则就根本不可能在该变量中存储这一类型的值。所以类型T必须为x的类型的一个实现类型,而在Go语言中只有接口类型可以被其他类型实现,所以x的求值结果必须是一个接口类型的值。
所以上面表达式interface{}(num).(int)中表达式interface{}(num)的含义就是将变量num转换为interface{}类型的值(即它的结果值是接口类型的),而这刚好符合前面的定义。
知识点: interface{}是一个特殊的接口类型,代表空接口。所有类型都是它的实现类型。
在对变量的赋值或初始化的时候,也可以使用类型断言,如下:
当使用类型断言表达式同时对两个变量进行赋值时,如果类型断言成功,那么赋给第一个变量的将会是已经被转换为T类型的表达式x的求值结果,否则赋给第一个变量的就是类型T的零值。布尔类型会被赋给变量ok,它体现了类型断言的成功(true)与否(false)。
注意: 在这种场景下,即使类型断言失败也不会引发运行时恐慌。
(8) 一个基本表达式和一个调用符号组成。
调用符号只针对于函数或者方法。与调用符号组合的基本表达式不是一个代表代码包名称(或者其别名)的标识符就是一个代表结构体类型的方法的名称的标识符。调用符号由一个英文句号为前缀和一个被圆括号括起来的参数列表组成,多个参数列表之间用逗号分隔。例如,基本表达式os.Open(“/etc/profile”)表示对代码包os中的函数Open的调用。
如果函数f可以接受的参数的数量是不固定的,那么函数f就是一个能够接受可变长参数的函数,简称可变参函数。在Go语言中,在可变参函数的参数列表的最后总会出现一个可变长参数,这个可变长参数的类型声明形如…T。Go语言会在每次调用函数f的时候创建一个切片类型值,并用它来存放这些实际函数。这个切片类型值的长度就是当前调用表达式中与可变长参数绑定的实际参数的数量。
可变参函数appendIfAbsent声明如下(函数体省略):
针对此函数的调用表达式如下:
其中,与可变参数t绑定的切片类型值为[]string{”C”,”B”,”A”},包含了实际参数”C”,”B”和”A”。
也可以直接把一个元素类型为T的切片类型值赋给…T类型的可变长参数,如下调用:
或者如果有一个元素类型为stirng的切片类型的变量s的话,如下调用:
对于将切片类型的变量赋给可变长参数的情况,Go语言不会专门创建一个切片类型值来存储其中的实际参数。因为,这样的切片类型值已经存在了,可变长参数t的值就是变量s的值。
以上がGo 言語にはいくつかの種類の語彙要素がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。