LINUX.ORG.RU

Go 1.9

 


1

6

Команда разработчиков Go представила релиз Go 1.9. Релиз доступен на странице загрузки. В данном релизе имеется много изменений в языке, стандартной библиотеке, среде выполнения и инструментарии. Большая часть усилий разработчиков была положена на усовершенствование среды выполнения и инструментария.

Наиболее важным изменением языка является введение псевдонимов типов. Объявление псевдонима типа выглядит следующим образом:

type T1 = T2

Это объявление вводит псевдоним Т1 для типа Т2, таким же образом, как byte всегда был псевдонимом для uint8. Дизайн-документ псевдонимов типов и статья о рефакторинге объясняют это дополнение более детально.

Новый пакет math/bits предоставляет функции подсчета и обработки битов для целых беззнаковых чисел, которые, когда это возможно, реализуются специальными инструкциями CPU. Например, в системах x86-64 bits.TrailingZeros(x) использует инструкцию BSF.

Пакет sync добавил новый тип Map, безопасный для многопоточного доступа. Важно понимать, что это не общая замена типа Map; обратитесь к документации, чтобы узнать, когда она должна использоваться.

В пакет testing также добавлено дополнение. Новый метод Helper, добавленный к testing.T и testing.B, отмечает вызывающую функцию в качестве тестовой вспомогательной функции. Когда тестовый пакет печатает информацию о файле и строке, он показывает местоположение вызова вспомогательной функции вместо строки в самой вспомогательной функции.

Пакет time теперь прозрачно отслеживает монотонное время в каждом временном значении, делая вычисление длительности между двумя временными значениями безопасной операцией.

Наконец, в рамках усилий, направленных на ускорение работы компилятора, Go 1.9 компилирует функции в пакете одновременно.

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

Чтобы отпраздновать релиз, группы пользователей Go по всему миру проводят вечеринки.

>>> Подробности



Проверено: Klymedy ()
Последнее исправление: Klymedy (всего исправлений: 3)
Ответ на: комментарий от Legioner

Предлагаю образовывать 99% пользователей, а не потакать им.

После того как программа уничтожит пользовательские данные пользователи перестанут тебя слушать и уёдут к конкуренту

NextGenenration ★★
()
Ответ на: комментарий от RazrFalcon

В реальности команды используют один из тех, которые умеют. Мы, например, используем glide. Да это разброд и недоработка дизайна. Но над этим ведется работа - смотри про dep выше по треду.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от Legioner

А зачем тогда он открыл терминал?

А кто сказал что программа вообще запускается из терминала? Я что теперь не могу запускать программы без терминала и просто обязан мониторить код возврата?

NextGenenration ★★
()
Ответ на: комментарий от feofan

Забавно, в Rust для этого используются дженерики, которые как бы не нужны.

И что произойдёт, если я запрошу неверный тип?

RazrFalcon ★★★★★
()
Ответ на: комментарий от mersinvald

Хорошая программа должна уведомить, что файл битый и восстановить его до какого-то дефолтного состояния, предложив ввести настройки пользователю.

И что должна делать хорошая программа, если дефолтное состояние опять приводит к ошибке? Уведомить, что файл битый и восстановить его до какого-то дефолтного состояния? :)

И тем более она не должна падать, из исключительных ситуаций нужно выходить, но выходить крэшем — это самое последнее средство. У тебя не должно быть среди исключительных ситуаций непредвиденных.

И исключения тут только помогают. Классифицировать ошибки по мажорным типам (например при вызове loadConfig обработать ошибку, а вот уже при парсинге конфига максимум — преобразовывать ошибку в некий общий тип) и обработать их централизованно в одном или нескольких местах. Но уж точно не писать код восстановления конфига внутри XML парсера.

Legioner ★★★★★
()
Ответ на: комментарий от feofan

В качестве рабочего и широко применяемого подхода тут используется передача пользователем указателя на то, что он хочет получить от библиотеки

Типа этого(пример)?

var m Message
// decode an array value (Message)
err := dec.Decode(&m)
А если передать указатель на неправильный тип данных, то когда это станет понятно?

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration

Ну если тебя волнует только код завершения, и не волнует то что она может поломать половину системы... Тогда всё понятно.

Вот именно, что меня волнует, чтобы программа не поломала половину системы, пытаясь «восстановиться». Я сам восстановлю что надо. Напиши мне всю информацию, которая была доступна на момент возникновения ошибки и упади побыстрей ничего не трогая.

Legioner ★★★★★
()
Ответ на: комментарий от RazrFalcon

Забавно, в Rust для этого используются дженерики, которые как бы не нужны.

Я бы был не против их появления в go 2.0

И что произойдёт, если я запрошу неверный тип?

Функция вернёт ошибку.

feofan ★★★★★
()
Ответ на: комментарий от Legioner

И почему я должен тут падать? Я откачусь назад, и скажу пользователю, что не смог добавить запись в базу. Пусть попробует снова.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Joe_Bishop

Исключения оказались дерьмовой идеей, особенно для больших кодовых баз с большим числом разработчиков. Они провоцируют написание кода на отъебись (потому что на отъебись написать проще чем нормально) и именно поэтому в Го нет их поддержки на уровне языка.

То, что коды возврата являются ещё более дерьмовой идеей, знали ещё 30 лет назад, когда начали делать языки с исключениями. Так и живём, уж лучше дерьмовые исключения, которые позволяют нормальным разработчикам писать нормальный код, чем коды возврата, которые вообще никому жизни не дают.

Legioner ★★★★★
()
Ответ на: комментарий от NextGenenration

А если передать указатель на неправильный тип данных, то когда это станет понятно?

Как только ты заглянешь в err

feofan ★★★★★
()
Ответ на: комментарий от Legioner

Вот именно, что меня волнует, чтобы программа не поломала половину системы, пытаясь «восстановиться»

А кто сказал что она пыталась восстановится? Может она просто что-то делала и произошла ошибка?

Напиши мне всю информацию, которая была доступна на момент возникновения ошибки

Это имеет смысл если ты прямо сейчас подключишься дебагером и посмотришь что там и где.

и упади побыстрей ничего не трогая.

Почему ты думаешь что она по работе ничего не успела потрогать?

NextGenenration ★★
()
Ответ на: комментарий от Legioner

Такой подход не лучше segfault. И для GUI не подходит.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Суть не в скорости. А в «ручной» обработке. Компилятору видно что и откуда приходит и программисту видно кто и что бросает.

Программист перебрасывает все ошибки наверх, выше по стеку, где и будет сидеть высокоуровневый обработчик ошибок. Всё, что тут делает Rust это имитирует исключения, позволяя пробрасывать ошибки с минимумом телодвижений (сначала макросом try!, сейчас вроде ещё проще).

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

когда начали делать языки с исключениями

А теперь перестали. Может догадались о чём-то?

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

В текущем положении дел отсутствие дженериков в go это боль, как и незрелость раста (отсутствие зрелых библиотек).

feofan ★★★★★
()
Ответ на: комментарий от NextGenenration

После того как программа уничтожит пользовательские данные пользователи перестанут тебя слушать и уёдут к конкуренту

Если не пытаться «исправлять» ошибки, ничего не уничтожится. А пользователи придут от конкурента, который пытаясь «исправлять» ошибки закачал петю и зашифровал все диски.

Legioner ★★★★★
()
Ответ на: комментарий от NextGenenration

А кто сказал что программа вообще запускается из терминала? Я что теперь не могу запускать программы без терминала и просто обязан мониторить код возврата?

А при чём тут тогда код ошибки и GUI программа? В GUI есть свои механизмы сообщения об ошибках пользователю. В Windows это известное окно «Программа совершила недопустимую операцию и будет закрыта, отправить отчёт разработчику». В других системах похожие подходы.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Если не пытаться «исправлять» ошибки, ничего не уничтожится

Где гарантия этого? Вот программа удаляет файл, создаёт новый. В момент создания произошла ошибка, система повреждена.

NextGenenration ★★
()
Ответ на: комментарий от RazrFalcon

В Rust я получу ошибку компиляции.

Не получишь, ты в Rust любую ошибку прокидываешь вверх и новую точно так же прокинешь.

Legioner ★★★★★
()
Ответ на: комментарий от NextGenenration

Чем-то лучше, чем-то хуже. Это тема долгая, а мне лень всё это расписывать. Про используемые подходы я тебе ответил.

feofan ★★★★★
()
Ответ на: комментарий от Legioner

В GUI есть свои механизмы сообщения об ошибках пользователю. В Windows это известное окно «Программа совершила недопустимую операцию и будет закрыта, отправить отчёт разработчику».

Да ладно. Если программа собрана без отладочных данных, то всё это будет слишком неинформативно

NextGenenration ★★
()
Ответ на: комментарий от RazrFalcon

И почему я должен тут падать? Я откачусь назад, и скажу пользователю, что не смог добавить запись в базу. Пусть попробует снова.

У тебя нет никакого пользователя, у тебя есть скрипт в cron. Он попробует снова завтра.

Legioner ★★★★★
()
Ответ на: комментарий от NextGenenration

Где гарантия этого? Вот программа удаляет файл, создаёт новый. В момент создания произошла ошибка, система повреждена.

Потому, что неправильный порядок действий. Программа создаёт новый и переименовывает новый в старый. В итоге в худшем случае имеем мусор в tmp.

Legioner ★★★★★
()
Ответ на: комментарий от NextGenenration

Да ладно. Если программа собрана без отладочных данных, то всё это будет слишком неинформативно

У разработчика есть отладочные данные, ему уйдёт отчёт, этого хватит.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Потому, что неправильный порядок действий. Программа создаёт новый и переименовывает новый в старый

Допустим есть два файла. Один успели подменить, второй нет. Что предложишь?

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration

Допустим есть два файла. Один успели подменить, второй нет. Что предложишь?

Если там важные данные, предложу использовать транзакции в том или ином виде. В ФС их обычно нет, поэтому имитировать. Исключения тут только помогут.

Legioner ★★★★★
()
Ответ на: комментарий от NextGenenration

До исправления ошибки надо дожить

Вот именно, дожить с исправными данными, а не «исправленными».

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Нет. Rust требует явного указания возможных ошибок, которые может бросить функция. Такой себе checked exceptions.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Legioner

Если там важные данные, предложу использовать транзакции в том или ином виде

Теперь такой вопрос: а что если данные для обработки в оперативной памяти? Предлагаешь всё писать на диск?

NextGenenration ★★
()
Ответ на: комментарий от feofan

Согласен. Но в расте хоть есть подвижки. А у Go с его автором - не ясно.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Legioner

Вот именно, дожить с исправными данными, а не «исправленными»

Пони, не я предложил «исправлять». Я просто не согласен с тем что это штатное завершение.

NextGenenration ★★
()
Ответ на: комментарий от Legioner

«Программа совершила недопустимую операцию и будет закрыта, отправить отчёт разработчику»

Категорически запрещаю вам подходить на расстояние выстрела к разработке прикладного софта.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

«Программа совершила недопустимую операцию и будет закрыта, отправить отчёт разработчику»

Категорически запрещаю вам подходить на расстояние выстрела к разработке прикладного софта.

LOL. Удваиваю.

feofan ★★★★★
()
Ответ на: комментарий от mersinvald

Какая связь между тем, что мейнтейнеры собирают пакеты и мной? Я получаю из реп бинари, какая мне разница как и где собирают их мейнтейнеры?

Мантейнеры производят то, что ты потребляешь, только и всего. Они выступают посредниками между тобой и создателями - изначальными разработчиками софтвера. У меня же больше вариативности в выборе того, что дают мантейнеры: я делаю или исправляю их работу, но конечно же для собственного репозитория, а не публичного.

iZEN ★★★★★
()
Ответ на: комментарий от iZEN

я делаю или исправляю их работу

Громко плачешь о том что кактус колючий и не вкусный, а для него нужно куча времени и не слабая машина?

NextGenenration ★★
()
Ответ на: комментарий от feofan

Что-то мой пример не работает:

package main

import (
	"fmt"
	"encoding/json"
)

type Message struct {
    Name string
}

func main() {
	b := []byte(`{"Name":"razr"}`)
	var m Message
	err := json.Unmarshal(b, &m)
	if err != nil {
		fmt.Println(m.Name)
	} else {
		fmt.Println(err)
	}
}
<nil>

RazrFalcon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.