go语言特性

强类型静态编译型语言。

  1. 更丰富的内置类型
    关键在于内置,像map、slice这些常用的数据类型,内置于builtin,默认包含,无需自己添加。

  2. 函数多返回值
    多值返回仅动态语言Python有此特性

    在C中如果想返回多个值,通常会在调用函数中分配返回值的空间,并将返回值的指针传给被调函数。Go的做法是在传入的参数之上留了两个空位,被调者直接将返回值放在这两空位。Go是使用栈空间来返回值的。而常见的C语言是通过寄存器来返回值的。

  3. 错误处理

    3个重要关键字defer、panic、recover

    defer是函数结束后执行,呈先进后出;

    panic是程序出现无法修复的错误时使用,但会让defer执行完;

    recover会修复错误,不至于程序终止。当不确定函数不会出错时使用defer+recover

  4. 匿名函数和闭包
    匿名函数就是一个没有名字的函数,本身也是一个闭包。

    Go中的函数也可以作为参数进行传递,拥有函数名的函数只能在包级语法块中被声明,而闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。

  5. 类型和接口

    类型非常接近于C语言中的结构体,也使用了struct。go语言类型不支持继承和重载,仅有封装和组合。go语言引入了强大的“非侵入式”接口,无需指明类型实现了哪个接口。

    Go语言没有很复杂的面向对象的概念,即没有继承和重载,其类型更像是C中的struct,并且直接使用了struct关键字,仅仅是最基本的类型组合功能。因为Go除Interface类型外的任何其它数据类型都可以定义其method,类型的方法和普通函数定义类似,只是前面多了一个对象接收者receiver,可以把Go中的struct看作是不支持继承行为的轻量级的“类”。

    go中的接口和C++中的纯虚基类 (只有虚函数,没有数据成员)类似,即便不是典型的oo语言,但依然可以通过接口实现OOP的多态。在Go语言中,任何实现了接口的函数的类型,都可以 看作是接口的一个实现。 类型在实现某个接口的时候,不需要显式关联该接口的信息。接口的实现 和接口的定义完全分离了。如果要模拟C++中类的继承机制,可以使用匿名成员。

  6. 并发编程
    go语言倡导使用消息传递来共享内存,引入了goroutine概念,这是一个协程,更轻量级的线程。与channel搭配使用。

    Go语言引入了goroutine概念,它使得并发编程变得非常简单。通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。通过在函数调用前使用关键字go,我们即可让该函数以goroutine方式执行,goroutine是一种比线程更加轻盈、更省资源的协程。

    Go语言实现了CSP(通信顺序进程)模型来作为goroutine间的推荐通信方式,在CSP模型中,一个并发系统由若干并行运行的顺序进程组成,每个进程不能对其他进程的变量赋值。进程之间只能通过一对通信原语实现协作。Go语言用channel(通道)这个概念来轻巧地实现了CSP模型。channel的使用方式比较接近Unix系统中的管道(pipe)概念,可以方便地进行跨goroutine的通信。

    由于一个进程内创建的所有goroutine运行在同一个内存地址空间中,因此如果不同的goroutine不得不去访问共享的内存变量,访问前应该先获取相应的读写锁。Go语言标准库中的sync包提供了完备的读写锁功能。”

  7. 反射
    通过反射,你可以获取对象类型的详细信息,并可动态操作对象。反射是把双刃剑,功能强大但代码可读性并不理想。若非必要,不推荐使用反射。

    一类应用,它们能够自描述和自控制,反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制。Golang的reflect反射包提供了两个方法分别是reflect.ValueOf() 和 reflect.TypeOf()

  8. 语言交互性
    由于Go语言与C语言之间的天生联系,Go语言的设计者们自然不会忽略如何重用现有C模块 的这个问题,这个功能直接被命名为Cgo。Cgo既是语言特性,同时也是一个工具的名称。

    cgo,只要不使用C的标准库函数,Go中是可以直接调用C和汇编语言的,Go的运行时库就是用C和汇编实现的。使用时函数名以·开头,C文件中需要包含runtime.h头文件(Go用了特殊寄存器来存放像全局的struct G和struct M。包含这个头文件可以让所有链接到Go的C文件都知道这一点,这样编译器可以避免使用这些特定的寄存器作其它用途。)

  9. 自动垃圾回收
    能够像java、C#等语言自带GC,不用再为内存管理苦恼。

    Go用了特殊寄存器来存放像全局的struct G和struct M。包含这个头文件可以让所有链接到Go的C文件都知道这一点,这样编译器可以避免使用这些特定的寄存器作其它用途。


 

你可能感兴趣的:(Go,go,go特性,go语言特性)