История изменений
Исправление urxvt, (текущая версия) :
А разве не всегда можно определить на этапе компиляции что тип реализует нужный интерфейс?
Нет. Интерфейсы предназначены для рантайма. Скажем, io.Writer во время компиляции не знает, какой конкретный объект ему передадут.
Правильно, ему и знать не нужно, достаточно знать что у типа есть метод Write. Я пока не понял зачем ввели контракты а не использовали уже существующий механизм интерфейсов. Почему не сделали как в следующем примере.
func foo(type T io.Writer)(t T, b []byte) (int, error) {
return t.Write(b)
}
foo(os.Stdout, []byte("Hello, World.")) // ok
var a int
foo(a, []byte("Hello, World.")) // compilation error: variable of int type does not satisfy io.Writer interface
Не подскажешь где этот вопрос раскрыт авторами? В draft'е есть? Я его пока не осилил.
Это как раз опционально. Можно указать, можно не указывать (компилятор выведет типы). Всё как в C++.
Ну тогда нормально.
Исходная версия urxvt, :
А разве не всегда можно определить на этапе компиляции что тип реализует нужный интерфейс?
Нет. Интерфейсы предназначены для рантайма. Скажем, io.Writer во время компиляции не знает, какой конкретный объект ему передадут.
Правильно, ему и знать не нужно, достаточно знать что у типа есть метод Write. Я пока не понял зачем ввели контракты а не использовали уже существующий механизм интерфейсов. Почему не сделали как в следующем примере.
func foo(type T io.Writer)(t T, b []byte) (int, error) {
return t.Write(b)
}
foo(os.Stdout, []byte("Hello, World.")) // ok
var a int
foo(a, []byte("Hello, World.")) // compilation error: variable of int type does not satisfy io.Writer interface
Не подскажешь где этот вопрос раскрыт авторами? В draft'е есть? Я его пока не осилил.
Это как раз опционально. Можно указать, можно не указывать (компилятор выведет типы). Всё как в C++.
Ну тогда нормально.