当前位置: 首页 > news >正文

go 开发小技巧

一、简介

       本篇文章会介绍go 开发小技巧。

二、go 开发技巧

2.1 Semaphore
type Semaphore chan struct{}func NewSemaphore(maxCount int) Semaphore {return make(chan struct{}, maxCount)
}func (s Semaphore) Acquire() {s <- struct{}{}
}func (s Semaphore) tryAcquire() bool{select {case s <- struct{}{}:default:return false}return true
}func (s Semaphore) Release() {<-s
}
2.2 singleflight

    有点类似react的useMemo hook,会缓存函数结果


type SingleFlight struct {m map[string]*call
}type call struct {sync.Onceres any
}func newSingleFlight() *SingleFlight {return &SingleFlight{m: make(map[string]*call),}
}func (sf *SingleFlight) Do(key string, fn func() (any, error)) (any, error) {if sf.m[key] != nil {return sf.m[key].res, nil}ca := &call{}var err errorca.Once.Do(func() {if res, e := fn(); e == nil {ca.res = reserr = esf.m[key] = ca}})return ca.res, err
}
demo
func main() {var sf = newSingleFlight()var wg sync.WaitGroupvar t = time.Now()for i := 0; i < 10; i++ {wg.Add(1)go func() {res, _ := sf.Do("longFunc", func() (any, error) {time.Sleep(5 * time.Second)return 5, nil})fmt.Println(res)wg.Done()}()}wg.Wait()fmt.Println(time.Since(t))
}
2.3 once

    once 可以用来处理只需要之心一次的结果

var (once     sync.Onceinstance *Config
)func GetConfig() *Config {once.Do(func() {instance = loadConfig()})return instance
}
2.4 error group

   err group 可以在调用线程获取并发执行goroute 的错误

func main() {urls := []string {"https://blog.devtrovert.com","https://example.com",}var g errgroup.Groupfor _, url := range urls {url := url // safe before Go 1.22g.Go(func() error {return fetch(url)})}if err := g.Wait() ; err != nil {log.Fatal(err)}
}
2.5 Pool 

Pool是对象池,可以复用对象

type Pool[T any] struct {internal sync.Pool
}func NewPool[T any](newF func() T) *Pool[T] {return &Pool[T]{internal: sync.Pool{New: func() interface{} {return newF()},},}
}func (p *Pool[T]) Get() T {return p.internal.Get().(T)
}func (p *Pool[T]) Put(v T) {p.internal.Put(v)
}
2.6 error

 1. 自定义error的粒度是类型,例如参数类型错误,可重试错误。

  2.wrap或join。

func readConfig(path string) error {return fmt.Errorf("read config: %w", ErrNotFound)
}func main() {err := readConfig("config.json")if errors.Is(err, ErrNotFound) {fmt.Println("config file not found")}
}

  

func main() {var errs = make([]error, 30)var g sync.WaitGroupfor i := 0; i < 10; i++ {g.Add(1)j := igo func(i int) {errs = append(errs, errors.New(fmt.Sprintf("hello, %d", i)))defer g.Done()}(j)}g.Wait()fmt.Println(errors.Join(errs...))
}

join 用于并发场景,将多个错误连接

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解决Spring Boot中Druid连接池“discard long time none received connection“警告
  • Unity(2022.3.41LTS) - 地形
  • 口语笔记——虚拟语气
  • 智慧灯塔,照亮企业AI Agent实施明路
  • MYSQL:简述对B树和B+树的认识
  • 使用maven搭建微服务框架
  • 基于七牛云上传,下载文件
  • 【数据库】两个集群数据实现同步方案
  • Node.js-身份证号实名认证-小程序实名认证接口集成方法
  • C语言中的预处理器字符串化与拼接操作符:底层原理及实现细节
  • 谷歌发布新AI GameNGen:AI也能实时生成游戏画面!
  • C++ day3
  • OpenStack创建云主机——超级详细步骤
  • Java的IO模型详解-BIO,NIO,AIO
  • Java并发编程(21)—— CurrentHashMap源码分析
  • export和import的用法总结
  • js算法-归并排序(merge_sort)
  • Mysql5.6主从复制
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Redis字符串类型内部编码剖析
  • Vue2.x学习三:事件处理生命周期钩子
  • 从0到1:PostCSS 插件开发最佳实践
  • 对象引论
  • 基于web的全景—— Pannellum小试
  • 每天10道Java面试题,跟我走,offer有!
  • 区块链将重新定义世界
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 通过npm或yarn自动生成vue组件
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 智能网联汽车信息安全
  • ​力扣解法汇总946-验证栈序列
  • ​人工智能书单(数学基础篇)
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #stm32整理(一)flash读写
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)丶RabbitMQ的六大核心
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (黑马C++)L06 重载与继承
  • (十八)三元表达式和列表解析
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)EOS中账户、钱包和密钥的关系
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Standard 的管理策略
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net连接MySQL的方法
  • @Autowired @Resource @Qualifier的区别
  • @RequestBody的使用
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [20161214]如何确定dbid.txt
  • [Android]常见的数据传递方式