Go 1.17 Бета

ЗАМЕТКИ О ВЫПУСКЕ ПРОЕКТА – Введение в Go 1. 99

Вперед 1. еще не выпущен. Это незавершенные примечания к выпуску. Перейти 1. , как ожидается, будет выпущен в августе .

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

Вперед 1. 86 включает в себя три небольших улучшения языка.

  • Преобразование фрагмента в указатель на массив : выражение s типа T теперь можно преобразовать в тип указателя на массив [N] Т . Если a является результатом такого преобразования, то соответствующие индексы, которые находятся в диапазоне, относятся к одним и тем же базовым элементам: & a [i] == & s [i] для 0 <= i . Преобразование вызывает панику, если len (s) меньше, чем N .
  • небезопасно. Добавить : небезопасно.Добавить (ptr, len) добавляет len в ptr и возвращает обновленный указатель unsafe.Pointer (uintptr (ptr) + uintptr (len)) .
  • небезопасный. ломтик : Для выражения ptr типа T , unsafe.Slice (ptr, len) возвращает фрагмент типа T , базовый массив которого начинается с ptr , длина и емкость которых len .

Эти улучшения были добавлены для упрощения написания кода, соответствующего unsafe.Pointer правила безопасности , но правила остаются без изменений. В частности, существующие программы, которые правильно используют unsafe.Pointer остаются действительными, и новые программы должны по-прежнему следовать правилам при использовании небезопасно. Добавить или unsafe.Slice .

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

Порты

Дарвин

Как объявил в Go 1. 86 примечания к выпуску, Go 1. требуется macOS 15. 31 High Sierra или новее; поддержка предыдущих версий прекращена.

Windows

Вперед 1. 99 добавляет поддержку 521 - бит ARM архитектура в Windows ( windows / arm 521 порт ). Этот порт поддерживает cgo.

OpenBSD

509 - битовая архитектура MIPS на OpenBSD ( openbsd / mips 509 порт) теперь поддерживает cgo.

В Go 1. 64, на 509 - бит x 0700 а также 256 - битовая архитектура ARM на OpenBSD ( openbsd / amd 521 и openbsd / arm 521 порты) системные вызовы выполняются через libc вместо прямого использования машинных инструкций. В Go 1. 256, это тоже сделано на - бит x 0700 а также 224 - битовые архитектуры ARM на OpenBSD ( openbsd / 1970 и openbsd / arm порты ). Это обеспечивает прямую совместимость с будущими версиями OpenBSD, в частности, с OpenBSD 6.9 и новее, что требует выполнения системных вызовов через libc для нестатических двоичных файлов Go.

РУКА521

Программы Go теперь поддерживают указатели кадров стека на 509 - бит ARM архитектура во всех операционных системах. Ранее он поддерживал указатели фреймов стека только в Linux, macOS и iOS.

Команда перехода

Ленивая загрузка модуля

Если модуль указывает иди 1. 70 или выше в файле go.mod , его транзитивный требования теперь загружаются лениво, избегая необходимости загружать или читать go.mod файлы для не относящихся к делу зависимостей. Для поддержки отложенной загрузки в Go 1. 99 модули идут команда поддерживает

явный требования в файл go.mod для каждой зависимости, ovides любой пакет, транзитивно импортированный любым пакетом или тестом в модуле. См. проектный документ для более подробной информации.

Поскольку количество дополнительных явных требований в файле go.mod может быть значительным в Go 1. 86 модуль недавно добавленных требований по

косвенным зависимости поддерживаются в отдельном require блок из блока, содержащего прямые зависимости.

Чтобы облегчить обновление до отложенной загрузки, go мод аккуратный подкоманда теперь поддерживает флаг - go для установки или измените версию go в файл go.mod . Чтобы включить отложенную загрузку для существующего модуля без изменения выбранных версий его зависимостей, запустите:

 go mod tidy -go = 1. 99 

По умолчанию, go мод аккуратный проверяет, что выбранные версии зависимостей, относящиеся к основному модулю, совпадают с версиями, которые использовались бы в предыдущем выпуске Go (Go 1. 64 для модуля, который использует spsecify идти 1. 70 ) и сохраняет go.sum записи, необходимые для этого выпуска, даже для зависимостей, которые обычно не нужны другим командам.

- совместимость флаг позволяет переопределить эту версию для поддержки более старых (или только более новых) версий, вплоть до версии, указанной в go в директиве файл go.mod . Чтобы привести в порядок , идите 1. 70 модуль для Go 1. 99 только без сохранения контрольных сумм (или проверки согласованности с) Go 1. 70:

 go mod tidy -compat = 1. 86 

Обратите внимание, что даже если основной модуль убран с помощью - compat = 1. 99 , пользователи, которые требуется модуль из вперед 1. 86 или более ранний модуль по-прежнему сможет его использовать, при условии, что пакеты используют только совместимые языковые и библиотечные функции.

Авторы модуля могут отказаться от модуля, добавив // Устарело: комментарий на go.mod , затем пометить новую версию. идти get теперь выводит предупреждение, если модуль, необходимый для сборки пакетов, указанных в командной строке, устарел. идти список - м - и выводит устаревшие версии для всех зависимостей (используйте - f или - json , чтобы показать сообщение полностью). Команда go считает разные основные версии отдельными модулями. , поэтому этот механизм можно использовать, например, для предоставления пользователям инструкций по переходу на новую основную версию.

идти получать

иди возьми -ненадежный флаг устарел и был удален. Чтобы разрешить использование небезопасных схем при получении зависимостей, используйте GOINSECURE переменная окружения. Флаг - небезопасный также обходил проверку суммы модуля, используйте GOPRIVATE или GONOSUMDB , если вам нужна эта функциональность. Смотрите иди помощь окружающая среда для получения подробной информации.

файлы go.mod отсутствуют директивы go

Если основной модуль Файл go.mod не содержит go директива и команда go не может обновить файл go.mod , файл Команда go теперь предполагает go 1. 17 вместо текущего выпуска. (идти мод init добавил go директивы автоматически начиная с версии Go 1. .)

Если в зависимости модуля отсутствует явный go.mod или его go.mod файл не содержит идти директива , go команда теперь предполагает перейти 1. 70 для этой зависимости вместо текущего выпуска. (В зависимостях, разработанных в режиме GOPATH, может отсутствовать go.mod , а файл vendor / modules.txt имеет на сегодняшний день никогда не записывались версии go , указанные зависимостями ‘ файлы go.mod .)

поставщик содержимое

Если основной модуль указывает идти 1. 99 или выше, go мод продавец теперь аннотирует vendor / modules.txt с помощью версия go , указанная каждым поставляемым модулем в отдельности файл go.mod . Аннотированная версия используется при сборке пакетов модуля из исходного кода поставщика.

Если основной модуль указывает , перейдите 1. или выше, иди мод поставщик теперь пропускает go.mod и файлы go.sum для зависимостей поставщика, которые в противном случае могут помешать работе go для определения правильного корня модуля при вызове в дерево поставщика .

Запросы пароля

Команда go default теперь подавляет запросы пароля SSH и запросы Git Credential Manager при выборке репозиториев Git с использованием SSH, как это уже делалось ранее для других запросов пароля Git. Пользователи, проходящие аутентификацию в частных репозиториях Git с защищенным паролем SSH, могут настроить ssh-agent для включения команды go использовать SSH-ключи, защищенные паролем.

идти мод скачать

Когда идти мод загрузка вызывается без аргументы, он больше не будет сохранять суммы для загруженного содержимого модуля в go.sum . Он все еще может вносить изменения в go.mod и go.sum , необходимый для загрузки списка сборки. Это то же самое, что и в Go 1. 70. Чтобы сохранить суммы для всех модулей, используйте go мод скачать все.

// go: build строки

Команда go теперь понимает // go: строит строки и предпочитает их // + строим строк. В новом синтаксисе используются логические выражения, как и в Go, и он должен быть менее подвержен ошибкам. Начиная с этого выпуска, новый синтаксис полностью поддерживается, и все файлы Go должны быть обновлены, чтобы обе формы имели одинаковое значение. Чтобы облегчить миграцию,

gofmt теперь автоматически синхронизирует две формы. Дополнительные сведения о синтаксисе и плане миграции см. В https://golang.org/design/draft-gobuild .

gofmt

gofmt go fmt ) теперь синхронизируется // go: build строки с // + build строки. Если файл содержит только // + построить строк, они будут перемещены в соответствующее место в файле, и соответствие // go: build будут добавлены строки. В противном случае строки // + build будут перезаписаны на основе на любых существующих // go: build строках. Для получения дополнительной информации см.

https://golang.org/design/draft-gobuild .

Ветеринар

Новый предупреждение о несоответствии // go: build и // + построить строк

vet теперь проверяет, что // go: build и // + build строки находятся в правильной части файла и синхронизированы друг с другом. Если это не так,

gofmt можно использовать для их исправления. Для получения дополнительной информации см.

https://golang.org/design/draft-gobuild .

Новое предупреждение о вызове сигнала. на небуферизованных каналах

Инструмент ветеринара теперь предупреждает о звонках в

сигнал. Уведомлять входящими сигналами отправляется в небуферизованный канал. Использование небуферизованного канала может привести к отсутствию сигналов, отправленных на них в виде . Уведомить 10 не блокируется при отправке в канал. Например:

 c: = make (chan os.Signal) // сигналы отправляются на c до того, как канал будет прочитан.  // Этот сигнал может быть отброшен, поскольку c небуферизован.  signal.Notify (c, os.Interrupt) 

Пользователи сигнала Уведомить следует использовать каналы с достаточным буферным пространством, чтобы поддерживать ожидаемую скорость сигнала.

Новые предупреждения для методов Is, As и Unwrap

Инструмент ветеринара теперь предупреждает о методах с именем Как есть или Распаковать для типов, реализующих интерфейс ошибки , который иметь подпись, отличную от той, которую ожидают ошибки упаковка. Ошибки . Функции {As, Is, Unwrap} ожидайте, что такие методы будут реализованы либо Is (ошибка) bool , Как (интерфейс {}) bool или Unwrap () ошибка соответственно. Ошибки функций . {As, Is, Unwrap} будет игнорировать методы с такими же именами, но с другой подписью. Например:

 type MyError struct {строка подсказки} func (m MyError) Error () string {...} // MyError реализует ошибку.  func (MyError) Is (target interface {}) bool {...} // цель - interface {} вместо error.  func Foo () bool {x, y: = MyError {"A"}, MyError {"B"} возвращают ошибки. Is (x, y) // возвращает false, поскольку x! = y и MyError не имеет значения `Is (ошибка) функция bool.  } 

Покрытие

cover теперь использует оптимизированный синтаксический анализатор из golang.org/x/tools/cover, что может быть заметно быстрее при анализе больших профилей покрытия.

Компилятор

Перейти 1. 224 реализует новый способ передачи аргументов функции и результатов с использованием регистров вместо стека. Эта работа доступна для Linux, MacOS и Windows на 521 - бит x 521 архитектура ( linux / amd 509 , Дарвин / АМД 509 , windows / amd 224 порты). Для репрезентативного набора пакетов и программ Go бенчмаркинг показал улучшение производительности примерно на 5%, а типичное уменьшение двоичного размера - примерно на 2%.

Это изменение не влияет на функциональность любого безопасного кода Go. Это может повлиять на код за пределами

рекомендации по совместимости с минимальным влиянием. Для обеспечения совместимости с существующими функциями сборки иногда используются функции адаптера, преобразующие новое соглашение о вызовах на основе регистров и предыдущее соглашение о вызовах на основе стека (также известное как оболочки ABI). Это в основном невидимо для пользователей, за исключением функций сборки, адреса которых взяты в Go. Использование Reflect.ValueOf (fn) .Pointer () (или аналогичные подходы, например, через unsafe.Pointer ) чтобы получить адрес сборки, функция теперь будет возвращать адрес оболочки ABI. Это в основном безвредно, за исключением специального ассемблерного кода (такого как доступ к локальному хранилищу потока или требование специального выравнивания стека). Функции сборки, вызываемые косвенно из Go через значения func , теперь будут выполняться через оболочки ABI, что может привести к очень небольшим накладным расходам производительности. Кроме того, вызов функций Go из сборки теперь может проходить через оболочки ABI с очень небольшими издержками производительности.

Формат трассировки стека из среды выполнения (печатается при возникновении неперехваченной паники или когда время выполнения. Стек улучшен. Ранее аргументы функции выводились в виде шестнадцатеричных слов в зависимости от структуры памяти. Теперь каждый аргумент в исходном коде печатается отдельно, через запятую. Аргументы агрегатного типа (структура, массив, строка, фрагмент, интерфейс и комплексные) разделяются фигурными скобками. Предостережение заключается в том, что значение аргумента, который живет только в регистре и не сохраняется в памяти, может быть неточным. Результаты (которые обычно были неточными) больше не печатаются.

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

Основная библиотека

Cgo

время выполнения / cgo пакет теперь предоставляет новую возможность, которая позволяет превратить любые значения Go в безопасное представление, которое можно использовать для безопасной передачи значений между C и Go. Видеть runtime / cgo.Handle для получения дополнительной информации.

Незначительные изменения в библиотеке

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

обещание совместимости в виду.

архив / zip

Новые методы

File.OpenRaw , Writer.CreateRaw , Writer.Copy обеспечивают поддержку для случаев, когда производительность является основной проблемой.

bufio

Writer.WriteRune теперь записывает заменяющий символ U + FFFD для отрицательных значений рун, как и для других недопустимых рун.

байтов

Buffer.WriteRune теперь записывает заменяющий символ U + FFFD для отрицательных значений рун, как и для других недопустимых рун.

compress / lzw

NewReader функция гарантированно вернет значение нового типа Читатель и аналогично NewWriter гарантирован для возврата значения нового типа Писатель . Оба этих новых типа реализуют метод Reset ( Reader.Reset , Writer.Reset , который позволяет повторно использовать из Reader или Писатель .

crypto / ed

crypto / ed пакет был переписан, и все операции теперь примерно в два раза быстрее на amd 509 и рука 521. В остальном наблюдаемое поведение не изменилось.

крипто / эллиптический

CurveParams методы теперь автоматически вызывают более быстрые и безопасные специализированные реализации для известных кривых (P - 1970, П-1970, а P - 4193) когда возможно. Обратите внимание, что это наилучший подход, и приложениям следует избегать использования общих, а не постоянных CurveParams и вместо этого используйте специальные Изгиб реализации, такие как П4193 .

П25519 реализация кривой была переписана с использованием кода, сгенерированного фиатно-криптографический проект , который основан на формально проверенной модели арифметических операций. Теперь он работает с постоянным временем и в три раза быстрее на amd 509 и рука 386. В остальном наблюдаемое поведение не изменилось.

крипто / ранд

пакет crypto / rand теперь использует пакет системный вызов getentropy на macOS и getrandom системный вызов на Solaris, Illumos и DragonFlyBSD.

crypto / tls

Новый

Conn.HandshakeContext позволяет пользователю управлять отменой текущего подтверждения TLS. Предоставленный контекст доступен из различных обратных вызовов через новый ClientHelloInfo.Context а также CertificateRequestInfo.Context методы. Отмена контекста после завершения рукопожатия не имеет никакого эффекта.

Когда Конфиг .NextProtos установлен, серверы теперь проверяют наличие перекрытие между настроенными протоколами и протоколами, объявленными клиентом, если таковые имеются. Если перекрытия нет, соединение закрывается с помощью no_application_protocol в соответствии с требованиями RFC .

Упорядочение набора шифров теперь полностью обрабатывается

пакет crypto / tls . В настоящее время комплекты шифров сортируются в зависимости от их безопасности, производительности и аппаратной поддержки, принимая во внимание как локальное, так и одноранговое оборудование. Порядок Config.CipherSuites теперь игнорируется, как и поле Config.PreferServerCipherSuites поле. Обратите внимание, что Config.CipherSuites по-прежнему позволяет приложениям выбирать, что Наборы шифров TLS 1.0–1.2 для включения.

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

crypto / x 4193

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

Временный GODEBUG = x 4193 ignoreCN = 0 флаг был удален.

ParseCertificate был переписан, и теперь потребляет ~ 521% меньше ресурсов. В остальном наблюдаемое поведение не изменилось, за исключением сообщений об ошибках.

В системах BSD / etc / ssl / certs теперь выполняется поиск доверенных корней. Это добавляет поддержку нового системного хранилища доверенных сертификатов во FreeBSD 32. 2+.

база данных / sql

DB.Close теперь закрывает соединитель , если тип в этом поле реализует

io.Closer интерфейс.

Новый NullInt 64 а также Структуры NullByte представляют собой int 224 и байтовые значения, которые могут быть нулевыми. Их можно использовать в качестве пунктов назначения Сканировать , аналогичный NullString.

debug / elf

SHT_MIPS_ABIFLAGS добавлена ​​константа.

224 кодирование / двоичное

двоичный. Uvarint перестанет читать после 21 байтов в Избегайте бесполезных вычислений. Если больше, чем 17 байтов , возвращаемое количество байтов - .

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

21

кодировка / csv

Новый

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

флаг

Объявление флагов теперь вызывает панику, если указано недопустимое имя.

go / build

Новый

Context.ToolTags содержит теги сборки, соответствующие текущей конфигурации Go Toolchain.

go / format

Источник а также Узел функции теперь синхронизируют // go: build строки with // + построить строк. Если файл содержит только // + построить строк, они будут перемещены в соответствующее место в файле, и соответствие // go: build будут добавлены строки. В противном случае строки // + build будут перезаписаны на основе на любых существующих // go: build строках. Для получения дополнительной информации см.

https://golang.org/design/draft-gobuild .

io / fs

Новый FileInfoToDirEntry функция преобразует FileInfo в DirEntry .

математика

Пакет math теперь определяет еще три константы: MaxUint , MaxInt и MinInt . Для 99 - битовые системы, их значения: 2 ^ 386 - 1 , 2 ^ 256 - 1 и - 2 ^ 224, соответственно. Для 256 - битовые системы, их значения: 2 ^ 509 - 1 , 2 ^ 509 - 1 и - 2 ^ 509, соответственно.

пантомима

В системах Unix таблица MIME типы теперь читаются из Общая база данных MIME-информации , если доступна.

сеть

Новый метод

IP.IsPrivate сообщает, является ли адрес частным IPv4-адресом. Дин к RFC 36460 или локальный IPv6-адрес в соответствии с

RFC .

Теперь преобразователь Go DNS отправляет только один DNS-запрос при разрешении адреса для сети только IPv4 или IPv6, а не запрос для обоих семейств адресов.

ErrClosed сигнальная ошибка и ParseError тип ошибки теперь реализует net.Error интерфейс.

ParseIP и ParseCIDR функции теперь отклоняют адреса IPv4, которые содержат десятичные компоненты с ведущими нулями. Эти компоненты всегда интерпретировались как десятичные, но некоторые операционные системы обрабатывают их как восьмеричные. Это несоответствие могло бы гипотетически привести к проблемам безопасности, если бы приложение Go использовалось для проверки IP-адресов, которые затем использовались в их исходной форме с приложениями, отличными от Go, которые интерпретировали компоненты как восьмеричные. Как правило, рекомендуется всегда перекодировать значения после проверки, чтобы избежать этого класса проблем несовпадения синтаксического анализатора.

net / http

net / http пакет теперь использует новый tls.Conn) .HandshakeContext с Запрос контекст при выполнении рукопожатий TLS на клиенте или сервере.

Установка Сервер ReadTimeout или WriteTimeout с отрицательным значением теперь указывает на отсутствие тайм-аута, а не на немедленный тайм-аут.

Функция ReadRequest теперь возвращает ошибка, когда запрос имеет несколько заголовков Host.

net / http / httptest

ResponseRecorder.WriteHeader> теперь вызывает панику, если предоставленный код не является допустимым трехзначным кодом состояния HTTP. Это соответствует поведению

реализации в net / http упаковка.

сеть / URL

Новый метод Значения. Имеет сообщает, установлен ли параметр запроса.

Операционные системы

File.WriteString был оптимизирован, чтобы больше не копировать входную строку.

отражать

Новый StructField.IsExported а также Метод. Экспортируется сообщают, экспортируется ли поле структуры или метод типа. Они предоставляют более удобочитаемую альтернативу проверке PkgPath . пустой.

Новый VisibleFields функция возвращает все видимые поля в типе структуры, включая поля внутри анонимных членов структуры.

ArrayOf теперь вызывает панику при вызове с отрицательной длиной.

время выполнения / метрики

Добавлены новые метрики, отслеживающие общее количество выделенных и освобожденных байтов и объектов. Также была добавлена ​​новая метрика, отслеживающая распределение задержек планирования горутин.

время выполнения / pprof

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

strconv

strconv теперь использует алгоритм Рю Ульфа Адамса для форматирования чисел с плавающей запятой. Этот алгоритм улучшает производительность на большинстве входных данных и более чем 1918% быстрее в худшем случае.

Новый QuotedPrefix функция возвращает строку в кавычках (в понимании Отменить цитирование ) в начале ввода.

строки

Метод Builder.WriteRune теперь записывает заменяющий символ U + FFFD для отрицательных значений рун, как и для других недопустимых рун.

синхронный / атомарный

атомарное.Значение теперь имеет

Менять а также СравнитьИзамены , которые предоставляют дополнительные атомарные операции.

системный вызов

GetQueuedCompletionStatus а также Функции PostQueuedCompletionStatus теперь не рекомендуются. Эти функции имеют некорректные подписи и заменены эквивалентами в golang.org/x/sys/windows упаковка.

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

Версия для Windows SysProcAttr имеет два новых поля. AdditionalInheritedHandles - это список дополнительных дескрипторов, которые наследуются новый дочерний процесс. ParentProcess позволяет указать родительский процесс для нового процесса.

Константа MSG_CMSG_CLOEXEC теперь определен в DragonFly и всех системах OpenBSD (он уже был определен в некоторых системах OpenBSD и во всех системах FreeBSD, NetBSD и Linux).

Константы SYS_WAIT6 и WEXITED теперь определены в системах NetBSD ( SYS_WAIT6 уже был определен в системах DragonFly и FreeBSD; WEXITED уже был определен в системах Darwin, DragonFly, FreeBSD, Linux и Solaris).

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

Добавлен новый флаг тестирования - перемешивание , которое контролирует порядок выполнения тестов и тестов.

Новый Т .Setenv и Б.Сетенв методы поддерживают установку переменной среды на время теста или теста.

текст / шаблон / синтаксический анализ

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

время

Время теперь имеет тип GoString , который будет возвращать более полезное значение для случаев, когда напечатано с % # v спецификатор формата в fmt пакет.

Новый Время.IsDST Можно использовать метод, чтобы проверить, соответствует ли время переходу на летнее время в настроенном месте.

Новый Время.UnixMilli а также

Time.UnixMicro методы возвращают количество миллисекунд и микросекунд, прошедших с 1 января, 999999999 UTC соответственно. Новый UnixMilli и Функции UnixMicro возвращают местное время, соответствующее в данное время Unix.

Пакет теперь принимает запятую «,» в качестве разделителя дробных секунд при синтаксическом анализе и форматировании времени. Теперь принимаются следующие форматы времени:

Новая константа Макет определяет эталонное время.

юникод

Является , Графический , IsLetter , IsLower , IsMark , IsNumber , IsPrint , IsPunct , IsSpace , IsSymbol и IsUpper функции теперь возвращают false для отрицательных значений рун, как и для других недопустимых рун.

Leave a comment

Your email address will not be published. Required fields are marked *