登录
首页 >  Golang >  Go问答

重置结构体某些属性的惯用方法是什么?

来源:stackoverflow

时间:2024-03-17 08:27:27 437浏览 收藏

Go 语言中重置结构体属性的惯用方法是创建专用的 `reset` 方法,该方法显式重置所需属性。此方法可确保明确性和一致性,并且可以轻松维护和测试。虽然重新分配结构体本身可以实现重置,但它会带来性能开销,因此不建议使用。

问题内容

是否有一种惯用的方法来重置结构的属性?举例来说,假设我正在创建一个扫描仪(又名:lexer):

type scanner struct {
  src,
  tokens string // let's pretend that tokens is a string.
  pos int
}

而我的scanner有两种方法:initscan。除此之外,该包还导出一个 newscanner 函数,用户可以创建一个传递自定义令牌的新扫描仪:

func newscanner(tokens string) *scanner {
    return &scanner{tokens: tokens}
}

现在问题来了。 init 方法接受 src

func (s *scanner) init(src string) {
    s.src = src
}

然后用户将能够调用 s.scan() 并获取令牌。如果用户想重置位置怎么办?我假设我应该在 init 方法中将位置重置为 0

func (s *scanner) init(src string) {
    s.src = src
    s.pos = 0
}

一切都好。我的问题是:

  1. 我应该创建 reset 方法还是重置 init 方法中的属性?有这样的规则吗?来自 java 世界,我会创建一个 reset 方法,但 go 可能会有所不同。

  2. 是否有更好的方法来仅重置某些属性?假设我不仅有 srcpos 需要重置,这样做会非常难看:

    s.property1 = 0 s.property2 =“” s.property3 =“”

我相信你已经明白了。

我考虑过使用:

func (s *Scanner) Init(src string) {
    s = &Scanner{src, s.tokens, 0, /* other properties */ }
}

但我不确定这在 go 中是否是一个不好的做法,因为它会导致重新分配,对吗?


解决方案


创建 reset 方法似乎绝对没问题。作为一般规则 - 使其尽可能明确。在调试和遗漏未重置字段时,花额外几秒钟显式重置所有字段比花费几个小时要好得多。请务必为 reset 方法添加测试,以确保它重置您关心的所有数据。

今天关于《重置结构体某些属性的惯用方法是什么?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>