Идти в ногу со своим шестимесячным графиком выпуска, Go 1.14 не за горами. Было внесено довольно много изменений, таких как более быстрая хеш-функция и удаление SSLv3 (что является критическим изменением).

Но в этом посте я сосредоточусь на изменении основного языка, а именно на том, как работают интерфейсы. До Go 1.14 у вас не могло быть перекрывающихся интерфейсов. Если вы составляете интерфейс и ваши «базовые интерфейсы» выполняют аналогичную функцию, вы получите сообщение об ошибке:

duplicate method methodName()

Например, если у вас есть два простых интерфейса:

type A interface{
   DoX()
   DoY()
}

type B interface{
   DoX()
}

Вы можете без проблем создать структуру, которая удовлетворяет оба интерфейса одновременно:

type S struct {}
func (s S) DoX() {}
func (s S) DoY() {}

Это означает, что S реализует как A, так и B.

Тем не менее, если мы создадим интерфейс, состоящий из A и B, мы получим сбои во время компиляции.

type AB interface{
     A
     B
}

Начиная с Go 1.14, создание таких составных интерфейсов станет возможным (при условии, что функции имеют одну и ту же сигнатуру). Так что это все равно не удастся:

type A interface{
     DoX() string
}
type B interface{
     DoX() 
}
type AB interface{
    A
    B
}

На этом этапе сигнатура функции DoX() отличается для интерфейсов A и B, что является актуальной проблемой.

Лично я вполне доволен этим изменением, я считаю ошибкой то, что это не работало в более ранних версиях Go, так как никогда не было бы двусмысленности, если бы сигнатура функции была такой же.

На эту тему есть интересная дискуссия, которая началась около семи (!) Лет назад на github: https://github.com/golang/go/issues/6977

Если вы хотите опробовать этот код (который находится на Github) и не хотите ждать, когда действительно выйдет 1.14, вы можете запустить его с бета-версией 1.14. На мой взгляд, один из самых простых способов установить это с помощью go get.

go get golang.org/dl/go1.14beta1
go1.14beta1 download

После этого вы можете использовать команду go1.14beta1 как замену обычной команде go. Таким образом, для запуска кода вы используете go1.14beta1 run main.go 😉

Если вам понравился этот пост и 💙 Вперед, подумайте:

  • Следуя за мной здесь, на Medium
  • Или в твиттере Twitter
  • Или загляните на workwithgo.com, чтобы найти классную работу в Go по всему миру.