- A+
学习Go初衷:主要是为了读懂go-ethereum源码,理解以太坊区块链的底层实现。
目标:1.理解Go语言特性;2.了解Go语言基本语法
学习材料:《Go In Action》
一、用Go解决现代编程难题
作为一门语言,Go不仅定义了能做什么,还定义了不能做什么。
Go语言的语法简洁到只有几个关键字,便于记忆
Go语言的编译器速度非常快
Go语言内置并发机制
Go语言的类型系统简单且高效
Go语言自带垃圾回收器
1.开发速度(编译快、编译检查)
编译Go程序时,编译器只会关注那些直接被引用的库。
编译器能帮用户捕获类型错误
2.并发(goroutine+通道)
Go语言对并发的支持是这门语言最重要的特性之一。
goroutine很像线程,但是它占用的内存远少于线程,使用它需要的代码更少。
通道(channel)是一种内置的数据结构,可以让用户在不同的goroutine之间同步发送具有类型的消息。这让编程模型更倾向于在goroutine之间发送消息,而不是让多个goroutine争夺同一个数据的使用权。
A.goroutine
goroutine是可以与其他goroutine并行执行的函数,同时也会与主程序(程序的入口)并行执行。
Go语言中会使用同一个线程来执行多个goroutine.
goroutine使用的内存比线程更少,Go语言运行时会自动在配置的一组逻辑处理器上调度执行goroutine。每个逻辑处理器绑定到一个操作系统线程上.这让用户的应用程序执行效率更高,而开发工作量显著减少。
代码示例:go log("发生了可怕的事情");
关键字go是唯一需要去编写的代码,调度log函数作为独立的goroutine去运行,以便与其他goroutine并行执行。
goroutine占用的资源更少,所以常常能启动成千上万个goroutine。
B.通道(保证数据安全)
通道是一种数据结构,可以让goroutine之间进行安全的数据通信。通道可以帮用户避免其他语言里常见的共享内存访问的问题。
通道这一模式保证同一时刻只会有一个goroutine修改数据。通道用于在几个运行的goroutine之间发送数据。
需要强调的是,通道并不提供跨goroutine的数据访问保护机制。如果通过通道传输数据的一份副本,那么每个goroutine都持有一份副本,各自对自己的副本做修改是安全的。当传输的是指向数据的指针时,如果读和写是由不同的goroutine完成的,每个goroutine依旧需要额外的同步动作。
3.Go语言的类型系统(代码复用)
Go语言提供了灵活的、无继承的类型系统,无需降低运行性能就能最大程度上复用代码。
Go 开发者使用组合(composition)设计模式,只需简单地将一个类型嵌入到另一个类型,就能复用所有的功能。在Go语言中,一个类型由其他更微小的类型组合而成,避免了传统的基于继承的模型。
Go语言还具有独特的接口实现机制,允许用户对行为进行建模,而不是对类型进行建模。在Go语言中,不需要声明某个类型实现了某个接口,编译器会判断一个类型的实例是否符合正在使用的接口。Go标准库里的很多接口都非常简单,只开放几个函数。从实践上讲,尤其对那些使用类似Java的面向对象语言的人来说,需要一些时间才能习惯这个特性。
A.类型简单
Go语言不仅有类似int和string这样的内置类型,还支持用户定义的类型。在Go语言中,用户定义的类型通常包含一组带类型的字段,用于存储数据。
Go语言的类型可以声明操作该类型数据的方法。
Go开发者构建小的类型,然后组合成大类型,避免了继承的模型。
B.Go接口对一组行为建模
接口用于描述类型的行为。
如果一个类型的实例实现了一个接口,意味着这个实例可以执行一组特定的行为。你甚至不需要去声明这个实例实现某个接口,只需要实现这组行为就好。其他的语言把这个特性叫作鸭子类型——如果它叫起来像鸭子,那它就可能是只鸭子。
用户几乎可以给所有包含数据的类型实现 io.Reader 接口,然后把这个类型的实例传给任意一个知道如何读取io.Reader 的 Go 函数。
Go 语言的整个网络库都使用了 io.Reader 接口,这样可以将程序的功能和不同网络的实现分离。这样的接口用起来有趣、优雅且自由。文件、缓冲区、套接字以及其他的数据源都实现了 io.Reader 接口。使用同一个接口,可以高效地操作数据,而不用考虑到底数据来自哪里。
4.内存管理
Go语言的垃圾回收会有一些额外的开销,但是编程时,能显著降低开发难度。Go语言把无趣的内存管理交给专业的编译器去做,而让程序员专注于更有趣的事情。
二、Hello World
1.import语句用于导入外部代码;main函数是程序执行的入口
2.无须在机器上安装Go语言,在浏览器中就可以使用几乎所有Go语言的功能。
Go Playground允许在浏览器里编辑并运行Go语言代码。地址: http://play.golang.org
3.要给想要学习写东西或者寻求帮助的同事或者朋友演示某个想法时,Go Playground是非常好的方式。
三、总结
1.go语言特性
2.语言学习环境 https://play.golang.org/
补充:IDE选择liteide