Примечания к выпуску Go 1.7

Введение в Go 1.7

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

В этом выпуске добавлен порт для IBM LinuxOne; обновлена back-end компилятора x86-64 для генерации более эффективного кода; включён пакет context, который был перенесён из подрепозитория x/net и теперь используется в стандартной библиотеке; а также добавлена поддержка создания иерархий тестов и бенчмарков в пакете testing. Этот выпуск также заканчивает реализацию поддержки vendoring, начатую в Go 1.5, делая её стандартной функцией.

Изменения в языке

В этом выпуске есть одно незначительное изменение языка. Раздел о заканчивающихся инструкциях уточняет, что для определения того, заканчивается ли список инструкций заканчивающейся инструкцией, рассматривается «последняя непустая инструкция», соответствующая уже существующему поведению компиляторов gc и gccgo. В предыдущих версиях определение ссылалось только на «последнюю инструкцию», оставляя неясным влияние завершающих пустых инструкций. Пакет go/types был обновлён, чтобы соответствовать поведению компиляторов gc и gccgo в этом вопросе. Это изменение не влияет на корректность существующих программ.

Порты

Go 1.7 добавляет поддержку macOS 10.12 Sierra. Бинарные файлы, собранные с использованием версий Go до 1.7, будут работать некорректно в системе Sierra.

Go 1.7 добавляет экспериментальный порт на Linux на z Systems (linux/s390x) и начало порта для Plan 9 на ARM (plan9/arm).

Экспериментальные порты для Linux на 64-битном MIPS (linux/mips64 и linux/mips64le), добавленные в Go 1.6, теперь полностью поддерживают cgo и внешнее связывание.

Экспериментальный порт для Linux на 64-битном little-endian PowerPC (linux/ppc64le) теперь требует архитектуру POWER8 или более позднюю. Большой порядок байтов (big-endian) 64-битный PowerPC (linux/ppc64) требует только архитектуру POWER5.

Порт для OpenBSD теперь требует OpenBSD 5.6 или более позднюю версию для доступа к системному вызову getentropy(2).

Известные проблемы

Существуют некоторые нестабильности в FreeBSD, которые известны, но пока не поняты. Они могут привести к сбоям программы в редких случаях. См. issue 16136, issue 15658, и issue 16396. Любая помощь в решении этих проблем, специфичных для FreeBSD, будет признана с благодарностью.

Инструменты

Ассемблер

Для 64-битных ARM-систем имена векторных регистров были исправлены на V0 через V31; в предыдущих версиях они неправильно назывались V32 через V63.

Для 64-битных x86-систем были добавлены следующие инструкции: PCMPESTRI, RORXL, RORXQ, VINSERTI128, VPADDD, VPADDQ, VPALIGNR, VPBLENDD, VPERM2F128, VPERM2I128, VPOR, VPSHUFB, VPSHUFD, VPSLLD, VPSLLDQ, VPSLLQ, VPSRLD, VPSRLDQ, и VPSRLQ.

Компилятор

В этом релизе добавлена новая кодогенерирующая подсистема для 64-битных x86-систем, следуя предложению 2015 года, которое разрабатывалось с тех пор. Новая подсистема, основанная на SSA, генерирует более компактный и эффективный код и предоставляет лучшую платформу для оптимизаций, таких как удаление проверок границ. Новая подсистема снижает время работы процессора, необходимое для наших тестовых программ, на 5–35%.

Для этого релиза новая подсистема может быть отключена передачей -ssa=0 в компилятор. Если вы обнаружите, что ваша программа компилируется или выполняется успешно только при отключенной новой подсистеме, пожалуйста, сообщите об ошибке.

Формат экспортируемых метаданных, записываемых компилятором в архивы пакетов, изменился: старый текстовый формат был заменён более компактным двоичным форматом. Это приводит к немного меньшим размерам архивов пакетов и устраняет несколько долгосрочных багов с граничными случаями.

Для этого релиза новый формат экспорта может быть отключён передачей -newexport=0 в компилятор. Если вы обнаружите, что ваша программа компилируется или выполняется успешно только при отключенном новом формате экспорта, пожалуйста, сообщите об ошибке.

Опция -X компоновщика больше не поддерживает необычную форму с двумя аргументами -X name value, как было объявлено в релизе Go 1.6 и в предупреждениях, выводимых компоновщиком. Используйте вместо этого -X name=value.

Компилятор и компоновщик были оптимизированы и работают значительно быстрее в этом релизе по сравнению с Go 1.6, хотя они всё ещё медленнее, чем хотелось бы, и будут продолжать оптимизироваться в будущих релизах.

Из-за изменений в компиляторной цепочке и стандартной библиотеке, бинарные файлы, собранные с использованием этого релиза, как правило, должны быть меньше, чем бинарные файлы, собранные с Go 1.6, иногда на 20–30%.

На системах x86-64 программы на Go теперь сохраняют указатели стековых кадров, как ожидается профилирующими инструментами, такими как Linux perf и Intel VTune, что облегчает анализ и оптимизацию программ на Go с использованием этих инструментов. Поддержка указателей стековых кадров имеет небольшую нагрузку во время выполнения, которая может варьироваться, но в среднем составляет около 2%. Мы надеемся снизить эту нагрузку в будущих релизах. Чтобы собрать инструментарий, который не использует указатели стековых кадров, установите GOEXPERIMENT=noframepointer при запуске make.bash, make.bat или make.rc.

Cgo

Пакеты, использующие cgo, теперь могут включать файлы исходного кода Fortran (в дополнение к C, C++, Objective C и SWIG), хотя Go-обёртки должны по-прежнему использовать API на языке C.

Go-обёртки теперь могут использовать новую вспомогательную функцию C.CBytes. В отличие от C.CString, которая принимает Go string и возвращает *C.byte (C char*), C.CBytes принимает Go []byte и возвращает unsafe.Pointer (C void*).

В прошлых релизах пакеты и бинарные файлы, собранные с использованием cgo, выдавали разный результат при каждой сборке, из-за встраивания временных имён каталогов. При использовании этого релиза с новыми версиями GCC или Clang (которые поддерживают опцию -fdebug-prefix-map), такие сборки должны быть теперь детерминированными.

Gccgo

Из-за выравнивания полуторамесячного релизного цикла Go с ежегодным релизным циклом GCC, релиз GCC 6 содержит версию gccgo из Go 1.6.1. Следующий релиз, GCC 7, вероятно, будет содержать версию gccgo из Go 1.8.

Команда Go

Базовая операция команды go не изменилась, но есть несколько изменений, которые стоит отметить.

В этом релизе удалена поддержка переменной окружения GO15VENDOREXPERIMENT, как было объявлено в релизе Go 1.6. Поддержка vendoring теперь является стандартной функцией команды go и инструментария.

Структура данных Package, доступная команде “go list”, теперь включает поле StaleReason, объясняющее, почему конкретный пакет считается устаревшим (нуждается в пересборке) или нет. Это поле доступно для опций -f или -json и полезно для понимания, почему целевой объект пересобирается.

Команда “go get” теперь поддерживает пути импорта, ссылающиеся на git.openstack.org.

В этом релизе добавлена экспериментальная, минимальная поддержка сборки программ с использованием пакетов, содержащих только бинарный код, пакетов, распространяемых в бинарном виде без соответствующего исходного кода. Эта функция необходима в некоторых коммерческих условиях, но не предназначена для полной интеграции в остальную часть инструментария. Например, инструменты, предполагающие доступ к полному исходному коду, не будут работать с такими пакетами, и не планируется поддерживать такие пакеты в команде “go get”.

Go doc

Команда “go doc” теперь группирует конструкторы вместе с типом, который они создают, следуя godoc.

Go vet

Команда “go vet” имеет более точный анализ в проверках -copylock и -printf, а также новую проверку -tests, которая проверяет имя и сигнатуру вероятных функций тестов. Чтобы избежать путаницы с новой проверкой -tests, старая, необъявленная опция -test была удалена; она была эквивалентна -all -shadow.

Команда vet также имеет новую проверку, -lostcancel, которая обнаруживает отсутствие вызова функции отмены, возвращённой функциями WithCancel, WithTimeout и WithDeadline в новом пакете context Go 1.7 (см. ниже). Отсутствие вызова функции препятствует освобождению нового Context до тех пор, пока его родитель не будет отменён. (Фоновый контекст никогда не отменяется.)

Go tool dist

Новая субкоманда “go tool dist list” выводит все поддерживаемые пары операционная система/архитектура.

Go tool trace

Команда “go tool trace”, введённая в Go 1.5, была уточнена различными способами.

Во-первых, сбор трассировок стал значительно более эффективным по сравнению с предыдущими релизами. В этом релизе типовой избыточный расход времени выполнения при сборе трассировки составляет около 25%; в предыдущих релизах он составлял как минимум 400%. Во-вторых, файлы трассировок теперь включают информацию о файле и номере строки, что делает их более автономными и делает исходный исполняемый файл необязательным при запуске инструмента трассировки. В-третьих, инструмент трассировки теперь разбивает большие трассировки, чтобы избежать ограничений в веб-просмотрщике.

Хотя формат файла трассировки изменился в этом релизе, инструменты Go 1.7 всё ещё могут читать трассировки из более ранних релизов.

Производительность

Как и всегда, изменения настолько общие и разнообразные, что точные заявления о производительности сделать трудно. Большинство программ должны работать немного быстрее, благодаря ускорению сборщика мусора и оптимизациям в основной библиотеке. На системах x86-64 многие программы будут работать значительно быстрее, благодаря улучшениям в генерируемом коде, вызванным новым компилятором back end. Как упоминалось выше, в наших собственных тестах, изменения в генерации кода сами по себе обычно уменьшают время CPU программы на 5–35%.

Были проведены значительные оптимизации, которые обеспечили более чем 10% улучшения в реализациях в следующих пакетах: crypto/sha1, crypto/sha256, encoding/binary, fmt, hash/adler32, hash/crc32, hash/crc64, image/color, math/big, strconv, strings, unicode, и unicode/utf16.

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

Стандартная библиотека

Context

Go 1.7 перемещает пакет golang.org/x/net/context в стандартную библиотеку как context. Это позволяет использовать контексты для отмены операций, установки таймаутов и передачи данных, связанных с запросом, в других пакетах стандартной библиотеки, включая net, net/http, и os/exec, как указано ниже.

Для получения дополнительной информации о контекстах см. документацию пакета и статью в блоге Go “Go Concurrent Patterns: Context.”

HTTP Tracing

Go 1.7 вводит пакет net/http/httptrace, который предоставляет механизмы для трассировки событий внутри HTTP-запросов.

Тестирование

Пакет testing теперь поддерживает определение тестов с подтестами и бенчмарков с подбенчмарками. Эта поддержка облегчает написание таблиц-Driven бенчмарков и создание иерархических тестов. Также предоставляется способ для совместного использования общего кода настройки и завершения. См. документацию пакета для получения подробной информации.

Среда выполнения

Все паники, инициированные средой выполнения, теперь используют значения паники, реализующие как встроенный тип error, так и runtime.Error, что соответствует требованиям спецификации языка.

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

Новая функция KeepAlive предоставляет явный механизм объявления того, что выделенный объект должен считаться достижимым в определенной точке программы, обычно чтобы отложить выполнение связанного финализатора.

Новая функция CallersFrames переводит срез PC, полученный с помощью Callers, в последовательность фреймов, соответствующих стеку вызовов. Новый API следует использовать вместо прямого обращения к FuncForPC, поскольку последовательность фреймов может более точно описывать стеки вызовов с встроенными функциями.

Новая функция SetCgoTraceback обеспечивает более тесную интеграцию между Go и C-кодом, выполняющимся в одном и том же процессе, вызванном с помощью cgo.

В 32-битных системах среда выполнения теперь может использовать память, выделенную операционной системой в любом месте адресного пространства, что устраняет ошибку “memory allocated by OS not in usable range”, встречающуюся в некоторых средах.

Среда выполнения теперь может возвращать неиспользуемую память операционной системе на всех архитектурах. В Go 1.6 и более ранних версиях среда выполнения не могла освобождать память на ARM64, 64-битном PowerPC или MIPS.

В Windows программы на Go, начиная с версии 1.5, при запуске принудительно устанавливали глобальное разрешение таймера Windows в 1 мс, вызывая timeBeginPeriod(1). Изменение глобального разрешения таймера вызывало проблемы на некоторых системах, а тестирование показало, что этот вызов не требовался для хорошей производительности планировщика, поэтому в Go 1.6 он был удалён. Go 1.7 возвращает этот вызов: в некоторых рабочих нагрузках он всё ещё необходим для хорошей производительности планировщика.

Минорные изменения в библиотеке

Как и всегда, в библиотеке были внесены различные незначительные изменения и обновления, сделанные с учётом обещания совместимости Go 1.

bufio

В предыдущих версиях Go, если метод Reader Peek запрашивал больше байтов, чем помещается в базовый буфер, он возвращал пустой срез и ошибку ErrBufferFull. Теперь он возвращает весь базовый буфер, всё ещё сопровождаемый ошибкой ErrBufferFull.

bytes

Добавлены новые функции ContainsAny и ContainsRune для симметрии с пакетом strings.

В предыдущих версиях Go, если метод Reader Read запрашивал ноль байтов, когда данные закончились, он возвращал счётчик 0 и без ошибки. Теперь он возвращает счётчик 0 и ошибку io.EOF.

Тип Reader получил новый метод Reset, позволяющий повторно использовать Reader.

compress/flate

Во всем пакете реализовано множество оптимизаций производительности. Скорость декомпрессии увеличена примерно на 10%, а скорость компрессии для DefaultCompression в два раза быстрее.

Помимо общих улучшений, компрессор BestSpeed был полностью заменен и теперь использует алгоритм, аналогичный Snappy, что привело к приблизительно 2.5-кратному увеличению скорости, хотя выходные данные могут быть на 5–10% больше, чем у предыдущего алгоритма.

Также добавлен новый уровень сжатия HuffmanOnly, который применяет только кодирование Хаффмана, но не Lempel-Ziv. Отказ от кодирования Lempel-Ziv означает, что HuffmanOnly работает примерно в 3 раза быстрее нового BestSpeed, но с тем недостатком, что сжатые данные будут на 20–40% больше, чем те, что генерируются новым BestSpeed.

Важно отметить, что как BestSpeed, так и HuffmanOnly производят сжатые выходные данные, соответствующие RFC 1951. Другими словами, любой корректный DEFLATE-декомпрессор по-прежнему сможет декомпрессировать эти данные.

Наконец, в реализации декомпрессора io.Reader была внесена небольшая правка. В предыдущих версиях декомпрессор откладывал сообщение io.EOF до тех пор, пока не останется возможности прочитать дополнительные байты. Теперь он сообщает io.EOF более агрессивно при чтении последней порции данных.

crypto/tls

Реализация TLS отправляет первые несколько пакетов данных по каждому соединению, используя небольшие размеры записей, постепенно увеличивая их до максимального размера TLS. Эвристика снижает объем данных, необходимых для получения перед декодированием первого пакета, что улучшает задержку связи в условиях низкой пропускной способности сети. Установка поля Config’s DynamicRecordSizingDisabled в true принудительно включает поведение Go 1.6 и более ранних версий, где пакеты имеют максимально возможный размер с самого начала соединения.

Клиент TLS теперь имеет опциональную, ограниченную поддержку переустановления соединения инициированного сервером, которая включается установкой поля Config’s Renegotiation. Это необходимо для подключения к множеству серверов Microsoft Azure.

Ошибки, возвращаемые пакетом, теперь последовательно начинаются с префикса tls:. В предыдущих версиях некоторые ошибки использовали префикс crypto/tls:, другие — tls:, а некоторые вообще не имели префикса.

При генерации самоподписанных сертификатов пакет больше не устанавливает поле «Authority Key Identifier» по умолчанию.

crypto/x509

Новая функция SystemCertPool обеспечивает доступ к всей системной пулу сертификатов, если он доступен. Также появился новый связанный тип ошибки SystemRootsError.

debug/dwarf

Новый метод Reader под названием SeekPC и новый метод Data под названием Ranges помогают находитьCompilation unit, который нужно передать в LineReader, а также идентифицировать конкретную функцию по заданному адресу программы.

debug/elf

Новый тип пересылки R_390 и множество предопределённых констант поддерживают порт для S390.

encoding/asn1

Декодер ASN.1 теперь отклоняет некорректные (не минимальные) представления целых чисел. Это может привести к тому, что пакет будет отклонять некоторые некорректные, но ранее принимавшиеся данные ASN.1.

encoding/json

Новый метод Encoder под названием SetIndent устанавливает параметры отступа для кодирования JSON, аналогично функции верхнего уровня Indent.

Новый метод Encoder под названием SetEscapeHTML управляет тем, должны ли символы &, < и > в закавыченных строках быть экранированы как \u0026, \u003c и \u003e, соответственно. Как и в предыдущих версиях, кодировщик по умолчанию применяет это экранирование, чтобы избежать определённых проблем, которые могут возникнуть при встраивании JSON в HTML.

В более ранних версиях Go этот пакет поддерживал только кодирование и декодирование карт с ключами строкового типа. Go 1.7 добавляет поддержку карт с ключами целочисленного типа: кодирование использует десятичное представление в кавычках в качестве ключа JSON. Go 1.7 также добавляет поддержку кодирования карт с ключами, не являющимися строками, реализующими метод MarshalText (см. encoding.TextMarshaler) а также поддержку декодирования карт с ключами, не являющимися строками, реализующими метод UnmarshalText (см. encoding.TextUnmarshaler). Эти методы игнорируются для ключей строкового типа, чтобы сохранить кодирование и декодирование, использовавшееся в более ранних версиях Go.

При кодировании среза типизированных байтов, Marshal теперь генерирует массив элементов, закодированных с использованием метода MarshalJSON или MarshalText соответствующего типа байта, если такие методы присутствуют, и только в случае отсутствия этих методов происходит возврат к стандартному кодированию в виде строки в формате base64. Ранее версии Go принимали как оригинальное кодирование в формате base64, так и массивное кодирование (при условии, что тип байта также реализует UnmarshalJSON или UnmarshalText соответственно), поэтому это изменение должно быть семантически обратно совместимо с предыдущими версиями Go, хотя оно действительно изменяет выбранное кодирование.

go/build

Для реализации нового функционала команды go, связанного с поддержкой пакетов только в бинарном виде и с кодом на Fortran в пакетах, использующих cgo, тип Package добавляет новые поля: BinaryOnly, CgoFFLAGS и FFiles.

go/doc

Для поддержки соответствующего изменения в команде go test, описанного выше, тип Example добавляет поле Unordered, указывающее, может ли пример генерировать строки вывода в произвольном порядке.

io

Пакет добавляет новые константы SeekStart, SeekCurrent и SeekEnd, которые предназначены для использования с реализациями Seeker. Эти константы предпочтительнее, чем os.SEEK_SET, os.SEEK_CUR и os.SEEK_END, но последние сохраняются для обратной совместимости.

math/big

Тип Float добавляет методы GobEncode и GobDecode, что позволяет кодировать и декодировать значения типа Float с использованием пакета encoding/gob.

math/rand

Функция Read и метод Read типа Rand теперь генерируют псевдослучайную последовательность байтов, которая остаётся постоянной и не зависит от размера входного буфера.

Документация уточняет, что методы Seed и Read типа Rand не являются безопасными для параллельного вызова, хотя глобальные функции Seed и Read (как и всегда) являются таковыми.

mime/multipart

Реализация Writer теперь выводит заголовки каждой секции multipart в отсортированном по ключу порядке. Ранее, при итерации по карте, заголовок секции использовал недетерминированный порядок.

net

В рамках введения контекста, тип Dialer получил новый метод DialContext, аналогичный Dial, но с добавлением context.Context для операции dial. Контекст предназначен для замены полей Dialer Cancel и Deadline, но реализация продолжает уважать их, для обеспечения обратной совместимости.

Метод String типа IP изменил своё поведение для недопустимых адресов IP. В предыдущих версиях, если байтовый срез IP имел длину, отличную от 0, 4 или 16, метод String возвращал "?". Go 1.7 добавляет шестнадцатеричное представление байтов, как в "?12ab".

Чисто Go реализация разрешения имён теперь учитывает предпочтения, указанные в nsswitch.conf, по приоритету DNS-запросов по сравнению с локальными файлами (то есть /etc/hosts).

net/http

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

В рамках введения контекста, тип Request получил новые методы: Context для получения связанного контекста и WithContext для создания копии Request с изменённым контекстом.

В реализации Server, метод Serve записывает в контекст запроса как базовый *Server, используя ключ ServerContextKey, так и локальный адрес, на котором был принят запрос (тип Addr), используя ключ LocalAddrContextKey. Например, адрес, на котором был принят запрос, можно получить так: req.Context().Value(http.LocalAddrContextKey).(net.Addr).

Метод Serve сервера теперь включает поддержку HTTP/2 только в том случае, если поле Server.TLSConfig равно nil или содержит "h2" в TLSConfig.NextProtos.

Реализация сервера теперь дополняет коды ответа, меньшие 100, до трёх цифр в соответствии с протоколом, так что w.WriteHeader(5) использует HTTP-статус ответа 005, а не просто 5.

Реализация сервера теперь корректно отправляет только один заголовок «Transfer-Encoding», когда «chunked» указан явно, следуя RFC 7230.

Реализация сервера теперь строже отклоняет запросы с недопустимыми версиями HTTP. Запросы, притворяющиеся HTTP/0.x, теперь отклоняются (HTTP/0.9 никогда не поддерживался полностью), а также отклоняются обычные (незашифрованные) HTTP/2-запросы, кроме запроса обновления «PRI * HTTP/2.0». Сервер продолжает обрабатывать зашифрованные HTTP/2-запросы.

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

В клиенте реализация Transport передаёт контекст запроса в любую операцию подключения к удалённому серверу. Если требуется пользовательский диалер, предпочтительнее использовать новое поле Transport DialContext вместо существующего поля Dial, чтобы транспорт мог предоставить контекст.

Transport также добавляет поля IdleConnTimeout, MaxIdleConns, и MaxResponseHeaderBytes для помощи в контроле ресурсов клиента, потребляемых покойными или шумными серверами.

Функция CheckRedirect, настроенная в Client, теперь может возвращать ErrUseLastResponse, чтобы указать, что последний ответ перенаправления должен быть возвращён как результат HTTP-запроса. Этот ответ теперь доступен в функции CheckRedirect через req.Response.

Начиная с Go 1, поведение HTTP-клиента по умолчанию запрашивает сжатие на стороне сервера с использованием заголовка запроса Accept-Encoding и затем прозрачно распаковывает тело ответа, и это поведение настраивается с помощью поля Transport DisableCompression. В Go 1.7, для упрощения реализации HTTP-прокси, новое поле Response Uncompressed сообщает, было ли выполнено это прозрачное распаковывание.

DetectContentType добавляет поддержку нескольких новых типов аудио и видео контента.

net/http/cgi

Handler добавляет новое поле Stderr, которое позволяет перенаправлять стандартный поток ошибок дочернего процесса от стандартного потока ошибок хост-процесса.

net/http/httptest

Функция NewRequest подготавливает новый http.Request, пригодный для передачи в http.Handler во время тестирования.

Новый метод Result объекта ResponseRecorder возвращает записанный http.Response. Тесты, которым требуется проверить заголовки или трейлеры ответа, должны вызывать Result и анализировать поля ответа, вместо того чтобы напрямую обращаться к HeaderMap объекта ResponseRecorder.

net/http/httputil

Реализация ReverseProxy теперь возвращает ответ с кодом «502 Bad Gateway», если не удаётся связаться с бэкендом; в более ранних версиях она возвращала «500 Internal Server Error».

Оба объекта: ClientConn и ServerConn были помечены как устаревшие (deprecated). Они являются низкоуровневыми, устаревшими и не используются текущей HTTP-стеком Go, и больше не будут обновляться. Программы должны использовать http.Client, http.Transport и http.Server вместо них.

net/http/pprof

HTTP-обработчик трассировки времени выполнения, установленный для обработки пути /debug/pprof/trace, теперь принимает дробное число в параметре запроса seconds, что позволяет собирать трассировки на интервалах меньше одной секунды. Это особенно полезно на загруженных серверах.

net/mail

Парсер адресов теперь разрешает неэкранированный текст UTF-8 в адресах, соответствующий RFC 6532, но он не применяет никакой нормализации к результату. Для совместимости со старыми почтовыми парсерами, кодировщик адресов, а именно метод String структуры Address, продолжает экранировать весь текст UTF-8 согласно RFC 5322.

Функция ParseAddress и метод AddressParser.Parse становятся более строгими. Ранее они игнорировали любые символы, следующие за адресом электронной почты, но теперь возвращают ошибку для любого символа, кроме пробельного.

net/url

Новое поле ForceQuery типа URL записывает, должен ли URL иметь строку запроса, чтобы отличать URLs без строки запроса (например, /search) от URLs с пустой строкой запроса (например, /search?).

os

IsExist теперь возвращает true для syscall.ENOTEMPTY, на системах, где существует такая ошибка.

В Windows, Remove теперь удаляет файлы только для чтения, когда это возможно, делая поведение реализации совместимым с поведением на неподдерживаемых Windows системах.

os/exec

В рамках введения контекста, новый конструктор CommandContext работает аналогично Command, но включает контекст, который может быть использован для отмены выполнения команды.

os/user

Функция Current теперь реализована даже тогда, когда cgo недоступен.

Новый тип Group, а также функции поиска LookupGroup и LookupGroupId и новое поле GroupIds в структуре User, обеспечивают доступ к информации о группах пользователей, специфичной для системы.

reflect

Хотя метод Field типа Value всегда был документирован как вызывающий панику, если заданный номер поля i выходит за пределы диапазона, он вместо этого тихо возвращал нулевое значение Value. Go 1.7 изменяет поведение метода, чтобы оно соответствовало документации.

Новая функция StructOf создаёт тип структуры во время выполнения. Она завершает набор конструкторов типов, дополняя ArrayOf, ChanOf, FuncOf, MapOf, PtrTo, и SliceOf.

Новый метод Lookup типа StructTag работает аналогично Get, но отличает тег, в котором отсутствует заданный ключ, от тега, сопоставляющего пустую строку с заданным ключом.

Методы Method и NumMethod типа Type и Value больше не возвращают или не учитывают неэкспортируемые методы.

strings

В предыдущих версиях Go, если метод Reader Read получал запрос на чтение нулевого количества байт при отсутствии оставшихся данных, он возвращал счётчик равный 0 и без ошибки. Теперь же он возвращает счётчик равный 0 и ошибку io.EOF.

Тип Reader получил новый метод Reset, позволяющий повторно использовать Reader.

time

Метод String типа Duration теперь отображает нулевую продолжительность как "0s", а не как "0". ParseDuration продолжает принимать оба формата.

Вызов метода time.Local.String() теперь возвращает "Local" на всех системах; в более ранних версиях он возвращал пустую строку в Windows.

База данных часовых поясов в $GOROOT/lib/time была обновлена до IANA релиза 2016d. Эта резервная база данных используется только тогда, когда системная база данных часовых поясов не может быть найдена, например, в Windows. Список сокращений часовых поясов в Windows также был обновлён.

syscall

В Linux структура SysProcAttr (как используется в поле SysProcAttr в os/exec.Cmd) получила новое поле Unshareflags. Если это поле ненулевое, дочерний процесс, созданный через ForkExec (как используется в методе Run в exec.Cmd) вызовет системный вызов unshare(2) до запуска новой программы.

unicode

Пакет unicode и связанная с ним поддержка во всей системе были обновлены с версии 8.0 до Unicode 9.0.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang