文章目录
  1. 1. interface{}
  2. 2. 并发
    1. 2.0.1. 并发通信模型
    2. 2.0.2. channel
    3. 2.0.3. 同步

Gointerface{}还是个不错的东东,让人不明觉厉起来。


interface{}

  1. 非侵入式接口

是否可以理解为实现动作即实现接口...

  1. 接口赋值
1
2
var rw IReadWriter = ...
var r IReader = rw
  1. 接口查询

应用场景

1
2
3
4
5
//拥有IReader接口的开发者,想要知道IReader对应的实例化是否也实现了IReadWriter接口,这样它可以切换到IReadWriterj接口的Writer()方法
var reader IReader = NewReader()
if writer, ok := reader.(IReadWriter); ok {
	writer.Writer()
}
  1. 接口组合 个人觉得有点继承的意味

Go 的接口定义的很宽泛,有点太宽泛了


并发

并发通信模型

  1. 共享数据 以共享为手段的
  2. 消息传递 订阅/分发,Ajax,Erlang Message Queue

协程(co-rountine),在Go中叫go-rountine,轻量级的线程,由Go运行时管理(Run time)

不要通过共享内存来通信,而应该够过通信来共享内存

协程,也有人称之为轻量级线程,特点

  1. 能够在单一的系统线程中模拟多任务的并发执行
  2. 在一个特定的时间内,只有一个任务在执行,即并非真正的并行
  3. 被动的任务调度方式,即没有任务主动抢占时间片的说法。
  4. 每个协程都有自己的堆栈和局部变量

和线程对进程的解释有啥不一样呢?

channel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var channelName chan ElementType

ch := make(chan int)

//写入数据
ch <- value
//读出数据
value := <-ch

//单向channel
var ch1 chan int	//ch1是一个正常的channel,不是单向的
var ch2 chan<- float64	//ch2单向的,只用于写入float64数据
var ch3 <-chan int	//ch3单向的,只用于读取int数据

//关闭channel
close(ch)

//测试是否关闭成功
x, ok:= <-ch
if ok == false 则表明ch已经被关闭

同步

  • 同步锁

    • sync.Mutex 强制锁
    • sync.RWMutex 读写锁
  • 全局唯一性操作

    • sync.Once 有点单列模式的意味,用来做init比较好

敲了书中的代码,越来越觉得Go很像C语言,普遍的指针使用,channel 还要继续深入看看。

struct 结构体代替class到是没什么,就是觉得比起Java来说,代码的组织和条理还是有点乱,看来还得适应适应。

Go 的调试需要gdb.exe,cywin 和 mingw 的都一样,装一个配在DEBUG里面就好了。 不过最好是保持32位/64位一致,要不有可能会凌乱掉。

Go Project中的Build Path最好不要动,这个更容易凌乱。

文章目录
  1. 1. interface{}
  2. 2. 并发
    1. 2.0.1. 并发通信模型
    2. 2.0.2. channel
    3. 2.0.3. 同步