美文网首页
第三篇:Go语言的主要特性快速全面预览及HelloWorld

第三篇:Go语言的主要特性快速全面预览及HelloWorld

作者: 意一ineyee | 来源:发表于2018-03-28 14:45 被阅读30次

这本书的架构(或者说学习路线)为:
第一章:Go语言的主要特性快速全面预览及HelloWorld
第二章:Go语言面向过程编程
第三章:Go语言面向对象编程
第四章:Go语言并发编程
后面几章:Go语言网络编程、安全编程、工程管理、开发工具、编程进阶的非语法但也很重要的内容


目录

一、Go语言的主要特性快速全面预览

二、HelloWorld


一、Go语言的主要特性快速全面预览

1、垃圾回收机制
2、更丰富的内置数据类型
3、函数可以有多个返回值
4、支持匿名函数和闭包
5、很优雅的错误处理API
6、类和接口:第九篇会专门介绍
7、并发编程:第十篇会专门介绍

1、垃圾回收机制

C语言是不支持垃圾回收机制的,因此在各种牛逼的内存检测算法及内存检测工具出现之前,内存泄漏问题非常得苦恼。之后的语言如C++、C#、Java等都逐步引入了垃圾回收机制。

垃圾回收机制(Garbage Collection)是内存管理的一种方式,是指程序在运行期间会对所有的内存分配动作做记录,也会对所有的内存使用动作做记录,然后垃圾回收器会对所有已分配的内存跟踪监测,一旦发现某块内存不再被任何人使用,就阶段性地回收这些没人使用的内存。(当然,实际中的垃圾回收算法要比这个复杂得多,因为要考虑垃圾回收的性能等问题,但基本原理都是如此。)

Go语言提供了垃圾回收机制来进行内存管理,因此我们就不用想C语言那样用delete关键字或者free()来自己管理内存,系统会自动帮助我们判断内存的使用情况,并在合适的时候(例如CPU空闲的时候)进行垃圾回收的工作。

OC进行内存管理的方式为MRC或ARC,两种方式的本质都是处理一个对象引用计数(Reference Counting)。

MRC(Manual Reference Counting)是指我们手动地管理引用计数,比如我们用allocnewcopy等方法创建一个新对象时,对象的引用计数就会由0变为1,那么当我们不再使用这个对象的时候,就需要让它们调用一下releaseautorelease来释放掉;使用期间,如果要增加一个引用到该对象,就需要调用一下retain来使该对象的引用计数加1,而当这个引用消失时,则需要调用一下releaseautorelease来使该对象的引用计数减1。

ARC(Automatic Reference Counting)其实本质和MRC是一样的,只是在程序编译阶段系统会自动帮我们插入retainreleaseautorelease等内存管理的代码,不需要我们再手动写了而已,这可以很大程度上降低我们开发的出错率并提高开发效率。

由此我们也可以看出,ARC其实是不同于垃圾回收机制的,虽然它们同样都不需要我们手动书写内存管理的语句,但是:

  • ARC并不能解决循环引用的问题,iOS开发中我们还是需要特别注意避免循环引用的出现;
  • ARC只是内存管理的一种方式,它并非强制的,只要我们需要,还可以ARC和MRC混编,或者只使用MRC来管理内存。
2、更丰富的内置数据类型

除了大多数语言都支持的布尔类型整型浮点型等基础数据类型外,Go语言还支持了比较新的语言才支持的字符串数组,还支持了大多数语言靠库的方式才能支持的字典,此外还提供了一个类型叫数组切片,也支持了任意类型。当然还有其它的类型,后面会说到。

OC里面都支持这些类型,或者有类似的功能。

3、函数可以有多个返回值

目前的主流语言中除Python外基本都不支持函数的多返回值功能,不是没有这类需求,可能是语言设计者没有想好该如何提供这个功能,或者认为这个功能会影响语言的美感。

比如我们如果要定义一个函数用于返回个人名字信息,而名字信息因为包含多个部分——姓氏、名字、和别名。

那么如果是OC的话,我们可能会定义一个字典来打包一下作为返回值(当然有别的办法)。如:

(清单1.1)

- (NSDictionary *)getName {
    
    return @{
             @"lastName" : @"王",
             @"firstName" : @"二狗",
             @"nickname" : @"狗子"
             };
}

Go语言革命性地在静态开发语言阵营中率先提供了函数可以有多个返回值。这个特性让开发者可以从原来用各种比较别扭的方式返回多个值的痛苦中解脱出来,不用再只为了返回多个值而专门定义一个数据结构。如:

(清单1.2)

func getName() (lastName, firstName, nickname string) {

    return "王", "二狗", "狗子"
}

获取返回值也十分简单,而且并不是每个返回值都必须赋值的,如果我们不关心其中的某些返回值,可以用下划线_作为占位符来忽略这些返回值,而只关心那些我们想要关心的返回值。如:

(清单1.3)

_, firstName, _ := getName()
4、支持匿名函数和闭包

在Go语言中,所有的函数也是值类型,可以作为参数传递。

匿名函数是指没有名字的函数,闭包是指能访问另一个函数作用域内变量的函数。后面会说到。

OC中没有匿名函数,OC中的block相当于这里说的闭包。

5、很优雅的错误处理API

Go语言引入了3个关键字用于标准的错误处理流程,这3个关键字分别为deferpanicrecover。后面会详细说到,整体上而言与C++和Java等语言中的异常捕获机制相比,Go语言的错误处理机制可以大量减少代码量,这对于代码的阅读和维护都是一件好事。

6、类型和接口
7、并发编程

二、HelloWorld

(清单2.1)

/*
    package,创建与声明包:
    1、每份something.go文件的开头都必须是一个package something的声明,来表明这份Go代码所属的包。包是Go语言里的基本分发单位,也是工程管理关系的体现;
    2、要生成一个Go可执行文件,必须创建一个名为main的包并声明,并且该包中必须包含一个名为main的函数,代表该Go程序的执行起点。
*/
package main

/*
    import,导入包:
    1、在创建与声明包之后,是一系列的import语句,用于导入改程序所依赖的包;
    2、由于该程序使用到了Println函数,所以需要导入该函数所属的fmt包
    3、需要注意的是:不得在源代码中引入未使用的包,否则编译器会报错
*/
import (
    "fmt"
)

/*
    func,函数:
    1、所有的Go函数都以func关键字开头,一个常规的Go函数包含以下部分:
    func 函数名(参数列表)(返回值列表) {

        // 函数体
    }

    2、Go的main函数不能带参数,也不能带返回值。
*/
func main() {

    fmt.Println("Hello World!")
}

/*
    此外,我们可以发现:
    1、Go语言并不要求我们在每个语句后面写分号表示语句的结束
    2、所有花括号{}的做花括号不能另起一行,否则编译会报错
*/

控制台输出:

Hello World!
成功: 进程退出代码 0.

相关文章

网友评论

      本文标题:第三篇:Go语言的主要特性快速全面预览及HelloWorld

      本文链接:https://www.haomeiwen.com/subject/rjnhqftx.html