Go语言的函数特别之处
支持多返回值
函数可以作为参数传递
Go语言中的函数可以作为参数传递给其他函数。
匿名函数
Go支持匿名函数(即没有名字的函数)。这种特性使得你可以动态定义函数并直接使用它。
闭包
Go支持闭包,即可以在函数内部定义函数,并让内部函数访问外部函数的变量。
函数作为类型
在Go中,函数可以作为一种类型,这意味着你可以声明一个函数类型,并使用它来定义变量。
变长参数
Go语言支持变长参数(...)。这意味着你可以在函数中接收任意数量的参数,甚至是零个参数
延迟调用
Go语言提供了defer关键字,允许你在函数退出时执行某些操作,通常用于资源清理等操作。defer语句会按照调用顺序倒序执行。
Go语言的指针
Go语言通过简化指针的操作,避免了很多复杂的内存管理问题。它允许程序直接操作内存地址。指针在Go中起着重要作用,尤其是在处理大数据结构和提高性能时。
Go语言通过 * 和 & 操作符来操作指针。
- *表示指针类型的解引用,用来访问指针指向的值。
- & 用于获取变量的地址(即创建指针)。
Go语言的接口
Go语言中的接口具有以下特性:
- 隐式实现:类型自动实现接口,无需显式声明。
- 空接口:可以表示任何类型。
- 零值:接口的零值是 nil。
- 多态:接口用于实现多态,使得不同类型可以通过同一个接口调用方法。
- 组合:接口可以通过组合来继承其他接口。
- 类型断言和类型检查:可以动态获取接口的具体类型。
- 灵活性:接口在Go语言中非常灵活,可用于各种场景,如函数参数、返回值等。
Go语言的错误处理
- 显式错误返回:函数返回两个值,第一个是结果,第二个是 error 类型,要求显式处理错误。
- error 接口:错误类型实现了 error 接口,必须定义 Error() 方法。
- 自定义错误类型:可以创建自定义类型并实现 Error() 方法,以定义特定的错误信息。
- 格式化错误:fmt.Errorf 用于创建带有格式化信息的错误。
- 错误链(Error Wrapping):Go 1.13 引入了错误链,允许在错误中嵌套原始错误,并通过 %w 传递。
- defer 关键字:用于确保函数退出时资源(如文件、连接)被正确释放。
- 强制错误检查:Go 强制开发者显式检查返回的错误,避免错误被忽略。
Go语言的并发
- Goroutines:Go 通过轻量级的执行单元(goroutine)实现并发,创建和销毁开销小,数量大时性能优越。
- Channel:Go 提供了 channel 作为 goroutine 之间通信的机制,支持同步和数据传输,确保数据安全。
- 选择器(select):通过 select 语句,Go 可以在多个 channel 上进行等待和选择,支持多路复用。
- 并发安全:Go 提供了同步原语,如 sync.Mutex 和 sync.RWMutex,以实现并发安全的数据访问。
- 内存模型:Go 的内存模型确保并发环境中的数据一致性,goroutines 之间通过 channel 或同步原语共享数据。
- 调度器:Go 内置的调度器管理 goroutine 的调度和运行,能够高效地利用多核处理器。
- 无锁编程:Go 鼓励使用 goroutine 和 channel 来避免锁的复杂性,减少并发中的常见问题。