
Содержание статьи
автор Ридхам Тарпара

Go 1.11 вышел на рынок 24 августа 2018 года. Он представляет несколько действительно необходимых инструментов и компонентов, таких как версионные модули, поддержка WebAssembly и улучшение отладки. Он также вносит некоторые изменения в основные пакеты и производительность/время выполнения.
Как обычно, выпуск поддерживает обещание совместимости Go 1. Поэтому почти все приложения Go продолжают компилировать и выполняться по-прежнему с этим обновлением. Нет изменений в спецификации языка.
Давайте посмотрим, что нового.
Модули
Go 1.11 включает экспериментальную поддержку модулей Go, включая новый модуль go get
команда.
Самый быстрый способ воспользоваться преимуществами новой поддержки модулей – это проверить свое хранилище в каталоге снаружи, создайте файл go.mod и запустите команды Go из этого дерева файлов.
Давайте продемонстрируем это. Я использую мощный testify и стандартные библиотеки тестирования Go.
Давайте клонируем репо testify в моей любимой папке ~/proj/github
.
$ git clone ~/proj/github/testify$ cd ~/proj/github/testify
Теперь, чтобы использовать команды Go отсюда, вам нужно инициализировать это репо как модуль с помощью такой команды:
go mod init github.com/stretchr/testify
Где github.com/stretchr/testify
Это место, которое вы обычно размещаете репо в папке Go src.
Эта команда создаст файл go.mod в корне папки. В проекте, уже использующем существующий инструмент управления зависимостями, например godep, glide или dep, go mod init
также добавит операторы require, соответствующие существующей конфигурации.
Теперь, если вы откроете go.mod
файл, вы можете просмотреть список зависимостей с названием модуля.
$ vi go.mod
module github.com/stretchr/testify
require ( github.com/davecgh/go-spew v1.1.0 github.com/pmezard/go-difflib v1.0.0 github.com/stretchr/objx v0.1.0)
Как вы заметите, эти три являются зависимостями свидетельства. Это свидетельство Gopkg.toml
файл:
[prune] unused-packages = true non-go = true go-tests = true
[[constraint]] name = “github.com/davecgh/go-spew” version = “~1.1.0”
[[constraint]] name = “github.com/pmezard/go-difflib” version = “~1.0.0”
[[constraint]] name = “github.com/stretchr/objx” version = “~0.1.0”
Теперь, когда модуль инициализирован, вы можете использовать любую команду Go из этой папки.
╭─ ~/proj/github/testify ‹master*› ╰─$ go build go: finding github.com/davecgh/go-spew v1.1.0go: finding github.com/pmezard/go-difflib v1.0.0go: finding github.com/stretchr/objx v0.1.0go: downloading github.com/davecgh/go-spew v1.1.0go: downloading github.com/pmezard/go-difflib v1.0.0go: downloading github.com/stretchr/objx v0.1.0
╭─ ~/proj/github/testify ‹master*› ╰─$ go test PASSok github.com/stretchr/testify 0.001s
Так что с помощью Go 1.11 и модулей вы можете писать свои модули Go где угодно, и вам не нужно хранить копию в определенный подкаталог вашего $GOPATH
.
WebAssembly
Go 1.11 добавляет экспериментальный порт в WebAssembly.
WebAssembly (сокращенно Васм) – это двоичный формат инструкций для виртуальной машины на основе стека. Wasm разработана как переносная цель для компиляции языков высокого уровня, таких как C/C++/Rust, позволяющая развертывать в Интернете клиентские и серверные программы.
Теперь мы можем запускать Go в браузере, и наоборот – мы можем легко запускать JavaScript в Go. Хотя эта функция находится в экспериментальном состоянии, она все еще достаточно полезна.
Этот небольшой пример вызывает Go из Интернета:
wasm-exec.html
<!doctype html><!--Copyright 2018 The Go Authors. All rights reserved.Use of this source code is governed by a BSD-stylelicense that can be found in the LICENSE file.--><html>
<head> <meta charset="utf-8"> <title>Go wasm</title></head>
<body> <script src=" <script> if (!WebAssembly.instantiateStreaming) { // polyfill WebAssembly.instantiateStreaming = async (resp, importObject) => { const source = await (await resp).arrayBuffer(); return await WebAssembly.instantiate(source, importObject); }; } const go = new Go(); let mod, inst; WebAssembly.instantiateStreaming(fetch("test.wasm"), go.importObject).then((result) => { mod = result.module; inst = result.instance; document.getElementById("runButton").disabled = false; }); let printMessage // Our reference to the Go callback let printMessageReceived // Our promise let resolvePrintMessageReceived // Our promise resolver function setPrintMessage(callback) { printMessage = callback resolvePrintMessageReceived() } async function run() { console.clear() // Create the Promise and store its resolve function printMessageReceived = new Promise(resolve => { resolvePrintMessageReceived = resolve }) const run = go.run(inst) // Start the wasm binary await printMessageReceived // Wait for the callback reception printMessage('Hello Wasm!') // Invoke the callback await run // Wait for the binary to terminate inst = await WebAssembly.instantiate(mod, go.importObject) // reset instance } </script>
<button onClick="run();" id="runButton" disabled>Run</button></body>
</html>
иди-колокола.
package main
import ( "fmt" "syscall/js")
var done = make(chan struct{})
func main() { callback := js.NewCallback(printMessage) defer callback.Release() // To defer the callback releasing is a good practice setPrintMessage := js.Global().Get("setPrintMessage") setPrintMessage.Invoke(callback) <-done}
func printMessage(args []js.Value) { message := args[0].String() fmt.Println(message) done <- struct{}{} // Notify printMessage has been called}
Больше примеров можно найти здесь. А вот и видео с создания калькулятора с помощью WebAssembly.
Другие изменения, которые следует рассмотреть
- Поскольку поддержка модуля Go придает особое значение
@
символ в операциях командной строки,go
команда теперь запрещает использование путей импорта, содержащих@
символы. - С новым
runtime/trace
API инструкций пользователя пакета, пользователи могут записывать информацию на уровне программы в трассировку выполнения и создавать группы связанных горпрограмм. Thego
tool
trace
Команда визуализирует эту информацию в представлении трассировки и на странице анализа новой задачи/региона пользователя. - В среде выполнения теперь используется разреженный макет кучи, поэтому больше нет ограничений на размер кучи Go (ранее ограничение составляло 512 Гб). Это также исправляет редкие сбои «конфликта адресного пространства» в смешанных двоичных файлах Go/C или двоичных файлах, скомпилированных из
-race
. - время: теперь поддерживается анализ часовых поясов, отмеченных знаком и смещением. В предыдущих версиях числовые названия часовых поясов (например
+03
) не считались действительными, а лишь трехбуквенные аббревиатуры (напримерMST
) были приняты во время ожидания названия часового пояса. - текст/сканер: The
Scanner.Scan
теперь метод возвращаетRawString
маркер вместоString
для необработанных строчных литералов. - Существуют изменения в криптографии, кодировании, net/http, OS, среде выполнения, синхронизации, пантоме и некоторых других, о которых вы можете прочитать здесь.
Если вам понравилась эта статья, избавьте меня от хлопаний – это означает весь мир для писателя. Подпишитесь на меня, если вы хотите прочитать больше статей о Go, JavaScript, технологиях и стартапах.