1 丰富的内置类型
2 函数多返回值
3 Go 的错误处理 : Go 语言引入了 3 个关键字用于标准的错误处理流程, 这 3 个关键字分别为 defer, panic 和 recover
4 在 Go 语言中, 所有的函数也是值类型: 可以作为参数传递.
5 类型和接口
Go 语言的类型定义非常接近于 C 语言中的结构(struct), 甚至直接沿用了 struct 关键字. 相
比而言, Go 语言并没有直接沿袭 C++ 和 Java 的传统去设计一个超级复杂的类型系统, 不支持继承
和重载, 而只是支持了最基本的类型组合功能.
它还引入了一个无比强大的 "非侵入式" 接口的概念, 让开发者从以往对 C++ 和 Java 开发中的接口管理问题中解脱出来.
在 C++ 和 java 中, 在实现一个接口之前必须先定义该接口, 并且将类型和接口紧密绑定, 即接口的修改
会影响到所有实现了该接口的类型, 而 Go 语言的接口体系则避免了这类问题, 比较松散的对应关系可以大幅降低因为接
口调整而导致的大量代码调整工作.
6 并发编程
通过在函数调用前使用关键字 go, 我们即可让该函数以 goroutine 方式执行. goroutine 是一种
比线程更加轻盈, 更省资源的协程. Go 语言通过系统的线程来多路派遣这些函数的执行, 使得
每个用 go 关键字执行的函数可以运行成为一个单位协程. 当一个协程阻塞的时候, 调度器就会自
动把其他协程安排到另外的线程中去执行, 从而实现了程序无等待并行化运行. 而且调度的开销
非常小, 一颗 CPU 调度的规模不下于每秒百万次, 这使得我们能够创建大量的 goroutine, 从而可
以很轻松地编写高并发程序, 达到我们想要的目的.
Go 语言实现了 CSP(通信顺序进程, Communicating Sequential Process)模型来作为 goroutine
间的推荐通信方式. 在 CSP 模型中, 一个并发系统由若干并行运行的顺序进程组成, 每个进程不
能对其他进程的变量赋值. 进程之间只能通过一对通信原语实现协作. Go 语言用 channel(通道)
这个概念来轻巧地实现了 CSP 模型. channel 的使用方式比较接近 Unix 系统中的管道 (pipe) 概念,
可以方便地进行跨 goroutine 的通信.
另外, 由于一个进程内创建的所有 goroutine 运行在同一个内存地址空间中, 因此如果不同的
goroutine 不得不去访问共享的内存变量, 访问前应该先获取相应的读写锁. Go 语言标准库中的
sync 包提供了完备的读写锁功能.
- // mainfile
- package main
- import (
- "fmt"
- )
- func sum(values []int, resultChan chan int) {
- sum := 0
- for _, value := range values {
- sum += value
- }
- resultChan <- sum // 将计算结果发送到 channel 中
- }
- func main() {
- values := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- resultChan := make(chan int, 2)
- go sum(values[:len(values)/2], resultChan)
- go sum(values[len(values)/2:], resultChan)
- sum1, sum2 := <-resultChan, <-resultChan // 接收结果
- fmt.Println("Result:", sum1, sum2, sum1+sum2)
- }
7 Go 的 反射
8 GO 语言交互性
来源: http://www.bubuko.com/infodetail-3012941.html