Go语言是一门简洁、高效的编程语言,适用于开发各种应用程序。
基础语法
1. 定义变量和常量
在Go语言中,可以使用关键字 var 来定义变量,使用关键字 const 来定义常量。
var x int = 100; // 定义一个整型变量
const PI = 3.1415926 // 定义一个常量
2. 控制流语句
Go语言支持if、for、switch等控制结构。
if 和 switch 结构用于条件判断,for 结构用于循环。
// if 结构
if x > 0 {
fmt.Println("x 为正数")
} else if x < 0 {
fmt.Println("x 为负数")
} else {
fmt.Println("x 为零")
}
// for 结构
for i := 0; i < 10; i ++ {
fmt.Println(i)
}
// switch 结构
switch x {
case 1:
fmt.Println("x 为 1")
case 2:
fmt.Println("x 为 2")
default:
fmt.Println("x 既不是 1 也不是 2")
}
3. 函数
Go语言中的函数以关键字 func 开始,可以接受多个参数,可以返回一个或多个值。
func add(a, b int) int {
return a + b
}
sum := add(1, 2) // 调用函数并赋值给 sum 变量
fmt.Println(sum)
4. 结构体和方法
Go语言支持结构体,可以将多个字段组合成一个自定义类型。
结构体中还可以定义方法,这些方法可以在特定类型的变量上调用。
type person struct {
name string
age int
}
func (p person) introduction() {
fmt.Println("Hello, my name is", p.name)
}
p := person{name: "Sue", age: 19}
p.introduction()
5. 数组和切片
Go语言中的数组是一种固定长度的数据结构,可以通过下标访问数组元素。
切片是对数组的一种封装,可以动态地2增加或删除元素。
// 数组
var a [3]int // 声明长度为 3 的整型数组
a[0] = 1 // 将第一个元素赋值为 1
// 切片
s := []int{1, 2, 3} // 创建一个含有 3 个元素的整型切片
s = append(s, 4) // 向切片中添加元素 4
6. 指针和引用
Go语言支持指针和引用类型。
指针类型用于存储变量的内存地址,可以通过 * 运算符访问指针指向的值。
引用类型是一种动态分配内存的数据类型,包括切片、映射和通道等。
// 指针
var p *int // 声明一个整型指针变量
x := 100
p = &x // 将 x 的地址赋值给指针变量 p
*p = 10 // 通过指针变量改变 x 的值
// 引用(映射)
m := make(map[string]int) // 创建一个映射
m["a"] = 1 // 向映射中添加一个键值对
v := m["a"] // 从映射中取出键为 "a" 的值
常用特性
更丰富的内置类型
数组,字符串,字典(Map),数组切片(Slice)
语言内置的特性使得开发者根本不用费事去添加依赖的包,既可以少一些输入工作量,也可以让代码看起来尽量简洁。
函数多返回值
在Go语言中可以进行如下的操作:
func getName()(firstName, middleName, lastName, nickName string) {
return "May", "M", "Chen", "Babe"
}
因为返回值都已经有了名字,因此各个返回值也可以用如下方式来在不同位置进行赋值,从而提供了较大的灵活性:
func getName()(firstName, middleName, lastName, nickName string) {
firstName = "May"
middleName = "M"
lastName = "Chen"
nickName = "Babe"
return
}
错误处理
Go语言引入了 3 个关键字用于标准的错误处理流程,这 3 个关键字分别为 defer、panic 和 recover。
匿名函数和闭包
在Go语言中,所有的函数也是值类型,可以作为参数传递。Go语言支持常规的匿名函数和闭包,如下所示,开发者可以随意对该匿名函数变量进行传递和调用。
f := func(x, y int) int {
return x + y
}
类型和接口
Go语言的类型定义非常接近C++中的结构(struct),甚至直接沿用可了 struct 关键字。但是,Go语言并没有直接沿用C++的传统去设计一个超级复杂的类型系统,不支持继承和重载,而只是支持了最基本的类型组合功能。虽然Go语言看起来支持的功能过于简洁,但那些复杂的功能依然可以在Go语言中实现。
Go语言也不是简单的面对对象开发语言做减法,它还引入了一个无比强大的“非侵入式”接口的概念,让开发者从C++开发中的接口管理问题中解脱出来。
并发编程
Go语言中引入了 goroutine 概念,它使得并发编程变得非常简单。通过使用 goroutine 而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。
通过在函数调用前使用关键字 go,我们即可让该函数以 goroutine 方式执行。goroutine 是一种比 线程更加轻盈、更省资源的协程。
Go语言通过系统的线程来多路派遣这些函数的执行,使得每个用 go 关键字执行的函数可以运行成为一个单位协程。当一个协程阻塞的时候,调度器就会自动把其他协程安排到另外的线程中去执行,从而实现了程序无序等待并行化运行。
Go语言实现了CSP(通信顺序进程,Communicating Sequential Process)模型来作为 goroutine 间推荐的通信方式。
语言交互性
由于Go语言与C语言之间的天生联系,Go语言的设计者没有重用现有C模块,这个功能直接被命名为 Cgo。
Cgo 既是语言特性,同时也是一个工具的名称。在Go代码中,可以按 Cgo 的特定语法混合编写C语言代码,然后 Cgo 工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。
对于Go语言的学习是一次非常有意义的探索,它的设计简单优雅,语法简单明了,规范清晰使得代码易于编写、阅读和维护。它剔除了一些冗余和复杂的特性,注重简洁性和可读性,从而提高了代码的可维护性和可靠性。同时Go语言的学习需要持续的练习和实践,可以通过编写小项目、参与开源项目和阅读优秀的源代码来提高自己的技能的同时,应该多与他人交流和分享经验,共同成长。无论是构建高性能的后端服务,还是开发分布式的Web应用,Go语言都是一个强大而灵活的工具,帮助我们构建高效、可靠的应用程序。