一、Go 语言简介
Go 语言(也称为 Golang)是谷歌开发的一种开源编程语言,它具有高效、简洁、并发性强等诸多优点。Go 语言的设计目标是构建具有简单、高效、可靠且易于维护的软件系统,在网络编程、云计算、分布式系统等领域应用广泛。
二、基础语法
(一)变量声明与赋值
-
声明变量
- 在 Go 语言中,可以使用
var关键字声明变量。例如:var a int,这里声明了一个名为a的整数类型变量。变量在声明后会被自动初始化为其类型的零值,对于int类型,零值是0。 - 也可以同时声明多个变量,如
var b, c string,声明了两个字符串类型变量b和c。
- 在 Go 语言中,可以使用
-
变量赋值
- 可以使用
=运算符给变量赋值。例如:a = 10,将10赋给变量a。 - 还可以在声明变量时就进行赋值,这被称为初始化。如
var d = 5,或者使用更简洁的短变量声明方式e := 6(这种方式只能在函数内部使用)。
- 可以使用
(二)数据类型
-
基本数据类型
- 整数类型:包括
int(有符号整数)、uint(无符号整数)等,根据不同的平台,它们的大小可能会有所不同。例如,在 32 位系统上,int可能是 32 位,在 64 位系统上可能是 64 位。此外还有int8、int16、int32、int64和uint8、uint16、uint32、uint64等明确大小的整数类型。 - 浮点数类型:
float32和float64,其中float32占用 4 个字节,float64占用 8 个字节,float64的精度更高。例如:var f float32 = 3.14,var g float64 = 3.1415926。 - 布尔类型:只有
true和false两个值,用于表示逻辑判断的结果。如var h bool = true。 - 字符串类型:使用双引号
"或反引号 ``` 包裹。双引号中的字符串支持转义字符,而反引号中的字符串是原始字符串,不支持转义。例如:var i string = "Hello, World!",var j string =This is a raw string`。
- 整数类型:包括
-
复合数据类型
- 数组:是具有相同类型的元素的集合。例如:
var arr [5]int声明了一个包含 5 个整数的数组。可以通过索引来访问数组元素,如arr[0] = 1。 - 切片:切片是对数组的引用,它可以动态地增长和收缩。例如:
var slice []int = arr[1:3],这里创建了一个切片,它引用了arr数组中索引从 1 到 2(不包括 3)的元素。切片可以使用append函数来添加元素,如slice = append(slice, 4)。 - 结构体:用于组合不同类型的数据。例如:
- 数组:是具有相同类型的元素的集合。例如:
type Person struct {
Name string
Age int
}
var p Person
p.Name = "Alice"
p.Age = 20
定义了一个Person结构体,包含Name和Age两个字段,并创建了一个Person类型的变量p,然后给其字段赋值。
(三)控制流语句
-
条件语句
-
if 语句:用于根据条件执行不同的代码块。例如:
-
if a > 5 {
println("a is greater than 5")
} else {
println("a is less than or equal to 5")
}
-
可以在
if语句中添加初始化语句,如if b := 3; b > 2 {println("b is greater than 2")},这里b的作用域仅限于if语句块。
-
循环语句
-
for 循环:Go 语言中的
for循环有多种形式。最常见的形式是:
-
for i := 0; i < 10; i++ {
println(i)
}
这里初始化变量i为0,只要i小于10,就执行循环体,每次循环后i自增 1。
-
也可以省略初始化语句和后置操作语句,形成一个类似
while循环的形式,如j := 0; for j < 5 {println(j); j++}。 -
还有一种
for - range循环,用于遍历数组、切片、字符串等可迭代的数据类型。例如,遍历一个切片:
slice := []int{1, 2, 3}
for index, value := range slice {
println("Index:", index, "Value:", value)
}
三、常用特性
(一)函数
-
函数定义
-
函数是 Go 语言中的基本代码块,用于封装一段可重复执行的代码。函数定义的一般形式为:
-
func functionName(parameters) returnType {
// 函数体
return value
}
例如:
func add(a, b int) int {
return a + b
}
定义了一个名为add的函数,它接受两个int类型的参数a和b,并返回它们的和。
2. 函数参数传递
-
Go 语言中的函数参数传递是值传递。这意味着在函数内部对参数的修改不会影响到函数外部的变量。例如:
func modify(x int) {
x = 10
}
var y int = 5
modify(y)
println(y) // 输出仍然是5
-
但是如果参数是指针类型,就可以在函数内部修改函数外部变量的值。例如:
func modifyPointer(x *int) {
*x = 10
}
var z int = 5
modifyPointer(&z)
println(z) // 输出是10
(二)并发编程
-
Go 协程(Goroutine)
-
Go 协程是 Go 语言中轻量级的线程。使用
go关键字就可以启动一个协程。例如:
-
func printNumbers() {
for i := 0; i < 10; i++ {
println(i)
}
}
func main() {
go printNumbers()
// 主协程可以继续执行其他任务
for i := 0; i < 5; i++ {
println("Main:", i)
}
}
这里在main函数中启动了一个协程来执行printNumbers函数,同时main协程继续执行自己的循环。
2. 通道(Channel)
-
通道用于协程之间的通信和同步。通道有两种类型:无缓冲通道和有缓冲通道。
-
无缓冲通道:无缓冲通道在发送和接收操作时会阻塞,直到对方准备好。例如:
ch := make(chan int)
go func() {
ch <- 1
}()
value := <-ch
println(value)
这里创建了一个无缓冲通道ch,在一个协程中向通道发送一个整数1,在主协程中从通道接收这个整数并打印。
- 有缓冲通道:有缓冲通道在缓冲区未满或未空时,发送和接收操作不会阻塞。例如:
bufferedCh := make(chan int, 5)创建了一个可以容纳 5 个整数的有缓冲通道。
对Go的理解还不够怎么办,革命尚未成功,同志仍需努力。