重磅:Go errors 将不会有任何进一步的改进计划

陈楚初:比特币价格回落千点 日内谨防行情再度走低

今日快讯: Coinhills数据显示,当前比特币兑法币交易占比中美元占比降至72.66%,仍排名第一;排名第二为日元,占比为21.22%;欧元排名第三,占比为2.63%;排名四五位的分别为韩元(1.55%)、土耳其里拉(0.57%)。BTC -1.01% B…

今天在 Gophercon2020 上,Go 1.13 错误提案的作者事后提及他对目前错误格式化的缺失表示遗憾,而且在未来很长的好几年内都不会有任何进一步改进计划

对此他本人给出的原因之一是:对于错误处理这一领域特定的问题,在他的能力范围内实在是无法给出一个令所有人都满意的方案。

尽管如此,在他演讲的最后,还是给出了一些关于错误嵌套的建议,即实现 fmt.Formatter,图中给出了一个简单的例子,大家可以参考如下代码:

type DetailError struct {
 msg, detail string
 err         error
}

func (e *DetailError) Unwrap() error { return e.err }

func (e *DetailError) Error() string {
 if e.err == nil {
  return e.msg
 }
 return e.msg + ": " + e.err.Error()
}

func (e *DetailError) Format(s fmt.State, c rune) {
 if s.Flag('#') && c == 'v' {
  type nomethod DetailError
  fmt.Fprintf(s, "%#v", (*nomethod)(e))
  return
 }
 if !s.Flag('+') || c != 'v' {
  fmt.Fprintf(s, spec(s, c), e.Error())
  return
 }
 fmt.Fprintln(s, e.msg)
 if e.detail != "" {
  io.WriteString(s, "t")
  fmt.Fprintln(s, e.detail)
 }
 if e.err != nil {
  if ferr, ok := e.err.(fmt.Formatter); ok {
   ferr.Format(s, c)
  } else {
   fmt.Fprintf(s, spec(s, c), e.err)
   io.WriteString(s, "n")
  }
 }
}

func spec(s fmt.State, c rune) string {
 buf := []byte{'%'}
 for _, f := range []int{'+''-''#'' ''0'} {
  if s.Flag(f) {
   buf = append(buf, byte(f))
  }
 }
 if w, ok := s.Width(); ok {
  buf = strconv.AppendInt(buf, int64(w), 10)
 }
 if p, ok := s.Precision(); ok {
  buf = append(buf, '.')
  buf = strconv.AppendInt(buf, int64(p), 10)
 }
 buf = append(buf, byte(c))
 return string(buf)
}

此处的内容来源于欧神(@changkun)在知识星球里的线上分享。

借此也安利下咱们《Go 夜读》的星球,欢迎大家一起来学习和分享:

重磅:Go errors 将不会有任何进一步的改进计划
Go夜读

讨论

Go 语言的错误处理机制一直饱受争议,前段时间在 issues 中还长期争吵过一段时间,因此还是维持了目前 if err != nil 的方式,也没有什么大改动。

我们再想想,像其他语言的 try catch 是一定好吗?毕竟 try catch 的方式也有很多人不看好。

抛个砖,如果是你,你会想怎么设计 Go 语言的错误机制?或者说你觉得怎么的处理才算好


分享 Go 语言、微服务架构和奇怪的系统设计

重磅:Go errors 将不会有任何进一步的改进计划

👆 长按关注煎鱼,在知识的海洋里遨游

在比特币日报读懂区块链和数字货币,加入Telegram获得第一手区块链、加密货币新闻报道。

大饼上行势不可挡  以太多军稍逊一筹

今日资讯: 据官方消息,截至11月12日,灰度资产管理总规模达到94亿美元。比特币信托基金(GBTC)交易价格为每份额18.24美元,较前一日上涨10.48%;以太坊信托基金(ETHE)交易价格为每份额62美元,较前一日上涨2.53%。 BTC行情分析: 比特…

Click to rate this post!
[Total: 0 Average: 0]

人已赞赏
Dapp开发Go语言技术开发小白百科

Go 语言今年 11 岁,何去何从,现状到底如何?

2020-11-13 15:10:25

Go语言技术开发小白百科

为什么 Go 的泛型一拖再拖?

2020-11-21 10:44:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索