为了账号安全,请及时绑定邮箱和手机立即绑定

向构造函数添加可变参数时如何在 Go 中进行版本控制?

向构造函数添加可变参数时如何在 Go 中进行版本控制?

Go
月关宝盒 2022-05-10 17:08:13
我相信将可变参数函数添加到常规函数或方法是基于这篇文章的重大变化。但是向构造函数添加可变参数呢?喜欢添加功能选项。通过使用 semver,此代码为 v1.0.0type Foo struct{}// constructor with default behaviorfunc NewFoo() *Foo {    return &Foo{}}添加可变参数type Foo struct{}type Option func(&Foo)// constructor with optionfunc NewFoo(opts ...Option) *Foo {    // process option before return    // ...    return &Foo{}}旧代码在调用构造函数时仍然很好,并且没有人将构造函数分配给变量并将构造函数传递给另一个函数,就像在这种情况下一样。那么,在上面的代码中,我应该将主要版本增加到 v2.0.0 还是将次要版本增加到 v1.1.0?
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

在 Go 中,我应该将主要版本增加到 v2.0.0 还是将次要版本增加到 v1.1.0?


在 Go 中,NewFoo函数类型


v1.0.0:


type Foo struct{}


func NewFoo() *Foo {}


v2.0.0:


type Foo struct{}


type Option func(*Foo)


func NewFoo(opts ...Option) *Foo { }

是不同的类型。这使它成为一项重大更改,即对主要版本号的更新。


但是,这并不是真正的重大更改,只是一个扩展,因此请更新次要版本号。使用相似但不同的函数名称。例如,NewFoo和NewFooOpts。


v1.1.0:


type Foo struct{}


func NewFoo() *Foo {

    return NewFooOpts()

}


type Option func(*Foo)


func NewFooOpts(opts ...Option) *Foo {

    var foo Foo

    for _, opt := range opts {

        // handle opt

        _ = opt

    }

    return &foo

}

游乐场: https: //play.golang.org/p/HcN1WCi0YK4


使用记录功能的注释向用户提供有关使用哪个功能的指导。例如,也许 functionNewFoo已被弃用,取而代之的是 function NewFooOpts。


没有人将构造函数分配给变量并将构造函数传递给另一个函数。


由于有人这样做,因此该陈述是错误的。


查看完整回答
反对 回复 2022-05-10
?
翻阅古今

TA贡献1780条经验 获得超5个赞

我认为两者都可以,因为这是一个灰色地带。原则上,您破坏了向后兼容性,因为函数的签名发生了变化,但实际上调用者不太可能受到影响。

它类似于将字段添加到对新字段具有合理的默认零值解释的结构。使用这些结构的代码可能表现不同(例如,如果他们查看结构的大小,或者如果他们使用反射),但将其称为重大更改是不切实际的,除非您希望人们在做这些边缘情况事物。


查看完整回答
反对 回复 2022-05-10
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信