对象池化设计:
  将池对象通过Channel方式进行借出与还入,利用Go本身的特性还能实现更多限定需求。比如利用select的分支可以进行优雅的限流、超时熔断等操作。
 
思路:将需要池化的对象通过Channel进行包装,使用与归还都通过Channel的方式进行
package pool

type Pool chan *Object

// 初始化池,可指定容量
func New(total int) *Pool {
p := make(Pool, total) for i := ; i < total; i++ {
p <- new(Object)
}
return &p
}
使用:

p := pool.New()

select {
case obj := <-p:
obj.Do( /*希望池中对象进行的操作*/ ) p <- obj // 使用完毕归还到池中
default:
// 池资源无剩余,延迟重试或者直接告知失败等操作
return
}
对象单例设计:
  这里的实现是具有Go特色的调用方式,与double check的方式相比,更加优雅却达到相同效果
 
思路:利用sync包提供的once锁,从而限制创建过程仅执行一次

package singleton

type singleton map[string]string

var (
once sync.Once instance singleton
) func New() singleton {
once.Do(func() {
instance = make(singleton)
}) return instance
}
使用示例:

s := singleton.New()

s["this"] = "that"

s2 := singleton.New()

fmt.Println("This is ", s2["this"])

//output:  This is that
工厂模式设计:
  与面向对象的语言思路相同,只是这里的接口继承不是强类型的显式继承,而是更加灵活的Duck-Type方式
 
思路:只要是隐式实现接口Store的,都可通过Store接口接收对象,并调用接口定义的方法(里氏替换原则)

package data

import "io"

// 接口限定了能力(调用的方法)
type Store interface {
Open(string) (io.ReadWriteCloser, error)
} type StorageType int const (
DiskStorage StorageType = << iota
TempStorage
MemoryStorage
) func NewStore(t StorageType) Store {
// 通过枚举来创建实际创建的对象类型
switch t {
case MemoryStorage:
return newMemoryStorage( /*...*/ )
case DiskStorage:
return newDiskStorage( /*...*/ )
default:
return newTempStorage( /*...*/ )
}
}
使用示例:

s, _ := data.NewStore(data.MemoryStorage)
f, _ := s.Open("file") n, _ := f.Write([]byte("data"))
defer f.Close()

代码来源是Github上一个开源项目,项目内容是Go相关的常用设计模式的实现,很实用易懂: https://github.com/tmrts/go-patterns

对应的Gitbook地址:http://tmrts.com/go-patterns/structural/decorator.html

Go语言为何说它优雅?-- Golang中的几个常用初始化设计的更多相关文章

  1. golang中goroutine协程调度器设计策略

    goroutine与线程 /* goroutine与线程1. 可增长的栈os线程一般都有固定的栈内存,通常为2MB,一个goroutine的在其声明周期开始时只有很小的栈(2KB),goroutine ...

  2. golang中for循环的常用用法

    package main import "fmt" func main() { //printFormula() // 打印九九乘法表 //printLeftTriangle() ...

  3. iota: Golang 中优雅的常量

    阅读约 11 分钟 注:该文作者是 Katrina Owen,原文地址是 iota: Elegant Constants in Golang 有些概念有名字,并且有时候我们关注这些名字,甚至(特别)是 ...

  4. Golang中设置函数默认参数的优雅实现

    在Golang中,我们经常碰到要设置一个函数的默认值,或者说我定义了参数值,但是又不想传递值,这个在python或php一类的语言中很好实现,但Golang中好像这种方法又不行.今天在看Grpc源码时 ...

  5. 优雅处理Golang中的异常

    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java.Python等语言不同的是,Go中并没有try...catch...这样的语句块,我们知道在Java中使用try...catch.. ...

  6. 在Golang中使用C语言代码实例

    转自:http://www.jb51.net/article/56720.htm cgo 使得在 Golang 中可以使用 C 代码. Hello World 为了有一个较为直观的了解,我们来看一个简 ...

  7. 延宕执行,妙用无穷,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中defer关键字延迟调用机制使用EP17

    先行定义,延后执行.不得不佩服Go lang设计者天才的设计,事实上,defer关键字就相当于Python中的try{ ...}except{ ...}finally{...}结构设计中的finall ...

  8. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  9. 基础知识 - Golang 中的正则表达式

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

随机推荐

  1. Confluence 6 附件存储文件系统的分级

    从 Confluence 3.0 开始,附件的存储方式有了重大的改变和升级.如果你是从 Confluence 2.10 及其早期版本升级上来的,请参考 Upgrading Confluence 页面中 ...

  2. Confluence 6 手动备份站点

    Confluence 被配置自动备份数据,使用压缩的 XML 格式.同时你也可以通过 Confluence 的 管理员控制台(Administration Console)手动进行备份. 你需要具有 ...

  3. gnuradio 创建cos_source

    C++教程 ys_linux@computer:~$ gr_modtool nm kcd Creating out-of-tree module in ./gr-kcd... Done. Use 'g ...

  4. LeetCode(65):有效数字

    Hard! 题目描述: 验证给定的字符串是否为数字. 例如:"0" => true" 0.1 " => true"abc" =& ...

  5. Unity3D料槽设备旋转(一)

    1.使用C#创建控制游戏对象的的脚本语言, 第一步: 在project师徒中create 一个C#脚本,将其按照自己的设备名称进行命名,这里我将其简单的命名成zhuaquanzhou.cs 使用编辑器 ...

  6. kali linux revealed mastering the penetration testing distribution

    1.本博客记载的是这本书的学习笔记,还有出现的一些不懂的单词 我也将会记载这篇博客中.记载顺序是按照本书的章节顺序来记载的.最喜欢本书中的一句   you havae no idea how good ...

  7. BrupSuite渗透测试笔记(九)

    一. Update BurpSuite 1.选择help ,点击check for updates 记可以进入最新版本的下载界面,profession version need pay for mon ...

  8. linux里面的命令:./和. /(这里有空格)的区别

    /  ( 直接/ ) 直接 / 表示: 根目录. ./ ( 点号紧跟/ ) 点号紧跟/ 表示: 当前目录(相对路径的写法). . / ( 点号 空格 / ) 有空格的点号等同于source命令,表示在 ...

  9. spring cloud Eureka常见问题总结

    Spring Cloud中,Eureka常见问题总结. 指定Eureka的Environment 1 eureka.environment: 指定环境 参考文档:https://github.com/ ...

  10. 输出GPLT

    L1-023 输出GPLT (20 分)   给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符( ...