Golang 时间格式化的奇怪设定

举报
Amrf 发表于 2021/01/14 10:25:10 2021/01/14
【摘要】 原文:https://segmentfault.com/a/1190000004222341结论:年、月、日、时、分、秒,英文、数字,必须精确地限定到 golang 指定的时间原点:2006-01-02 15:04:05 now := time.Now().Local() nowRight := now.Format("2006-01-02") vs now := time...

原文:

https://segmentfault.com/a/1190000004222341

结论:年、月、日、时、分、秒,英文、数字,必须精确地限定到 golang 指定的时间原点:2006-01-02 15:04:05

    now := time.Now().Local()
    nowRight := now.Format("2006-01-02") 

vs

    now := time.Now().Local()
    nowWrong := now.Format("2012-01-02") 

我原以为layout只是类似于YYYY-MM-DD的一个格式设定,却没想到这个设定是特定的,否则你就会得到一个异常的的时间输出。

/*************************************************************************************/

/************************************下面的内容和标题不相关***********************************************************/

golang orm和批量插入等

3.golang: gorm不定条件查询和分页操作

https://blog.csdn.net/linux_player_c/article/details/82351934

gorm+gin不定条件查询

https://forum.golangbridge.org/t/how-can-i-speed-up-mysql-inserts-in-go/5770

https://stackoverflow.com/questions/21108084/how-to-insert-multiple-data-at-once


this is an efficient way to do transition which will do network call only after commit.

func insert(requestObj []models.User) (bool, error) {
    tx := db.Begin()
    defer func() {
        if r := recover(); r != nil {
            tx.Rollback()
        }
    }()

    for _, obj := range requestObj {
        if err := tx.Create(&obj).Error; err != nil {
            logging.AppLogger.Errorf("Failed to create user")
            tx.Rollback()
            return false, err
        }
    }
    err := tx.Commit().Error
    if err != nil {
        return false, err
    }
    return true, nil
}

https://ruby-china.org/topics/38906

func (repo *repo) CreateBalancesForAsset(ctx context.Context, wallets []*Wallet, asset *SimpleAsset) (error) {
  valueStrings := []string{}
  valueArgs := []interface{}{}
  for _, w := range wallets {
    valueStrings = append(valueStrings, "(?, ?, ?, ?)")

    valueArgs = append(valueArgs, w.Address)
    valueArgs = append(valueArgs, asset.Symbol)
    valueArgs = append(valueArgs, asset.Identify)
    valueArgs = append(valueArgs, asset.Decimal)
  }
  smt := `INSERT INTO balances(address, symbol, identify, decimal)
    VALUES %s ON CONFLICT (address, symbol) DO UPDATE SET address = excluded.address`
  smt = fmt.Sprintf(smt, strings.Join(valueStrings, ","))
  fmt.Println("smttt:", smt)
  tx := repo.db.Begin()
  err := tx.Exec(smt, valueArgs...).Error
  if err != nil {
    tx.Rollback()
    return err
  }
  return tx.Commit().Error
}

:

https://medium.com/better-programming/how-to-bulk-create-and-update-the-right-way-in-golang-part-i-e15a8e5585d1

/*************************************************************************************/

golang 并行网络请求优化

golang下的并发、并行优化 - https://www.ctolib.com/topics-136872.html

GO语言是非常适合高并发场景的,那么,业务系统具体会遇到哪些高并发的场景呢?该如何考虑性能开销呢?那么本文就笔者在业务系统常常遇到的问题来抛砖引玉~

请求合并

这是什么场景呢?回源!回源DB,二进制流回源源站等等~高并发的场景下,大量用户访问同一个对象,那么做请求合并可以节省非常可观的资源, singleflight~ 当然这是进程内的用法。

批量协议

好像和请求合并有点像?不太一样。比较经典的case就是redis的pipeline。能批量就批量,减少太多的封包解包,减少cpu和带宽~

merge请求

额~~merge什么?比如一个视频id更新计数,那么9->18->25......对了,计数从1涨到100,难道我要写100次db吗?很明显,可以内存里merge~~

并行请求

这个用法在网关服务就非常常见啦~当你的服务需要聚合A、B、C这3个系统的数据,而A、B和C之间没有依赖,那么完全可以并行请求。golang里常用 errgroup 去实现。

减少锁以及系统调用

有些情况锁是很难避免的,但是可以通过一些锁粒度拆分优化去减少锁的开销。系统调用对cpu的开销都是挺明显的,具体可以压测查看top,us%的开销在90%以上,说明性能优化还是可以的。

序列化协议,json和pb

这里既包括API的协议,也同时包括缓存对象的序列化协议。缓存的访问常常会几倍于api请求,经常有放大,所以更要重视。

异步处理,使用channel,而不是无限制go func()

比如更新缓存的场景。这点挺容易理解,无限制的goroutine会带来大量的context切换,浪费cpu。当然channel的长度要做限制和监控。消费者goroutine数可以适当配置。

查看原文: golang下的并发、并行优化

用Golang写爬虫(二) - 并发 https://juejin.cn/post/6844903887158116360

8.6. 示例: 并发的Web爬虫 - https://books.studygolang.com/gopl-zh/ch8/ch8-06.html

Golang 通道,同步等待组 并发爬虫 - https://zhuanlan.zhihu.com/p/102605314

Golang搭建并行版爬虫信息采集框架 - https://segmentfault.com/a/1190000016595502

使用 Go 的并发特性来并行化一个 Web 爬虫 - https://zhuqiuzhi.github.io/2017/10/18/%E7%88%AC%E8%99%AB.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。