I. Изменение функций
Вызов их будет продолжать работать без изменений, но, поскольку сигнатуры функций не совпадают, это может легко привести к поломке некоторого кода.
Например (попробуйте на Go Playground):
func Foo(a int) {}
func Foo2(a int, params ...string) {}
func main() {
var f func(int)
f = Foo
f = Foo2 // Compile-time error!
_ = f
}
Строка f = Foo2
выдает ошибку времени компиляции:
нельзя использовать Foo2 (тип func(int, ...string)) как тип func(int) в назначении
Так что это обратно несовместимое изменение, не делайте этого.
Приведенный выше пример дал ошибку времени компиляции, что является удачным/лучшим случаем, но также может быть код, который завершится ошибкой только во время выполнения (недетерминированный, если/когда это произойдет), как в этом примере:
func Foo(a int) {}
func Foo2(a int, params ...string) {}
func main() {
process(Foo)
process(Foo2) // This will panic at runtime (type assertion will not hold)!
}
func process(f interface{}) {
f.(func(int))(1)
}
Вызов process(foo)
выполнен успешно, вызов process(foo2)
вызовет панику во время выполнения. Попробуйте на Go Playground.
II. Изменение методов
Ваш вопрос был направлен на функции, но та же «проблема» существует и с методами (при использовании в качестве выражений метода или значения метода, например см. golang — метод передачи для работы).
Кроме того, это может нарушить неявные реализации интерфейса (может привести к тому, что типы не будут реализовывать интерфейсы), как в этом примере (попробуйте на Игровая площадка):
type Fooer interface {
Foo(int)
}
type fooImpl int
func (fooImpl) Foo(a int) {}
type fooImpl2 int
func (fooImpl2) Foo(a int, params ...string) {}
func main() {
var f Fooer
f = fooImpl(0)
f = fooImpl2(0) // Compile time error!
_ = f
}
Поскольку подписи не совпадают, fooImpl2
не реализует Fooer
, хотя fooImpl
реализует:
cannot use fooImpl2(0) (type fooImpl2) as type Fooer in assignment:
fooImpl2 does not implement Fooer (wrong type for Foo method)
have Foo(int, ...string)
want Foo(int)
person
icza
schedule
14.03.2019
foo
не экспортируется: никого это не волнует. Было бы экспортировано: Это тормозное изменение. Что это значит для semver, могут судить по semverionistas. - person Volker   schedule 14.03.2019foo
вFoo
, так как имеет смысл обсуждать только экспортированные функции. - person Duncan Jones   schedule 14.03.2019