强类型静态编译型语言。
更丰富的内置类型
函数多返回值
- 在C中如果想返回多个值,通常会在调用函数中分配返回值的空间,并将返回值的指针传给被调函数。Go的做法是在传入的参数之上留了两个空位,被调者直接将返回值放在这两空位。Go是使用栈空间来返回值的。而常见的C语言是通过寄存器来返回值的。
错误处理
- defer、panic、recover
匿名函数和闭包
- Go中的函数也可以作为参数进行传递,拥有函数名的函数只能在包级语法块中被声明,而闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。
类型和接口
Go语言没有很复杂的面向对象的概念,即没有继承和重载,其类型更像是C中的struct,并且直接使用了struct关键字,仅仅是最基本的类型组合功能。因为Go除Interface类型外的任何其它数据类型都可以定义其method,类型的方法和普通函数定义类似,只是前面多了一个对象接收者receiver,可以把Go中的struct看作是不支持继承行为的轻量级的“类”。
go中的接口和C++中的纯虚基类 (只有虚函数,没有数据成员)类似,即便不是典型的oo语言,但依然可以通过接口实现OOP的多态。在Go语言中,任何实现了接口的函数的类型,都可以 看作是接口的一个实现。 类型在实现某个接口的时候,不需要显式关联该接口的信息。接口的实现 和接口的定义完全分离了。如果要模拟C++中类的继承机制,可以使用匿名成员。
并发编程
Go语言引入了goroutine概念,它使得并发编程变得非常简单。通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。通过在函数调用前使用关键字go,我们即可让该函数以goroutine方式执行,goroutine是一种比线程更加轻盈、更省资源的协程。
Go语言实现了CSP(通信顺序进程)模型来作为goroutine间的推荐通信方式,在CSP模型中,一个并发系统由若干并行运行的顺序进程组成,每个进程不能对其他进程的变量赋值。进程之间只能通过一对通信原语实现协作。Go语言用channel(通道)这个概念来轻巧地实现了CSP模型。channel的使用方式比较接近Unix系统中的管道(pipe)概念,可以方便地进行跨goroutine的通信。
由于一个进程内创建的所有goroutine运行在同一个内存地址空间中,因此如果不同的goroutine不得不去访问共享的内存变量,访问前应该先获取相应的读写锁。Go语言标准库中的sync包提供了完备的读写锁功能。”
反射
一类应用,它们能够自描述和自控制,反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制。Golang的reflect反射包提供了两个方法分别是reflect.ValueOf() 和 reflect.TypeOf()
todo
语言交互性
- cgo,只要不使用C的标准库函数,Go中是可以直接调用C和汇编语言的,Go的运行时库就是用C和汇编实现的。使用时函数名以·开头,C文件中需要包含runtime.h头文件(Go用了特殊寄存器来存放像全局的struct G和struct M。包含这个头文件可以让所有链接到Go的C文件都知道这一点,这样编译器可以避免使用这些特定的寄存器作其它用途。)
自动垃圾回收
- Go用了特殊寄存器来存放像全局的struct G和struct M。包含这个头文件可以让所有链接到Go的C文件都知道这一点,这样编译器可以避免使用这些特定的寄存器作其它用途。