Go 언어에는 여러 유형의 어휘 요소가 있습니다.

青灯夜游
풀어 주다: 2023-01-12 10:03:16
원래의
1774명이 탐색했습니다.

Go 언어에는 5가지 유형의 어휘 요소가 있습니다. 1. 여러 문자(유니코드로 인코딩됨), 밑줄 및 숫자로 구성된 문자 시퀀스인 식별자 2. 프로그래밍 언어에 의해 예약되어 있지만 예약되지 않은 키워드 프로그래머에게 허용됨 식별자로 사용되는 문자 시퀀스는 예약어라고도 합니다. 3. 연산자는 특정 산술 연산이나 논리 연산을 수행하는 데 사용되는 기호입니다. 5. 리터럴은 값에 대한 표기법입니다.

Go 언어에는 여러 유형의 어휘 요소가 있습니다.

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Go 언어의 언어 기호는 어휘 요소라고도 하며 식별자, 키워드, 연산자, 구분 기호 및 리터럴의 5가지 범주를 포함하며, Go 언어 코드와 프로그램을 구성하는 가장 기본적인 단위입니다.

일반적으로 공백, 가로 탭, 캐리지 리턴 및 줄 바꿈은 여러 언어 기호 사이의 구분 기호의 일부가 아닌 한 무시됩니다. Go 언어에서는 명시적으로 세미콜론을 삽입할 필요가 없습니다. 필요한 경우 Go 언어는 자동으로 코드에 세미콜론을 삽입하여 명령문을 구분합니다.

Go 언어 코드는 여러 개의 유니코드 문자로 구성됩니다. Go 언어의 모든 소스 코드는 유니코드 인코딩 사양의 UTF-8 인코딩 형식으로 인코딩되어야 합니다. 즉, 작성된 Go 언어 소스 코드 파일은 다음 형식이어야 합니다. UTF-8 인코딩 형식).

Go 언어의 언어 기호는 어휘 요소라고도 하며, 여기에는 5가지 범주가 포함됩니다:

identifier(식별자), keyword(키워드), operator(연산자), separator(구분 기호) 및 literal (리터럴). 일반적으로 공백, 가로 탭, 캐리지 리턴 및 줄 바꿈은 여러 언어 기호 사이의 구분 기호의 일부로 사용되지 않는 한 무시됩니다. Go 언어에서는 명시적으로 세미콜론을 삽입할 필요가 없습니다. 필요한 경우 Go 언어는 자동으로 코드에 세미콜론을 삽입하여 명령문을 구분합니다.

Go 언어 코드는 여러 개의 유니코드 문자로 구성됩니다. Go 언어의 모든 소스 코드는 유니코드 인코딩 사양의 UTF-8 인코딩 형식으로 인코딩되어야 합니다. 즉, 작성된 Go 언어 소스 코드 파일은 다음 형식이어야 합니다. UTF-8 인코딩 형식).

1. 식별자

Go 언어의 식별자는 여러 문자(유니코드로 인코딩됨), 밑줄 및 숫자로 구성된 문자 시퀀스입니다.

참고:

  • Go 언어 코드에서는 모든 식별자를 사용하기 전에 선언해야 합니다.

  • 선언은 비어 있지 않은 식별자를 상수, 유형, 변수, 함수 또는 코드 패키지에 바인딩합니다.

  • 동일한 코드 블록 내에서는 동일한 식별자를 반복해서 선언할 수 없습니다(할당문 제외).

  • 소스 코드 파일과 코드 패키지의 식별자는 이 규칙을 따라야 합니다.

  • 선언된 식별자의 범위는 해당 식별자가 직접 속한 코드 블록의 범위와 동일합니다.

엄밀히 말하면 코드 패키지 선언문은 선언이 아닙니다. 코드 패키지 이름은 어떤 범위에도 나타나지 않기 때문입니다. 코드 패키지 선언문의 목적은 여러 소스 코드 파일이 동일한 코드 패키지에 속하는지 여부를 식별하거나 코드 패키지를 가져올 때 기본 코드 패키지 참조 이름을 지정하는 것입니다.

적격 식별자는 다른 코드 패키지의 변수나 유형에 액세스하는 데 사용됩니다. 예를 들어, 코드 패키지 os에서 O_RDONLY라는 상수에 액세스해야 할 때 다음과 같이 os.O_RDONLY를 작성해야 합니다.

적격 식별자를 사용할 수 있으며 다음 두 가지 전제 조건을 충족해야 합니다.

  • 액세스할 코드 패키지를 미리 가져와야 합니다.

  • 이 코드 패키지의 식별자는 내보낼 수 있어야 합니다.

내보낼 수 있는 식별자는 다음 두 가지 전제 조건도 충족해야 합니다.

  • 식별자 이름의 첫 번째 문자는 대문자여야 합니다. 식별자, 식별자 이름의 첫 번째 문자가 대문자인 경우 해당 액세스 권한은 "공개"입니다. 즉, 식별자의 첫 번째 문자가 다음과 같은 경우 식별자 액세스를 한정하여 모든 코드 패키지의 모든 코드에서 식별자를 사용할 수 있습니다. 소문자인 경우 액세스 권한은 "패키지 수준 프라이빗"입니다. 즉, 식별자와 동일한 코드 패키지에 있는 코드만 액세스할 수 있습니다.)

  • 식별자는 코드에서 선언된 변수 또는 유형의 이름이어야 합니다. 패키지 또는 구조 유형에 속하는 필드 또는 메소드의 이름입니다.

Go 언어용 사전 정의된 식별자:

  • 모든 기본 데이터 유형의 이름입니다.
  • 인터페이스 유형 오류
  • 상수 true, false 및 iota
  • 모든 내장 함수의 이름, 즉 추가, 캡, 닫기, 복합, 복사, 삭제, imag, len, make, new, 패닉, 인쇄, println , 실제 및 복구.

Go 언어에는 빈 식별자가 있는데, 이는 밑줄로 표시되며 일반적으로 새 바인딩 도입이 필요하지 않은 선언에 사용됩니다. 예를 들어, 이 코드 패키지의 프로그램 엔터티를 사용하지 않고 특정 코드 패키지의 초기화 함수만 실행하려는 경우 다음 import 문을 작성할 수 있습니다:

import _ "runtime/cgo"1.
로그인 후 복사

where, " Runtime/cgo "는 표준 라이브러리 코드 패키지의 식별자를 나타냅니다.

2. 키워드

키워드(예약어라고도 함)는 프로그래밍 언어에 의해 예약되어 있으며 프로그래머가 식별자로 사용하지 않는 문자 시퀀스입니다.

CategoryKeywords
프로그램 선언import, package
프로그램 엔터티 선언 및 정의chan, const, func, 인터페이스, map, struct, type, var
프로그램 제어 흐름go, select, break, case, continue, default, defer, else, fallthrough, for, goto, if, range, return, switch

在Go语言中,程序实体的声明和定义是建立在其数据类型的体系之上的。例如关键字chan、func、interface、map和struct,分别于Go语言的复合数据类型Channel(通道)、Function(函数)、Interface(接口)、Map(字典)和Struct(结构体)相对应。

程序控制流程的关键字,一共15个。其中go和select,这两个主要用于Go语言并发编程。

3、字面量

简单来说,字面量就是值的一种标记法。但是,在Go中,字面量的含义要更加广泛一些。

Go语言代码中用到的字面量有以下3类:

1、表示基础数据类型值的各种字面量。例如,表示浮点数类型值的12E-3。

2、构造各种自定义的复合数据类型的类型字面量。例如,下面表示一个名称为Person的自定义结构体类型:

type Person struct {
	Name 	string
	Age	uint8
	Address	string
}
로그인 후 복사

3、表示复合数据类型的值的复合字面量

被用来构造类型Struct(结构体)、Array(数组)、Slice(切片)和Map(字典)的值。例如,下面的字面量用于表示上面名称为Person的结构体类型的值:

Person {
	Name:"Huazie",
	Age: "21",
	Address: "Nanjing, China"
}
로그인 후 복사

注意:
对复合字面量的每次求值都会导致一个新的值被创建。因此,如上该复合字面量每被求值一次就会创建一个新的Person类型的值。

Go语言不允许在一个此类的复合字面变量中,出现重复的键。如下都是错误,无法通过编译,因为键都有重复。

//表示结构体类型值,有重复的键 Name
Person {Name: "Huazie",Age: "21", Name: "Unknown"}
//表示字典类型值,有重复的键 Age
map[string]string{ Name: "Huazie",Age: "21", Age: "21"}
//表示切片类型值,有重复的键 0
[]string{0: "0", 1: "1", 0: "-1"}
로그인 후 복사

4、类型

一个类型确定了一类值的集合,以及可以在这些值上施加的操作。类型可以由类型名称或者类型字面量指定,分为基本类型和复合类型,基本类型的名称可以代表其自身。

var bookName string1.
로그인 후 복사

如上声明了一个类型为string(基本类型中的一个)、名称为bookName的变量。

其他基本类型(预定义类型)有bool、byte、rune、int/uint、int8/uint8、int16/uint16、int32/uint32、int64/uint64、float32、float64、complex64和complex128。除了bool和string之外的其他基本类型也叫做数值类型。

复合类型一般由若干(也包括零)个其他已被定义的类型组合而成。复合类型有Channel(通道)、Function(函数)、Interface(接口)、Map(字典)、Struct(结构体)、Slice(切片)、Array(数组)和Pointer(指针)。

Go语言中的类型又可以分为静态类型和动态类型。一个变量的静态类型是指在变量声明中给出的那个类型。绝大多数类型的变量都只有静态类型。唯独接口类型的变量例外,它除了拥有静态类型之外,还拥有动态类型(接口类型在后面会讲到)。

每一个类型都会有一个潜在类型。如果这个类型是一个预定义类型(也就是基本类型),或者是一个由类型字面量构造的复合类型,那么它的潜在类型就是它自身。如string类型的潜在类型就是string类型,上面自定义的Person类型的潜在类型就是Person。如果一个类型并不属于上述情况,那么这个类型的潜在类型就是类型声明中的那个类型的潜在类型。

如下声明一个自定义类型

type MyString string1.
로그인 후 복사

如上可以把类型MyString看作string类型的一个别名类型,那么MyString类型的潜在类型就是string类型。Go语言基本数据类型中的rune类型可以看作是uint32类型的一个别名类型,其潜在类型就是uint32。

注意:

  • 类型MyString和类型string是两个不相同的类型。不能将其中一个类型的值赋给另一个类型的变量。
  • 别名类型与它的源类型的不同仅仅体现在名称上,它们的内部结构是一致的;下面的类型转换的表达式都是合法的:MyString(“ABC”) 和string(MyString(“ABC”))。这种类型转换并不会创建新的值。

一个类型的潜在类型具有可传递性,如下:

type iString MyString1.
로그인 후 복사

则类型isString的潜在类型就是string类型。

这里声明一个类型,如下:

type MyStrings [3]string1.
로그인 후 복사

**참고:**MyStrings 유형의 기본 유형은 [3]string이 아닙니다. [3] string은 미리 정의된 유형도 아니고 유형 리터럴로 구성된 복합 유형도 아니며 요소 유형이 문자열인 배열 유형입니다.

위 정의에 따르면 MyStrings 유형의 잠재적 유형은 [3]string의 잠재적 유형 string임을 알 수 있습니다.

Go 언어에서는 배열 유형의 잠재적 유형에 따라 해당 유형의 변수에 저장할 수 있는 요소 유형이 결정된다고 규정합니다.

5. 연산자

연산자는 특정 산술 연산이나 논리 연산을 수행하는 데 사용되는 기호입니다. (여기서 자세히 설명하지는 않겠습니다. C 언어의 연산자와 비슷합니다.) 하지만 Go 언어에는 삼항 연산자가 없으므로 단항 연산자를 제외하고는 이항 연산자여야 합니다. Go 언어에는 산술 연산자, 비교 연산자, 논리 연산자, 주소 연산자, 수신 연산자 등 총 21개의 연산자가 있습니다.

2 이진수, 산술, 주소 비트 단위 지우기 연산, 이항, 산술 연산자 논리 NOT 연산, 단항, 논리 연산자수신 연산, 단항, 수신 연산자
기호설명



&&논리 AND 운영. 이진, 논리연산자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원은 2원, 산술연산자 -1 //결과는 -1(1 – 2) //결과는 -1
비트 OR 연산, 이진, 산술 연산자 5 11 //수식의 결과는 15
^비트 XOR, 한 요소는 이진, 산술 연산자 511 // 결과는 14(5) //결과는 -6
*곱셈 또는 값, 단항, 이진, 산술, 주소 *p //값 연산
/몫 연산 , 이항, 산술 연산자10 / 5 //수식의 결과는 2
%나머지 연산, 이항, 산술 연산자12 % 5 //수식의 결과는 2
<<비트 왼쪽 시프트 연산, 이진수, 산술 연산자4 << 2 //수식의 결과는 16
&v //주소 연산 &^
5 &^ 11 //수식의 결과는 4 !
!b // b가 참이면 결과는 거짓입니다<-
<- ch

注意:假设上面的ch 代表了元素类型为 byte的通道类型值,则<- ch表示从ch中接收byte类型值的操作。

重点讲解3个操作符

1、&^ 实现了按位清除操作,按位清除就是根据第二个操作数的二进制值对第一个操作数的二进制值进行相应的清零操作,如果第二个操作数的某个二进制位上的数组为1,就把第一个操作数的对应二进制位上的数值设置为0。否则,第一个操作数的对应二进制位上的数值不变。这样的操作并不会改变第一个操作数的原值,只会根据两个操作数的二进制值计算出结果值。这样就可以理解上面的5 &^ 11的结果为4了。

2、^ 作为一元操作符,分两种情况:

(1). 操作数是无符号的整数类型,使用这一个操作就相当于对这个操作数和其整数类型的最大值进行二元的按位异或操作,如下:

^uint8(1)           = 254     
//无符号整数的一元按位异或操作00000001 ^ 11111111 = 11111110//对应的二进制数运算1.2.3.
로그인 후 복사

如上,内置函数uint8会将一个整数字面量转换为一个uint8类型的值,这保证了一元操作符^的唯一操作数一定是一个无符号整数类型的值。

(2). 操作是有符号的整数类型,这一操作就相当于对这个操作数和-1进行二元按位异或操作。例如:

^1                  = -2 
//有符号整数的一元按位异或操作00000001 ^ 11111111 = 11111110//对应的二进制运算1.2.
로그인 후 복사

**注意:**以上的操作数的二进制值都是以补码形式表示;默认情况下整数字面量是有符号的,所以(2)中操作数1不需要显示使用内置函数int8 。

3、<- 接收操作符,只作用于通道类型的值。使用时,需要注意两点:

(1). 从一个通道类型的空值(即nil)接收值的表达式将会永远被阻塞。
(2). 从一个已被关闭的通道类型值接收值会永远成功并立即返回一个其元素类型的零值。

一个由接收操作符和通道类型的操作数所组成的表达式可以直接被用于变量赋值或初始化,如下所示(在赋值语句讲解时,再细说)

v1 := <-ch
v2 = <-ch1.2.
로그인 후 복사

特殊标记 = 用于将一个值赋给一个已被声明的变量或常量。
特殊标记 := 则用于在声明一个变量的同时对这个变量进行赋值,且只能在函数体内使用。

又如下:

v, ok = <-ch
v, ok := <-ch1.2.
로그인 후 복사

当同时对两个变量进行赋值或初始化时,第二个变量将会是一个布尔类型的值。这个值代表了接收操作的成功与否。如果这个值为false,就说明这个通道已经被关闭了。(之后讲解通道类型会详细介绍)。

操作符优先级

优先级操作符
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语言允许如下的赋值语句:

v, ok := a[x]1.
로그인 후 복사

如上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.(T)1.
로그인 후 복사

该表达式的作用是判断“x不为nil且存储在其中的值是T类型的”是否成立。

如果T不是一个接口类型,那么x.(T)会判断类型T是否为x的动态类型(一个变量的动态类型就是在运行期间存储在其中的值的实际类型);而这个实际类型必须是该变量声明的那个类型的一个实现类型,否则就根本不可能在该变量中存储这一类型的值。所以类型T必须为x的类型的一个实现类型,而在Go语言中只有接口类型可以被其他类型实现,所以x的求值结果必须是一个接口类型的值。

所以上面表达式interface{}(num).(int)中表达式interface{}(num)的含义就是将变量num转换为interface{}类型的值(即它的结果值是接口类型的),而这刚好符合前面的定义。

知识点: interface{}是一个特殊的接口类型,代表空接口。所有类型都是它的实现类型。

在对变量的赋值或初始化的时候,也可以使用类型断言,如下:

v, ok := x.(T)1.
로그인 후 복사

当使用类型断言表达式同时对两个变量进行赋值时,如果类型断言成功,那么赋给第一个变量的将会是已经被转换为T类型的表达式x的求值结果,否则赋给第一个变量的就是类型T的零值。布尔类型会被赋给变量ok,它体现了类型断言的成功(true)与否(false)。

注意: 在这种场景下,即使类型断言失败也不会引发运行时恐慌。

(8) 一个基本表达式和一个调用符号组成。

调用符号只针对于函数或者方法。与调用符号组合的基本表达式不是一个代表代码包名称(或者其别名)的标识符就是一个代表结构体类型的方法的名称的标识符。调用符号由一个英文句号为前缀和一个被圆括号括起来的参数列表组成,多个参数列表之间用逗号分隔。例如,基本表达式os.Open(“/etc/profile”)表示对代码包os中的函数Open的调用。

可变长参数

如果函数f可以接受的参数的数量是不固定的,那么函数f就是一个能够接受可变长参数的函数,简称可变参函数。在Go语言中,在可变参函数的参数列表的最后总会出现一个可变长参数,这个可变长参数的类型声明形如…T。Go语言会在每次调用函数f的时候创建一个切片类型值,并用它来存放这些实际函数。这个切片类型值的长度就是当前调用表达式中与可变长参数绑定的实际参数的数量。

可变参函数appendIfAbsent声明如下(函数体省略):

func appendIfAbsent(s []string, t ...string) []string1.
로그인 후 복사

针对此函数的调用表达式如下:

appendIfAbsent([]string(“A”,”B”,”C”),”C”,”B”,”A”)1.
로그인 후 복사

其中,与可变参数t绑定的切片类型值为[]string{”C”,”B”,”A”},包含了实际参数”C”,”B”和”A”。

也可以直接把一个元素类型为T的切片类型值赋给…T类型的可变长参数,如下调用:

appendIfAbsent([]string(“A”,”B”,”C”), []string(”C”,”B”,”A”)...)1.
로그인 후 복사

或者如果有一个元素类型为stirng的切片类型的变量s的话,如下调用:

appendIfAbsent([]string(“A”,”B”,”C”), s...)1.
로그인 후 복사

对于将切片类型的变量赋给可变长参数的情况,Go语言不会专门创建一个切片类型值来存储其中的实际参数。因为,这样的切片类型值已经存在了,可变长参数t的值就是变量s的值。

【相关推荐:Go视频教程编程教学

위 내용은 Go 언어에는 여러 유형의 어휘 요소가 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿