Golang语法初读-2
更新日期:
Go 的 interface{}还是个不错的东东,让人不明觉厉起来。
interface{}
- 非侵入式接口
是否可以理解为实现动作即实现接口...
- 接口赋值
1 2 | var rw IReadWriter = ...
var r IReader = rw
|
- 接口查询
应用场景
1 2 3 4 5 | //拥有IReader接口的开发者,想要知道IReader对应的实例化是否也实现了IReadWriter接口,这样它可以切换到IReadWriterj接口的Writer()方法 var reader IReader = NewReader() if writer, ok := reader.(IReadWriter); ok { writer.Writer() } |
- 接口组合
个人觉得有点继承的意味
Go 的接口定义的很宽泛,有点太宽泛了
并发
并发通信模型
- 共享数据
以共享为手段的
- 消息传递
订阅/分发,Ajax,Erlang Message Queue
协程(co-rountine),在Go中叫go-rountine,轻量级的线程,由Go运行时管理(Run time)
不要通过共享内存来通信,而应该够过通信来共享内存
协程,也有人称之为轻量级线程,特点
- 能够在单一的系统线程中模拟多任务的并发执行
- 在一个特定的时间内,只有一个任务在执行,即并非真正的并行
- 被动的任务调度方式,即没有任务主动抢占时间片的说法。
- 每个协程都有自己的堆栈和局部变量
和线程对进程的解释有啥不一样呢?
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最好不要动,这个更容易凌乱。