Skip to content

Instantly share code, notes, and snippets.

View bwangelme's full-sized avatar
🚀
把 Star 当做收藏在用,点起来很随性。GitHub 全是各种 Tutorial 和 Demo

bwangel bwangelme

🚀
把 Star 当做收藏在用,点起来很随性。GitHub 全是各种 Tutorial 和 Demo
View GitHub Profile

在公平锁解法的代码中,程序可以保证上锁和解锁顺序是一致的,但无法保证三个 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
@bwangelme
bwangelme / state.md
Created April 2, 2019 13:46
LeetCode No.8 状态机描述
Path Char
0 space
1 +/-
2 0
3 1-9
4 INVALID CHAR
  • S3 是终止状态

下面这段代码用那种方式解释更好?

CPU Cache

因为每个 goroutine 将 index 的值缓存到 cpu cache 中,所以最后 Goroutine C 将 index 改成29之后。 Goroutine A 和 B 还读取的是缓存的值28,所以它们会继续输出一次。

Go 内存模型

package main
import (
"fmt"
"sync"
)
var i int
var mu sync.Mutex
var endSignal = make(chan struct{})
@bwangelme
bwangelme / panic.go
Last active March 3, 2019 04:34
以下代码展示了如何将 panic 转换成 error 并返回
package main
import (
"fmt"
)
//calNumber
//以下代码展示了如何将 panic 转换成 error 并返回
func calNumber() (res int, err error) {
defer func() {
@bwangelme
bwangelme / go-channel.md
Last active February 9, 2019 05:04
Go 语言的通道

Go语言的通道类型

  • 像 nil 通道中写入或者读取都会造成 永久 的阻塞
var ch3 chan int
//ch3 <- 1 // 通道的值为nil,因此这里会造成永久的阻塞!
//<-ch3 // 通道的值为nil,因此这里会造成永久的阻塞!
_ = ch3 // 这样编译器就不会提示未使用的变量错误了
@bwangelme
bwangelme / note1.md
Last active February 9, 2019 01:16
Go 语言容器类型

Go 语言中的类型

  • 引用类型: 切片类型,字典类型,通道类型,函数类型等
  • 值类型:数组类型,基础数据类型(int系, float系, complex系, string, byte, rune, bool等),结构体类型

数组和切片

  • 数组的长度在声明的时候必须给定,数组长度可以认为是类型的一部分。[1]string[2]string可以认为是两种类型
  • 切片的长度可以自动地随着其中元素的增长而增长,但不会随着元素数量的减少而减少。
  • 一个切片的容量可以看做是透过切片这个窗口可以看到的底层数组中元素的个数。因为切片代表的窗口只可以向右扩展,无法向左扩展。所以切片的容量是在底层数组上从当前位置向右扩展末尾的元素的个数。
@bwangelme
bwangelme / note.md
Last active February 5, 2019 09:18
Go 语言程序实体

Go语言程序实体

Go 语言类型推断带来的好处

Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改), 更不会损失程序的运行效率。

变量的重声明

  • import后路径最后一级相同,不一定会冲突。分为两种情况:

    1. 如果文件夹下文件声明的包名相同,则肯定冲突,会报错redeclared。
    2. 如果文件夹下文件声明的包名不同,则不会冲突。
  • 如果冲突,可用的解决方式

    1. 给包设置别名,调用的时候来区分开不同的package,比如: import(b "bbbb")
    2. 导入的点操作,import(. "bbbb")。这样就可以直接调用bbbb下面的函数而不用再bbbb.funcname的方式调用。
  • 如果只是想引入某包并没有在代码中实际调用则可以这么处理来避免冲突: import(_ "bbbb")

@bwangelme
bwangelme / go-import.md
Last active February 2, 2019 12:06
Go lib import desc