〓【球友会】分享IT计算机各类电子书,包括各类编程语言,人工智能,机器学习、深度学习以及各类大数据、算法等内容的电子书
入门进阶GO语言有什么好的书籍推荐?
入门进阶GO语言有什么好的书籍推荐?

入门进阶GO语言有什么好的书籍推荐?

给一份之前帮助身边同事快速入门go语言的文档,仅供参考,掌握基本语法后,合理利用公司项目应该能够帮助你对go语言有一个不错的了解。

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,被称为云计算时代的C语言。

Go语言最大的优势是在于其语言层面就支持并发,并且使用Go编译的程序的运行速度可以媲美C或C++的速度,同时更加安全。

可以直接编译成机器码,运行时不依赖其他库(dll/so),部署就是放一个可执行文件到服务器就可以了。

Go是静态类型语言,在编译时就能检查出大多数问题,但是有动态语言的感觉。

内置强大的工具,例如gofmt工具可以格式化代码,方便团队review。

跨平台编译,如果代码中不包含cgo就可以做到在Windows系统下编译Linux应用

Go语言中约定使用 大小写 来决定常量、变量、类型、接口、结构或函数是否可以被外部包所调用函数名字首字母 小写 即为

关键字来定义。它的类型就是拥有相同参数、相同返回值的一种类型。使用自定义的函数类型我们可以实现多态与函数回调

Go中的defer类型C++中的析构函数,用于在调用结束前做一些收尾清理的工作,例如关闭文件、网络连接等

指针代表某个内存地址的值,Go语言对于指针的支持介于Java和C/C++之间,没有像Java一样取消了对指针的直接操作能力,也避免了C/C++中由于对指针的滥用而造成的安全性和可靠性问题。

。当指针类型为nil时即没有合法指向时,不要通过*p的方式进行操作,否则会出现nil pointer dereference,即空指针间接引用异常。

函数。该函数将创建一个T类型的匿名变量,准确来说是为该类型分配一块新的内存空间,并返回该内存空间的地址,我们可以用指针类型

来接收这个地址。new()函数类似于C语言中的动态申请空间,不过Go语言有内存回收机制,所以开发者只需要申请不需要手动回收内存

另外,由于Go语言在进行函数调用时使用的是值传递,那么假如我要编写一个函数交换两个整形数的值

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。数组的长度必须是常量(不可以是变量),且是类型的组成部分,[2]int和[3]int是不同的类型。

数组的长度在定义后无法修改,并且数组传递是值传递,每次传递都将产生一份副本。Go语言提供了切片来弥补数组的不足。切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案。

Go语言中的map和很多语言一样,是一种键值对的数据结构,键唯一,map可以用基本数据类型作为键值

在Go中可以使用结构体将不同类型的数据组合成一个整体,结构体定义语法如下:

Go以简洁的方式支持了面向对象编程,但并没有传统面向对象编程中的诸多概念,可以通过别的方式实现这些特性:继承:通过方法实现封装:通过匿名字段实现 * 多台:通过接口实现

对象有时需要对外提供可以操作的方法(或者说接口)。和普通函数不同,在定义方法时还需要在函数名前加上要绑定的类型

可以给任意自定义类型(基本类型、结构体)添加方法,但如果自定义的类型本身就是指针类型那么就不能添加方法。一个类型的方法集指的是可以被该类型的值所调用的所有的方法的集合。

方法的继承:在前面的例子中,Student继承了Person,加入我们有绑定Person类型的方法func (p *Person) ShowInfo(){},那么Student类型的变量也可以调用这个方法,这就是方法的继承。

方法的重写:如果Student类型也绑定了一个同名同参数的方法func (p *Student) ShowInfo(){},那么这就是方法的重写,或者说覆盖。那么通过s.ShowInfo()调用的根据就近原则就会优先调用重写的方法。此外,可以显示地通过s.Person.ShowInfo()来调用继承的方法。

Go中接口有以下特点:接口明明习惯以er接口接口只有方法声明,没有实现,没有数据字段 * 接口可以匿名嵌入其他接口,或者嵌入到结构体中

常见问题:并行和并发的区别。并行:同一微观时刻有多条指令在多个处理器上执行并发:同一时刻一个处理器上只能有一条指令在执行,但多个任务队列交替使用该处理器,在宏观上显得是多任务同时执行 Go语言在语言层面就支持了并发。其相关的API是基于CSP(communicating sequential processes,顺序通信进程)模型,这意味着显式的锁是可以避免的,从而简化了程序的编写。

goroutine(协程)是比线程更小的单位,十几个goroutine可能体现在操作系统底层就是五六个线程,Go语言内部实现了goroutine之间的内存共享,执行之只需要极少的栈内存。使用

关键字就可以简单的运行一个goroutine。程序启动时,其主函数main在一个单独的goroutine中运行,称为main goroutine。

并发编程中一个常见的问题是资源竞争问题,为此需要一定的同步机制。goroutine奉行通过通信来共享内存(和同步),而不是共享内存来通信。引用类型channel是CSP模式的具体实现,用于goroutine通讯,其内部实现了同步,确保并发安全。和map类似,channel也是通过make创建的对于底层数据结构的引用。channel传参是引用传递,创建方式:

无缓冲区的channel默认是阻塞的,只有向其中发送了内容后才能从中接收数据。

无缓存的channel是同步的,会阻塞到发送者准备好和接收者也准备好。有缓存的通道是异步的,通道空时,接收者被阻塞;通道满时,发送者被阻塞。不需要再写数据时,可以通过close(ch)来关闭channel,这时x, ok := – ch得到的ok值就为false,那么读数据的进程就可以检查到管道关闭。关闭channel之后再向其发送数据会导致panic。除了在循环中检测ok状态来确定是否结束循环外,还有一个简单的方法可以在管道关闭时结束循环:

单向管道,指定管道只用于读或只用于写,常用场景为生产者消费者模式下生产者只写,消费者只读。

Go提供了关键字select,通过select可以监听channel上的数据流动。select的用法和switch有些类似,但select最大的一条限制就是其下的case语句里必须是一个IO操作

select会按顺序评估有没有语句可以成功执。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注