go by example

https://books.studygolang.com/gobyexample/

go和js有啥区别呢?

打印:

import “fmt" 
...
fmt.Println("go" + "lang”)

变量

var a string = “initial" 

f := “short”      //  :=是var的简写。

var e int  // 0

变量类型可以不写,会自动推断。

const s string = "constant"

const定义了就是常量

for循环

循环条件不用写圆括号,不写条件就死循环。

和while功能合并

if-else

没有三目运算符

switch

数组

slice

类似于数组的升级版,有很多自带的api。感觉slice才是真正的数组。

参考

map

go里面的哈希表,或称为字典

For-range

function

闭包Closures

递归recursion

go还能操作指针

总感觉没控制好就会玩脱的权限,改bug都可能不知道在哪里改。

主要目的是,如果指的东西非常大,就可以避免运行函数的时候还要花时间复制一份。直接拿过来就能用了。

【js好像引用类型的,直接用指针来处理了,就是取不到地址,把地址这一层都包裹起来了】

结构体struct

有点像写好了interface的object

方法

类似于prototype,这是在结构体下面添加一个方法。

接口

感觉接口就是规定了进入的结构体,下面都有哪些方法。

更高级别的结构体?

错误处理

协程Goroutines

通道

不同协程之间如何通信?用通道【类似于一个共享的内存】

写入之后会堵塞这个channel,直到有人将其取出去;读取也会造成堵塞,直到有人写进去。

channel实现了类似锁的功能,保证了所有goroutine完成后main()才返回。

关闭不再使用的channel:

应该在生产者的地方关闭channel

通道缓冲

一般是,只有接收方准备好了,才能进行发送。

缓冲,能在没有对应接收方的情况下,缓存一定数量的值

channel的值都是一次性的,一对一的,拿出来的就销毁掉了。不存在一段信息发给多个人的情况。

通道同步

同步 Go 协程间的执行状态,使用阻塞的接受方式来等待一个 Go 协程的运行结束

【不就是变回了同步了吗。。】

通道方向

可以指定通道,只用来接收或者发送值。提高安全性。

【感觉就是在channel上面包了一层函数,只能用来接收或者发送,channel还是那个channel】

通道选择器select

可以同时等待多个通道操作

【感觉就是专门用来等通道的switch】

select默认是阻塞的,只有当监听的channel中有发送或接收可以进行时才会运行,当多个channel都准备好的时候,select是随机的选择一个执行的。

超时

用select,增加一个超时的case

非阻塞通道操作

用default来实现非阻塞,如果跑的时候没有发送或接收,就跑default,不会阻塞进程

通道的关闭

关闭通道,意味着无法再传入值。可以给这个通道的接收方传达工作已经完成的信息。

换言之数据接收方可以接受两个数据,一个是传过来的值,另一个是传值的状态,有没有传递完成。

【大概通道的第二个参数,创建时就是true,当close(jobs)运行,就是给通道的第二个参数设为false】

【怎么感觉这个channel有点像state】

for-range遍历通道

非空的通道也是可以关闭的。我猜这个关闭,只是向通道内传递“要关闭”(第二个参数为false)并不是真正的回收,而是等到没有在指向的时候才回收。

定时器

类似于setTimeout

打点器tickers

类似于setInterval,固定间隔重复执行。

工作池

【问题是,不知道是哪个worker的那个job的返回值,都是一股脑传回来的】

速率限制

简言之就是要限制请求的频率。

方法是用time.Tick(),比如每200ms接受一个值。

这种做法是定义全局的速率限制,也可以只定义部分的速率

原子计数器

go中的状态管理,主要通过通道来完成。也有一些其他方法,比如sync/atomic

互斥锁mutexes

复杂情况的状态管理方法,能在 Go 协程间安全的访问数据。

比如对map的读写,同一时间只能有一个人在读写。如果同时多个线程在读写一个map,就会报错。

因此可以在读写之前,上一把锁。

Last updated

Was this helpful?