Go вроде не очень популярен на РСДН (что очень зря, но...), так что эта новость осталась незамеченной. Итак, авторы Go наконец-то признали, что текущая ситуация с обработкой ошибок и отсутствием шаблонов всё же ошибка дизайна, а не фича. В результате родились следующие предложения по:
Обработке ошибок и представлении ошибок.
Дженерикам.
Предложение по дженерикам мне кажется довольно неудачным, так как все сводится к идее написания contract, в котором будут перечислены все допустимые для типа операции, например так:
contract stringer(x T) {
var s string = x.String()
}
func Stringify(type T stringer)(s []T) (ret []string) {
for _, v := range s {
ret = append(ret, v.String()) // тут мы знаем что T имеет метод String
}
return ret
}
Так как Stringify может требовать более глубокого понимания методов представляемых T, contract будет разрастаться. Типичный примитивный, но очень прямолинейный подход характерный для Go
С обработкой ошибок всё как мне кажется лучше, добавили ключевые слова handle (общее описание обработки ошибки) и check (применить описанный выше handle в случае возникновения ошибки). Вроде удобно для мира Go вышло.
func CopyFile(src, dst string) error {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
handle err {
w.Close()
os.Remove(dst) // (only if a check fails)
}
check io.Copy(w, r)
check w.Close()
return nil
}