Go语言学习笔记

昨天忙完抽空花了点时间在https://golangbot.com/learn-golang-series/ 学习Go语言,环境我是早搭建了,也就写了个HelloWorld。昨天在那个教程上学习了1-17,整个语法感觉还是很像C语言的,唯一让我觉得怪异的就是类型后置,不过这是都是基础,go的核心是在并发处理上,接下来往后学习相关教程,顺便看看https://github.com/ethereum/go-ethereum,早日上手区块链相关。

 

8月17日增补

昨天小程序已经上线,今天打算利用一天时间学完整个golang教程,为下一步区块链做准备。学完基础倒是没觉得有什么特别的,学到concurrency和oop这两章,OOP的三大特性:封装,继承,多态。golang使用自己的方式实现了,struct实现封装,继承。struct里面可以套用匿名struct这算是go的一种特性。对于多态,则使用interface实现掉。

对于并发核心就是goroutine,降低了并发的开发成本。使用go关键字就new了一个goroutine,或者说是一个线程。主函数就是在一个单独的goroutine中运行,即main goroutine。这就有点像iOS的runloop,不过iOS是消息驱动类型的,runloop作用是获取消息和处理事件。题外话,node不就是事件驱动,单线程非阻塞,eventloop获取event,到event handler,处理完成继续event loop。不过node其实是支持多进程的cluster,另外非阻塞实际上IO,异步都是在内部子线程处理。

  • Goroutines are extremely cheap when compared to threads. They are only a few kb in stack size and the stack can grow and shrink according to needs of the application whereas in the case of threads the stack size has to be specified and is fixed.
  • The Goroutines are multiplexed to fewer number of OS threads. There might be only one thread in a program with thousands of Goroutines. If any Goroutine in that thread blocks say waiting for user input, then another OS thread is created and the remaining Goroutines are moved to the new OS thread. All these are taken care by the runtime and we as programmers are abstracted from these intricate details and are given a clean API to work with concurrency.
  • Goroutines communicate using channels. Channels by design prevent race conditions from happening when accessing shared memory using Goroutines. Channels can be thought of as a pipe using which Goroutines communicate. We will discuss channels in detail in the next tutorial.

对于channel,就是读取写入阻塞的队列。select就是多个阻塞队列任意又一个不再阻塞,select就会被执行。mutex就是互斥,和channel搭配使用。

f() //普通阻塞方法
go f() //创建一个新的goroutine然后执行该方法

ch := make(chan int) // 可以写入读写int类型的channel ch <- x //写入 ch = <-ch //读取 <-ch //读取并直接舍弃 func hello(done chan bool) { fmt.Println("Hello world goroutine") done <- true } func main() { done := make(chan bool) go hello(done) <-done fmt.Println("main function") }

defer 表示延迟方法延迟到return之前最后执行,不过如果是defer stack(defer列表),按照last in first out原则。自定义error,使用struct+interface即可。panic主要是用于抛出异常,recover则是捕获这个异常并进行处理,两者必须在同一goroutine中,如果defer a()中加个recover方法,recover方法必须使用defer调用,否则无法捕获,然后 go b()中抛出一个panic,这是无法捕获的,此刻程序就会终止掉。class function则是很像iOS中的block。reflection以为着我们能在运行时获取一个struct的所有变量的type,value。这是高级语言的特性,java,iOS都有这块,不过iOS是要基于runtime获取,java的反射则是spring的基础。

学完了教程,感觉go这块用在后台开发实现高性能是很容易。

发表评论

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