前言
经过几番挣扎,最终决定在今天开始认真地总结 Go 语言相关知识,希望能够坚持下去。 本篇文章将从Go语言的基础语法入手,帮助读者快速上手Go语言或者复习相关基础知识。
hello world
每当学习一门新的语言,首先就是要编写hello world程序。
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
hello world程序其实就反映了go语言基本的代码结构:
- Go语言中利用包(package)来组织代码,类似c++中的namespace,不仅可以解决命名冲突、提高代码的可重用性,而且有助于模块化编程。程序中第一行package main就是Go程序的包声明,需要说明的是,Go语言编译的可执行程序都必须有一个名叫 main 的包。
- Go语言提供了import关键字进行包的引用,在本程序中引用Go的原生库fmt来进行字符串的屏幕输出。
- Go语言中main函数是程序运行的唯一入口,并且只能声明在main包中。
词法结构
从编译原理的角度来看,词法结构是代码中最小的基本单位,也称为词法单元(Token)。在Go语言中,词法结构定义了代码中有效的词法单元类型以及它们的规则。
以下是Go语言常见的词法单元类型:
- 标识符(Identifier):用于表示变量、函数、类型、常量等的名称。标识符由字母、数字和下划线组成,且必须以字母或下划线开头。
- 关键字(Keyword):Go语言预定义的具有特殊含义的单词,如
if、for、func等。关键字不能用作标识符。 - 运算符(Operator):用于执行各种操作的符号,如算术运算符(
+、-、*)、逻辑运算符(&&、||)、赋值运算符(=、+=)等。 - 分隔符(Delimiter):用于分隔不同的程序元素,如括号(
(、))、花括号({、})、逗号(,)、分号(;)等。 - 字面量(Literal):表示固定的数值、字符串、布尔值等常量的写法,如整数字面量(
1、123)、浮点数字面量(3.14)、字符串字面量("hello")等。 - 注释(Comment):用于注释代码的部分,不会被编译器解析和执行。
编译器的词法分析阶段将源代码按照这些规则进行扫描,并将其划分为一个个的词法单元。这些词法单元在后续的语法分析和语义分析阶段起着重要的作用。了解和理解Go语言的词法结构有助于我们理解代码的组成和含义,并能有效地进行代码编写和调试。
变量
变量在Go词法结构中扮演着至关重要的角色。它们是用来存储和表示数据的容器,可以在程序执行过程中被赋值、修改和读取。通过使用变量,我们可以方便地引用和操作数据,从而实现灵活的编程。
变量概念
变量(Variable)用于存储和表示可变的数据内容 。需要注意的是,Go语言是一种强类型语言,变量的类型一旦确定后,在后续使用过程中不能改变。但这并不意味着我们就不能进行灵活的数据处理,我们还可以使用interface{}类型来实现对不同类型数据的存储和处理。interface{}是一种空接口类型,它可以表示任意类型的值。通过将值赋给interface{}类型的变量,可以实现对不同类型数据的存储,并在需要时进行类型断言或类型转换来恢复原始类型。
变量类型
-
数值类型:
- 整数类型:int、int8、int16、int32、int64和对应的无符号整数类型uint、uint8、uint16、uint32、uint64。
- 浮点数类型:float32、float64。
- 复数类型:complex64、complex128。
-
布尔类型:bool,取值为true或false。
-
字符类型:byte,实际上是uint8的别名,用于表示ASCII码值。
-
字符串类型:string,表示一串字符。
-
指针类型:*T,表示指向类型T的指针。
-
数组类型:[n]T,表示包含固定大小n个元素的数组,其中T代表元素的类型。
-
切片类型:[]T,表示可变长度的序列,切片是基于数组的动态大小的视图。
-
结构体类型:struct,表示由多个字段组成的复合类型。
-
接口类型:interface,表示方法集合的抽象类型,接口定义了具体类型需要实现的方法。
-
函数类型:func,表示函数类型,可以作为参数、返回值或变量的类型。
-
字典类型:map[K]V,表示键值对的集合。其中K为键的类型,V为值的类型。
-
通道类型:chan T,用于在Go协程之间进行通信的类型。
变量定义
在Go语言中使用var关键字进行变量声明,方法如下:
-
先声明变量,再赋值 ,例如:
var name stringname = "test" -
声明变量时直接赋值,例如:
var name string = "test"
-
使用自动推导直接赋值,例如:
name := "test"
在Go语言中还可以进行多变量的声明,方法如下:
-
声明并初始化每个变量,例如:
var a, b, c int = 1, 2, 3 -
类型推导方式,例如:
a, b, c := 1, 2, 3 -
想要忽略某些返回值或占位符变量时,可以用空白标识符 _ ,例如:
var a, _, c int = 1, 2, 3 -
可以在一组括号内同时声明并初始化多个变量。每个变量都可以有不同的类型和初始值,例如:
var ( a = 1 b = 2 c = 3 )
常量
常量概念
在Go语言中,常量是一个不可修改的值。常量的声明使用const关键字,必须在声明时进行初始化,并且无法在程序运行期间修改。常量可以是基本类型(如整数、浮点数、布尔值等)或复合类型(如字符串、数组、结构体等)。
常量定义
在Go语言中使用const关键字进行常量定义,方法同变量定义,不在赘述。
对比 C 语言
Go语言是由Google开发的一种静态类型、编译型的语言,而C语言是一种广泛使用的过程式编程语言。从其语言和词法结构上,Go语言在某种程度上受到了C语言的影响。
Go语言和C语言有着相似的词法和语法结构,例如Go语言的Hello World程序使用包级别的main函数作为入口点,与C语言的main函数对应,不仅如此,Go语言中的关键字和标识符规则与C语言类似。
在另一方面,Go语言相比于C语言,具有更严格的语法要求,因此更安全。Go语言是强类型语言,变量在声明时需要指定类型,并且类型无法改变。C语言也是静态类型语言,但可以通过类型转换来改变变量的类型。同时,Go语言相较于C语言更简便,支持自动推导变量类型的方式进行初始化,而C语言需要手动指定变量类型。
总结
首先,本文介绍了编写"hello world"程序作为学习一门新语言的第一步,并解释了程序中的代码结构和包的概念。 接着,本文讲解了词法结构,即代码中最小的基本单位,包括标识符、关键字、运算符、分隔符、字面量和注释等。
然后,文章介绍了变量在Go语言中的重要性和概念,以及不同的变量类型,如整数类型、浮点数类型、布尔类型、字符类型、字符串类型等。文章还提到了变量的定义方法,包括先声明后赋值、直接赋值和自动推导赋值,并且介绍了多变量的声明方法,同时也讨论了常量的概念和定义方式。
最后通过C语言和Go语言的比较,说明Go语言与C语言的相似之处以及独特优势。