Go语言学习13-常见软件架构的实现
Go语言学习13-常见软件架构的实现架构模式An architectural pattern is a general, reusable solution to a commonly occurring problem in software architectural within a given context. ——wikipedia
Pipe-Filter 架构
Pipe-Filter 模式
非常适合于数据处理及数据分析系统
Filter 封装数据处理的功能
松耦合: Filter只跟数据(格式) 耦合
Pipe用于连接 Filter 传递数据或者在异步处理过程中缓冲数据流
进 ...
Go语言学习12-反射和Unsafe
Go语言学习12-反射和Unsafereflect.TypeOf vs. reflect.ValueOf
reflect.TypeOf 返回类型 (reflect.Type)
reflect.ValueOf 返回类型 (reflect.Value)
可以从 reflect.Value 获得类型
通过 kind 来判断类型
判断类型——Kind()1234567891011func CheckType(v interface{}) { t := reflect.TypeOf(v) switch t.Kind() { case reflect.Float3 ...
Go语言学习11-测试
Go语言学习11-测试单元测试123456// functions.gopackage testingfunc square(op int) int { return op * op}
123456789101112131415161718192021222324252627282930313233// functions_test.gopackage testingimport ( "fmt" "github.com/stretchr/testify/assert" "testing")func TestSqua ...
Go语言学习10-sync.Pool对象缓存
Go语言学习10-sync.Pool对象缓存sync.Pool 对象获取
尝试从私有对象获取
私有对象不存在, 尝试从当前 Processor 的共享池获取
如果当前 Processor 共享池也是空的, name就尝试去其他 Processor 的共享池获取
如果所有子池都是空的, 最后就用用户指定的 New 函数产生一个新的对象返回
sync.Pool 对象的放回
如果私有对象不存在则保存为私有对象
如果私有对象存在, 放入当前 Processor 子池的共享池中
使用 sync.Pool123456789pool := &sync.Pool{ New: func( ...
Go语言学习09-典型并发任务
Go语言学习09-典型并发任务单例模式(懒汉式, 线程安全)1234567891011121314151617181920212223242526type Singleton struct {}var singleInstance *Singletonvar once sync.Oncefunc GetSingletonObj() *Singleton { once.Do(func() { fmt.Println("Create Obj") singleInstance = new(Singleton) }) retur ...
Go语言学习08-并发编程
Go语言学习08-并发编程Thread vs. Groutine
创建时默认的stack的大小
JDK5 以后 Java Thread stack 默认为 1M
Groutine 的 Stack 初始化大小为 2K
和 KSE (Kernel Space Entity) 的对应关系
Java Thread 是 1:1
Groutine 是 M:N
12345678func TestGroutine(t *testing.T) { for i := 0; i < 10; i++ { go func(i int) { fmt.Print ...
Go语言学习07-包和依赖管理
Go语言学习07-包和依赖管理package
基本复用模块单元
以首字母大写来表明可被包外代码访问
代码的 package 可以和所在的目录不一致
同一目录里的 Go 代码的 package 要保持一致
通过 go get 来获取远程依赖
go get -u 强制从网络更新远程依赖
注意代码在 GitHub 上的组织形式, 以适应 go get
直接以代码路径开始, 不要有 src
init 方法
在 main 被执行前, 所有依赖的 package 的 init 方法都会被执行
不同包的 init 函数按照包导入的依赖关系决定执行顺序
每个包可以有多个init函数
包的每个 ...
Go语言学习06-错误处理
Go语言学习06-错误处理Go的错误机制与其他主要编程语言的差异
没有异常机制
error类型实现了error接口
可以通过 errors.New 来快速创建错误实例
12345type error interface { Error() string}errors.New("n must be in range [0, 10]")
最佳实践定义不同的错误变量, 以便于判断错误类型
123456789101112131415161718192021222324252627var LessThanTwoError = errors.Ne ...
Go语言学习05-面向对象编程
Go语言学习05-面向对象编程Go语言官方对于Go 语言是否为面向对象编程的描述https://golang.org/doc/faq:
Is Go an object-oriented language?
Yes and no. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy. The concept of “interface” in Go provides a different approach that w ...
Go语言学习04-函数
Go语言学习04-函数函数是一等公民<font color="Blue">与其他主要编程语言的差异</font>
可以有多个返回值
所有参数都是值传递: slice, map, channel 会有传引用的错觉
函数可以作为变量的值
函数可以作为参数和返回值
学习函数式编程
可变参数1234567func sum(ops ...int) int { s := 0 for _, op := range ops { s += op } return s}
defer ...