golang设计模式与编程惯用法精选集插件库go-patterns的使用
Golang设计模式与编程惯用法精选集插件库go-patterns的使用
go-patterns是一个精心整理的Go语言设计模式和编程惯用法的集合库,提供了多种常见的软件设计模式和Go语言特有的编程模式实现。下面我将介绍该库的主要内容和一些典型示例。
项目概览
go-patterns收集了以下主要类别的模式:
创建型模式
模式 | 描述 | 状态 |
---|---|---|
Builder | 使用简单对象构建复杂对象 | ✔ |
Factory Method | 将对象实例化推迟到专门的创建实例函数 | ✔ |
Object Pool | 实例化并维护一组相同类型的对象实例 | ✔ |
Singleton | 限制一个类型只能实例化为一个对象 | ✔ |
单例模式示例
package singleton
import "sync"
// 单例结构体
type singleton struct {
}
var instance *singleton
var once sync.Once
// GetInstance 返回单例实例
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}
结构型模式
模式 | 描述 | 状态 |
---|---|---|
Decorator | 静态或动态地向对象添加行为 | ✔ |
Proxy | 提供对象的代理以控制其行为 | ✔ |
装饰器模式示例
package decorator
// Component 接口定义了被装饰对象的基本操作
type Component interface {
Operation() string
}
// ConcreteComponent 实现了Component接口
type ConcreteComponent struct{}
func (c *ConcreteComponent) Operation() string {
return "ConcreteComponent"
}
// Decorator 装饰器结构体
type Decorator struct {
component Component
}
func (d *Decorator) Operation() string {
return d.component.Operation()
}
行为型模式
模式 | 描述 | 状态 |
---|---|---|
Observer | 为事件/数据变化提供回调通知 | ✔ |
Strategy | 允许在运行时选择算法行为 | ✔ |
观察者模式示例
package observer
// Observer 观察者接口
type Observer interface {
Update(string)
}
// Subject 主题接口
type Subject struct {
observers []Observer
}
// Register 注册观察者
func (s *Subject) Register(o Observer) {
s.observers = append(s.observers, o)
}
// Notify 通知所有观察者
func (s *Subject) Notify(msg string) {
for _, o := range s.observers {
o.Update(msg)
}
}
并发模式
模式 | 描述 | 状态 |
---|---|---|
Bounded Parallelism | 在资源限制下完成大量独立任务 | ✔ |
Generators | 每次产生一个值的序列 | ✔ |
Parallelism | 完成大量独立任务 | ✔ |
生成器模式示例
package generator
// Count 生成整数序列
func Count(start, end int) <-chan int {
ch := make(chan int)
go func() {
for i := start; i <= end; i++ {
ch <- i
}
close(ch)
}()
return ch
}
稳定性模式
模式 | 描述 | 状态 |
---|---|---|
Circuit-Breaker | 当请求可能失败时停止请求流 | ✔ |
断路器模式示例
package circuitbreaker
import (
"errors"
"time"
)
var ErrTooManyRequests = errors.New("too many requests")
// CircuitBreaker 断路器结构体
type CircuitBreaker struct {
state string
failureCount int
maxFailures int
resetTimeout time.Duration
lastFailure time.Time
}
func (cb *CircuitBreaker) Execute(f func() error) error {
if cb.state == "open" {
if time.Since(cb.lastFailure) > cb.resetTimeout {
cb.state = "half-open"
} else {
return ErrTooManyRequests
}
}
err := f()
if err != nil {
cb.failureCount++
if cb.failureCount >= cb.maxFailures {
cb.state = "open"
cb.lastFailure = time.Now()
}
return err
}
cb.state = "closed"
cb.failureCount = 0
return nil
}
编程惯用法
模式 | 描述 | 状态 |
---|---|---|
Functional Options | 允许创建具有合理默认值和惯用重写的干净API | ✔ |
功能选项模式示例
package functionaloptions
// Server 配置结构体
type Server struct {
host string
port int
timeout time.Duration
}
// Option 选项函数类型
type Option func(*Server)
// WithTimeout 设置超时选项
func WithTimeout(timeout time.Duration) Option {
return func(s *Server) {
s.timeout = timeout
}
}
// NewServer 创建新服务器实例
func NewServer(host string, port int, options ...Option) *Server {
server := &Server{host, port, time.Second} // 默认超时1秒
for _, option := range options {
option(server)
}
return server
}
go-patterns库提供了这些设计模式和编程惯用法的实现示例,开发者可以直接参考或基于这些实现构建自己的应用。
更多关于golang设计模式与编程惯用法精选集插件库go-patterns的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang设计模式与编程惯用法精选集插件库go-patterns的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go设计模式与编程惯用法精选:go-patterns插件库使用指南
go-patterns简介
go-patterns是一个收集了Go语言中常用设计模式和编程惯用法的开源库,它提供了清晰的实现示例和最佳实践。这个库对于学习Go语言的设计模式和惯用法非常有帮助。
安装go-patterns
go get -u github.com/tmrts/go-patterns
常用设计模式实现
1. 工厂模式(Factory)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/creational/factory"
)
func main() {
carFactory := factory.NewVehicleFactory()
car := carFactory.NewVehicle(factory.Car)
fmt.Println(car.Drive()) // 输出: Driving a car
truck := carFactory.NewVehicle(factory.Truck)
fmt.Println(truck.Drive()) // 输出: Driving a truck
}
2. 单例模式(Singleton)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/creational/singleton"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
instance := singleton.GetInstance()
fmt.Printf("Instance address: %p\n", instance)
}()
}
wg.Wait()
}
3. 观察者模式(Observer)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/behavioral/observer"
)
type MyObserver struct {
ID int
}
func (o *MyObserver) OnNotify(e observer.Event) {
fmt.Printf("Observer %d received event: %v\n", o.ID, e.Data)
}
func main() {
notifier := observer.NewNotifier()
// 注册观察者
observer1 := &MyObserver{1}
observer2 := &MyObserver{2}
notifier.Register(observer1)
notifier.Register(observer2)
// 发送通知
notifier.Notify(observer.Event{Data: "Something happened!"})
}
4. 装饰器模式(Decorator)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/structural/decorator"
)
func main() {
simpleCoffee := &decorator.SimpleCoffee{}
fmt.Printf("Cost: %f, Description: %s\n",
simpleCoffee.Cost(), simpleCoffee.Description())
milkCoffee := &decorator.Milk{Coffee: simpleCoffee}
fmt.Printf("Cost: %f, Description: %s\n",
milkCoffee.Cost(), milkCoffee.Description())
sugarMilkCoffee := &decorator.Sugar{Coffee: milkCoffee}
fmt.Printf("Cost: %f, Description: %s\n",
sugarMilkCoffee.Cost(), sugarMilkCoffee.Description())
}
常用编程惯用法
1. 函数选项模式(Functional Options)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/idiomatic/functional_options"
)
func main() {
// 使用默认配置
server1, _ := functional_options.NewServer("localhost")
fmt.Printf("%+v\n", server1)
// 使用自定义配置
server2, _ := functional_options.NewServer("localhost",
functional_options.WithPort(8080),
functional_options.WithTimeout(30),
functional_options.WithMaxConnections(100),
)
fmt.Printf("%+v\n", server2)
}
2. 错误处理(Error Handling)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/idiomatic/error_handling"
)
func main() {
repo := error_handling.NewInMemoryRepository()
if err := repo.Add("key1", "value1"); err != nil {
fmt.Println("Error:", err)
}
value, err := repo.Get("key1")
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Value:", value)
}
_, err = repo.Get("nonexistent")
if err != nil {
fmt.Println("Expected error:", err)
}
}
3. 依赖注入(Dependency Injection)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/idiomatic/dependency_injection"
)
func main() {
// 创建服务
userService := dependency_injection.NewUserService(
dependency_injection.NewInMemoryUserRepository(),
)
// 使用服务
user, err := userService.Register("john@example.com", "password123")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Registered user: %+v\n", user)
}
高级模式
1. 管道模式(Pipeline)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/concurrency/pipeline"
)
func main() {
// 创建管道
p := pipeline.New(
func(num int) int { return num * 2 }, // 乘以2
func(num int) int { return num + 1 }, // 加1
func(num int) int { return num * num }, // 平方
)
// 处理数据
result := p.Process(3)
fmt.Println(result) // 输出: 49 ((3*2 + 1)^2)
}
2. Worker池(Worker Pool)
package main
import (
"fmt"
"github.com/tmrts/go-patterns/concurrency/worker_pool"
"time"
)
func main() {
pool := worker_pool.New(3) // 创建3个worker的池
// 提交任务
for i := 0; i < 10; i++ {
pool.Submit(func() {
time.Sleep(1 * time.Second)
fmt.Println("Task processed")
})
}
// 等待所有任务完成
pool.Wait()
fmt.Println("All tasks completed")
}
总结
go-patterns库提供了Go语言中各种设计模式和编程惯用法的清晰实现,是学习和应用这些模式的优秀资源。通过使用这个库,开发者可以:
- 快速掌握Go语言中的各种设计模式
- 学习Go特有的编程惯用法
- 在实际项目中应用这些模式
- 避免常见的实现陷阱
建议读者结合具体业务场景,适当调整这些模式的实现,而不是生搬硬套。设计模式应该是解决问题的工具,而不是为了使用模式而使用模式。