在公平锁解法的代码中,程序可以保证上锁和解锁顺序是一致的,但无法保证三个 Goroutine 的启动顺序。
假设三个线程的启动顺序是 C,B,A
那么它们的上锁顺序就是 C,B,A,C,B,A,C,B,A,C,B,A...,为了方便描述,我给它们标上上了序号
上锁线程 | C | B | A | C | B | A | C | B | A | C | B | A |
---|---|---|---|---|---|---|---|---|---|---|---|---|
上锁编号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
在公平锁解法的代码中,程序可以保证上锁和解锁顺序是一致的,但无法保证三个 Goroutine 的启动顺序。
假设三个线程的启动顺序是 C,B,A
那么它们的上锁顺序就是 C,B,A,C,B,A,C,B,A,C,B,A...,为了方便描述,我给它们标上上了序号
上锁线程 | C | B | A | C | B | A | C | B | A | C | B | A |
---|---|---|---|---|---|---|---|---|---|---|---|---|
上锁编号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Path | Char |
---|---|
0 | space |
1 | +/- |
2 | 0 |
3 | 1-9 |
4 | INVALID CHAR |
package main | |
import ( | |
"fmt" | |
"sync" | |
) | |
var i int | |
var mu sync.Mutex | |
var endSignal = make(chan struct{}) |
package main | |
import ( | |
"fmt" | |
) | |
//calNumber | |
//以下代码展示了如何将 panic 转换成 error 并返回 | |
func calNumber() (res int, err error) { | |
defer func() { |
int
系, float
系, complex
系, string
, byte
, rune
, bool
等),结构体类型[1]string
和[2]string
可以认为是两种类型import后路径最后一级相同,不一定会冲突。分为两种情况:
如果冲突,可用的解决方式
import(b "bbbb")
import(. "bbbb")
。这样就可以直接调用bbbb下面的函数而不用再bbbb.funcname
的方式调用。如果只是想引入某包并没有在代码中实际调用则可以这么处理来避免冲突: import(_ "bbbb")
package xxx
中xxx
指的是其他地方访问包里程序实体时使用的名字。import
时使用的名字https://github.com/bwangelme/Golang_Puzzlers/blob/dev/src/puzzlers/article3/q2/demo5.go
例如这个例子,import 使用的名字是 puzzlers/article3/q2/libiary
, 代码中访问程序实体使用的名字是 lib.Hello(name)