上一篇笔记介绍了Go的安装以及在VSCode中配置Go环境的步骤,笔者在配置过程中遇到的问题和解决办法。本文则主要分为两部分内容:Go语言基础语法,Go语言的常用特性。
Go基础语法
Go基础组成
仍然是以青训营代码Hello World为例
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world!")
}
- package main 定义了包名。在Go中,我们必须在第一行注明文件属于哪个包。
- import("fmt") import的作用是引入我们需要使用的包(笔者感觉这里Go和python是类似的),而fmt则是表示该程序需要使用 fmt 包。
- func main() 即程序开始执行的函数。每一个可执行程序都必须包含main函数,是程序的主体。
- fmt.Println() 是fmt包中用于打印输出内容的函数,如我们展示的例子中能够输出
hello world!,此外,使用fmt.Print("hello, world")可以得到相同的输出结果。
变量声明
Go的数据类型主要包括字符串(string)、数字(整数int/浮点数float) 及 布尔型(bool),一般通过var对变量进行声明:var identifier type ,这种声明方式为显式声明,即我们需要注明数据类型。
不注明类型的则为隐式声明,如var a = "initial"可以声明一个字符串变量 a ,var d = true 可以声明一个布尔型变量 d 表示 true。
var identifier1, identifier2 type能够同时声明多个变量,如var b, c int = 1, 2。
for循环
当我们需要重复执行一段代码时,可以使用for 循环,for 循环由三个关键部分组成:初始化、条件和迭代。以下是一段go的for循环代码示例,展示了4段不同的for循环。
package main
import "fmt"
func main() {
i := 1
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
}
- 第一段 for 循环中,调用了fmt包的Println函数,并直接通过
break终止了循环,因此该段循环的输出结果为loop - 第二段 for 循环中,初始化阶段通过设置了一个计数器变量
j := 7;条件阶段检查j < 9,只要条件为真,循环就会一直执行。迭代阶段通过j++递增,使得条件最终不满足,循环结束。循环执行时,将依次输出j的值。 - 第三段 for 循环中,初始化阶段通过设置变量
n := 0;条件阶段检查n < 5;循环执行时,使用条件语句 if 判断n%2 == 0,当条件为真时,直接由continue进入下一轮 for 循环,否则继续执行该轮循环余下代码,依次输出当前n的值。 - 由于已经声明过
i := 1,第四段 for 循环不需重复初始化阶段,而是直接写出循环条件i <= 3,在循环过程中通过i = i + 1语句使i递增,从而终止循环。
上述代码的输出结果如下所示,此外,在写 for 循环时,需注意我们的代码中对循环是否继续执行的条件判断,以免导致无法结束循环。
loop
7
8
1
3
1
2
3
常用特性
并发编程
Go 语言在并发编程方面具有很强的支持,它提供了一些特性和工具来简化并发编程的实现和管理。 Goroutine(协程) 是 Go 语言中轻量级的并发执行单元,与传统的线程相比,Goroutine 的创建和销毁开销非常小。Channel(通道) 是 Goroutine 之间进行通信和同步的管道。用于安全地传递数据和消息。通过 Channel,Goroutine 可以在发送和接收操作之间进行同步等待,实现了高效的并发编程。
内存回收
Go 语言采用的是自动垃圾回收机制(Garbage Collection,GC),开发者不需要手动管理内存,而是由垃圾回收器负责在程序运行时自动回收不再使用的内存。这使得开发者不需要过多关心内存管理的细节,可以专注于业务逻辑的实现。垃圾回收器会自动识别和回收不再使用的内存,提高了编程效率和代码的可靠性。