Go语言最主要的特性

  • 自动垃圾回收
  • 更丰富的内置类型
  • 函数多返回值
  • 错误处理
  • 匿名函数和闭包
  • 类型和接口
  • 并发编程
  • 反射
  • 语言交互性

更丰富的内置类型


数组,字符串,字典(Map),数组切片(Slice)

因为是语言内置特性,开发者根本不用费事去添加依赖的包,既可以少一些输入工作量,也 可以让代码看起来尽量简洁。


函数多返回值


目前的主流语言中除Python外基本都不支持函数的多返回值功能 Go语言革命性地在静态开发语言阵营中率先提供了多返回值功能

在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的匿名函数,开发者可以随意对该匿名函数变量进行传 递和调用:


f := func(x, y int) int {   

    return x + y

}   



类型和接口


Go语言的类型定义非常接近于C语言中的结构(struct),甚至直接沿用了struct关键字。相 比而言,Go语言并没有直接沿袭C++和Java的传统去设计一个超级复杂的类型系统,不支持继承和重载,而只是支持了最基本的类型组合功能。 巧妙的是,虽然看起来支持的功能过于简洁,细用起来你却会发现,C++和Java使用那些复 杂的类型系统实现的功能在Go语言中并不会出现无法表现的情况,这反而让人反思其他语言中 引入这些复杂概念的必要性。我们在第3章中将详细描述Go语言的类型系统。 Go语言也不是简单的对面向对象开发语言做减法,它还引入了一个无比强大的“非侵入式” 接口的概念,让开发者从以往对C++和Java开发中的接口管理问题中解脱出来。在C++中,我们 通常会这样来确定接口和类型的关系:


显然,在实现一个接口之前必须先定义该接口,并且将类型和接口紧密绑定,即接口的修改 会影响到所有实现了该接口的类型,而Go语言的接口体系则避免了这类问题


并发编程


Go语言引入了goroutine概念,它使得并发编程变得非常简单。通过使用goroutine而不是裸用 操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并 发编程变得更加轻盈和安全。


通过在函数调用前使用关键字go,我们即可让该函数以goroutine方式执行. goroutine是一种 比线程更加轻盈、更省资源的协程


Go语言通过系统的线程来多路派遣这些函数的执行,使得 每个用go关键字执行的函数可以运行成为一个单位协程。当一个协程阻塞的时候,调度器就会自 动把其他协程安排到另外的线程中去执行,从而实现了程序无等待并行化运行。而且调度的开销 非常小,一颗CPU调度的规模不下于每秒百万次,这使得我们能够创建大量的goroutine,从而可 以很轻松地编写高并发程序,达到我们想要的目的。


Go语言实现了CSP(通信顺序进程,Communicating Sequential Process)模型来作为goroutine 间的推荐通信方式


语言交互性


由于Go语言与C语言之间的天生联系,Go语言的设计者们自然不会忽略如何重用现有C模块 的这个问题,这个功能直接被命名为Cgo。Cgo既是语言特性,同时也是一个工具的名称。 在Go代码中,可以按Cgo的特定语法混合编写C语言代码,然后Cgo工具可以将这些混合的C 代码提取并生成对于C功能的调用包装代码。开发者基本上可以完全忽略这个Go语言和C语言的 边界是如何跨越的。


猜你喜欢

转载自blog.csdn.net/zengchen73/article/details/81048097