Все, что вам нужно знать о Go версии 1.11

1656552614 vse chto vam nuzhno znat o go versii 111

автор Ридхам Тарпара

ntwZykW1fp4WjIgSY9ocO3c89IKtgkklC78z

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 инструкций пользователя пакета, пользователи могут записывать информацию на уровне программы в трассировку выполнения и создавать группы связанных горпрограмм. The go tool trace Команда визуализирует эту информацию в представлении трассировки и на странице анализа новой задачи/региона пользователя.
  • В среде выполнения теперь используется разреженный макет кучи, поэтому больше нет ограничений на размер кучи Go (ранее ограничение составляло 512 Гб). Это также исправляет редкие сбои «конфликта адресного пространства» в смешанных двоичных файлах Go/C или двоичных файлах, скомпилированных из -race.
  • время: теперь поддерживается анализ часовых поясов, отмеченных знаком и смещением. В предыдущих версиях числовые названия часовых поясов (например +03) не считались действительными, а лишь трехбуквенные аббревиатуры (например MST) были приняты во время ожидания названия часового пояса.
  • текст/сканер: The Scanner.Scan теперь метод возвращает RawString маркер вместо String для необработанных строчных литералов.
  • Существуют изменения в криптографии, кодировании, net/http, OS, среде выполнения, синхронизации, пантоме и некоторых других, о которых вы можете прочитать здесь.

Если вам понравилась эта статья, избавьте меня от хлопаний – это означает весь мир для писателя. Подпишитесь на меня, если вы хотите прочитать больше статей о Go, JavaScript, технологиях и стартапах.

Добавить комментарий

Ваш адрес email не будет опубликован.