作为开篇课程,介绍了go语言的发展历程与特点——高并发,丰富标准库,无需借助比较大型复杂的第三方组件库
我以Java语言作为参照物,感觉书写风格更类似js,在第一节课中我,判断语句if else也与java类似,只不过舍弃了条件外的括号,go中的循环有且只有for循环,不加条件即为死循环,选择语句switch ,case分支中无需写break,执行对应case后会跳出循环,切片是可变长度的数组,类似于java的创建动态数组,go中的map(哈希数组)遍历类似于随机遍历,函数格式func name (参数 参数类型) 类型 { .... return value 错误信息},指针用于修改数据,格式为func name (参数 *参数类型) 类型 { *n +=2 },结构体,类似java中的类,格式为type 名称 struct{参数 参数类型},在函数中使用结构体格式为 变量:=名称{参数:“参数类型”},结构体中定义方法,类似于类成员函数,即定义在类内部的函数,go的错误处理 没有异常机制,而是通过返回值来表示可能出现的错误,字符串操作也与Java类似,go的标准库也提供了许多字符串操作,切割,查询位置,转换大小写等等,字符串的格式化%v/n,%+v/n,%#v/n输出详细程度逐渐增加,go的json处理也基于提供的标准库,与字符串操作一样,提供了许多操作,将对象编码为 JSON jsonData, err := json.Marshal(person),将 JSON 解码为对象 err := json.Unmarshal([]byte(jsonData), &person)
go的时间处理与数字解析也基于标准库提供的包,如时间处理中的工具类似于js等的时间戳,定时器,时间计算等等,在 Go 语言中,可以使用 os 和 os/exec 包来获取进程信息,以及创建和管理进程
Go语言是一种静态类型的编译型语言,旨在简化开发并提供强大的并发支持。以下是Go语言的一些常用特性解析,涵盖基本数据类型、内存管理、并发模型、错误处理等。
1. 简洁的语法和强类型系统
Go采用简洁的语法,类似C语言,但移除了不必要的复杂特性(如C++的继承和泛型),并引入了清晰的类型系统:
学习了变量——go是强类型语言,意味着每种变量都有对应类型,书写格式为var 变量 = value|变量:=value,值得一提的是const常量并没有具体类型,它会根据上下文判断类型
- 变量声明:支持短变量声明
:=,简化了变量的定义。 - 类型推断:编译器会根据右侧的值推断类型。
- 多值返回:Go支持多返回值,可以直接返回结果和错误信息。
- 基础类型:支持基础的数值类型(
int、float等)、字符串和布尔类型,支持复数类型(complex64和complex128)用于科学计算。
2. 内置集合类型:数组、切片、映射
- 数组:Go的数组是固定大小的,因此在实际使用中较少,更多使用切片。
- 切片(Slice) :动态数组,支持动态扩展。切片是对数组的引用,拥有独立的长度和容量属性。
- 映射(Map) :键值对集合,可以动态扩展,是哈希表的一种实现。
示例:
// 切片和映射的创建
s := []int{1, 2, 3} // 切片
m := make(map[string]int) // 映射
m["key"] = 42
3. 函数和闭包
- 匿名函数和闭包:Go支持匿名函数和闭包,可在函数中定义其他函数并捕获外部变量的值。
- 多返回值:Go语言允许函数返回多个值,常用于返回结果和错误信息。
- 延迟执行(defer) :
defer关键字用于延迟执行一段代码块,通常用于资源清理,例如文件关闭、解锁等。
示例:
func calculate(a, b int) (int, error) {
defer fmt.Println("Calculation finished.") // 延迟执行
if b == 0 {
return 0, fmt.Errorf("division by zero")
}
return a / b, nil
}
4. 错误处理
Go没有异常机制,而是采用显式的错误处理方式,返回错误值并通过条件判断处理。
- 错误接口:标准库定义了
error接口,通过实现Error()方法定义错误。 - 错误链:Go 1.13 引入了
errors.Is和errors.As,用于错误链的处理。
示例:
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
5. 并发模型:Goroutine 和 Channel
Go以轻量级的并发机制著称,使用 Goroutine 和 Channel 实现高效的并发。
- Goroutine:通过
go关键字启动,类似线程,但比线程更轻量级,由Go运行时调度。 - Channel:用于在 Goroutine 之间传递数据,确保线程安全。
示例:
func sayHello() {
fmt.Println("Hello, Go!")
}
func main() {
go sayHello() // 启动一个Goroutine
time.Sleep(time.Second) // 等待Goroutine执行
}
Channel 示例
func main() {
ch := make(chan int) // 创建一个整数Channel
go func() {
ch <- 42 // 发送数据到Channel
}()
result := <-ch // 从Channel接收数据
fmt.Println(result)
}
6. 接口和多态
Go没有传统的类和继承,而是通过接口和结构体组合来实现多态。
- 接口:通过定义方法集实现接口,任何实现这些方法的类型都隐式地实现了该接口。
- 鸭子类型:只要实现了接口的方法即可,不需要显式声明实现。
示例:
type Speaker interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string {
return "Woof!"
}
func greet(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
var d Dog
greet(d) // 输出 "Woof!"
}
7. 包管理和模块化
Go语言内置了包管理机制,通过 import 导入其他包并使用其中的函数和类型。Go Modules(Go 1.11 引入)使得包管理更加便捷。
- 包导入:Go通过
import导入包,包路径与文件夹结构对应。 - Go Modules:
go.mod文件管理依赖,go get命令用于获取和更新依赖。
8. 内存管理与垃圾回收
Go具有自动内存管理和垃圾回收机制,开发者无需手动释放内存。
- 逃逸分析:Go编译器会自动分析变量的分配位置(栈上或堆上),通过减少堆分配提高性能。
- 垃圾回收:Go语言采用标记-清除算法(Mark-Sweep)进行垃圾回收,改进了传统GC的性能问题。
9. 常用工具
- go fmt:格式化代码,保持代码风格一致。
- go vet:静态检查工具,用于检测代码中的潜在问题。
- go test:测试工具,用于编写和运行单元测试。
- go build:编译工具,生成可执行文件。
- go run:编译并直接运行Go程序。
总结
Go语言特性聚焦于高效的并发处理、简洁的语法和强大的内置工具,尤其适合构建高并发网络服务。