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

我相信将可变参数函数添加到常规函数或方法是基于这篇文章的重大变化。但是向构造函数添加可变参数呢?喜欢添加功能选项。


通过使用 semver,此代码为 v1.0.0


type Foo struct{}


// constructor with default behavior

func NewFoo() *Foo {

    return &Foo{}

}

添加可变参数


type Foo struct{}


type Option func(&Foo)


// constructor with option

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

    // process option before return

    // ...

    return &Foo{}

}

旧代码在调用构造函数时仍然很好,并且没有人将构造函数分配给变量并将构造函数传递给另一个函数,就像在这种情况下一样。


那么,在上面的代码中,我应该将主要版本增加到 v2.0.0 还是将次要版本增加到 v1.1.0?


月关宝盒
浏览 119回答 2
2回答

aluckdog

在 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。没有人将构造函数分配给变量并将构造函数传递给另一个函数。由于有人这样做,因此该陈述是错误的。

翻阅古今

我认为两者都可以,因为这是一个灰色地带。原则上,您破坏了向后兼容性,因为函数的签名发生了变化,但实际上调用者不太可能受到影响。它类似于将字段添加到对新字段具有合理的默认零值解释的结构。使用这些结构的代码可能表现不同(例如,如果他们查看结构的大小,或者如果他们使用反射),但将其称为重大更改是不切实际的,除非您希望人们在做这些边缘情况事物。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go