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?