Примечания к выпуску 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.