Рубрики
Без рубрики

От javaScript, чтобы пойти.

Эта статья, основанная на книге, Go для разработчиков JavaScript стремится помочь вам немного понять … Tagged with Go, JavaScript, новички.

Эта статья, основанная на книге Перейти за разработчиками JavaScript Целью помочь вам понять немного экосистемы Голанга, и почему бы и не помочь вам начать писать код GO!

Во -первых, базовая информация.

Что уйти?

По своему собственному описанию, Go IS Язык программирования с открытым исходным кодом, который позволяет легко создавать простое, надежное и эффективное программное обеспечение. Это означает, что GO сосредоточен на простоте и эффективности. Вы узнаете, как это делает это.

Кто использует Go?

Такие компании, как Uber, Google, Dailymotion, Twitch, Sendgrid и даже среднее использование, идут на свои системы. Uber Eng даже написал сообщение в блоге, объясняющее Как они используют свои поиски геозоны в реальном времени Анкет

Зачем идти?

Ну, я надеюсь, что вы найдете свой собственный ответ на это в конце статьи:)

Этого достаточно, давайте посмотрим на какой -то код!

Мы сосредоточимся на 4 основных областях:

  • Типовая система
  • Управление памятью
  • Обработка ошибок
  • Модульная система

Система типа Golang против JavaScript … Типы?

Давайте начнем с основ, как мы объявляем переменную?

В JavaScript:

// Javascript
const aVariable = 1;

В ход:

// Golang
var aVariable int = 1;

// Or the shorthand, with type inference
aVariable := 1;

Как видите, переменные в GO Следуйте по другой структуре, чем семейство C/C ++:

  • В C/C ++ введите свой Анкет
  • В Голанге var youridentifier Анкет

В ходе тип размещен после Имя переменной. Почему? Ну, Роб Пайк написал сообщение в блоге Объясняя эту разницу и почему этот путь улучшает декларацию.

Мы знаем, что JS не напечатанный язык, однако, мы можем найти 4 основных типа на JS

  • Числа
  • Строки
  • Логические
  • Объекты

В Голанге типы более явные, имеют:

  • Целые числа (int, int8, int16, int32, int64, uint, uint32 …)
  • Floats (Float32, Float64)
  • Массивы и ломтики
  • Карты
  • каналы
  • Логические
  • & c

Как вы можете сделать вывод, сильно напечатанный язык нуждается в гораздо более предопределенных типах. И должен позволить вам создавать свои собственные типы по требованию. Вы можете сделать это с помощью языковой конструкции Тип :

type ServerResponse map[string]interface{}

Посмотрим код! (Вот почему вы здесь, в конце концов)

// Type definition on JS
const x = 1.0;
const y = false;
const z = 'string';
const a = { b: 'string' };

Посмотрим то же самое в ходе!

// We will use the shorthand declaration

x := 1.0 // Go will infer this as float32
y := false // This will be inferred as bool
z := "string" // This is a string value
a := struct {
  b string
}{"string"} // Then, a.b will print "string"

Давайте напишем некоторые ключевые различия:

  • Строки GO должны быть написаны с использованием двойных цитат (“). Одиночные кавычки используются только для значений CHAR (‘C’). В JS использование двойных или одиночных кавычек является вопросом стиля.
  • У Go нет объектов, как JS. Мы можем имитировать силу объектов, создающих структуры.
  • В Go структура может быть инициализирована сразу после его объявления (как вы можете видеть в примере кода). Просто помните: заказ имеет значение:
// This will throw a compile-time error
a := struct {
  b string
  c int
}{1, "string"}

// This will compile just fine
a := struct {
  b string
  c int
}{"string", 1}
  • В Go вы можете создавать переменные без их инициализации, а компилятор Go будет инициализировать их при соответствующих нулевых значениях для вас. Итак, если у вас есть:
var x int
var y bool

fmt.Println(x) // will print 0
fmt.Println(y) // will print false

Для дальнейшего чтения, посмотрите на Эта глава от Перейти за разработчиками JavaScript Анкет

Управление памятью

Оба GO и JavaScript управляют собственной памятью. У обоих есть задача GC, ищущая переменные, чтобы убить каждую секунду. Поговорим о них:

Go GC против JS GC

Перейдите в реализацию параллельной процедуры GC Mark и Sweep, поэтому весь процесс GC не блокирует основной поток. Вы можете найти примеры того, как это улучшает производительность, глядя на это Твит от Ngrok Creator Анкет Вы можете вручную запустить цикл GC, когда вам это нужно.

JS реализует тот же алгоритм для очистки его памяти. Однако из -за ограничений потока JS процесс должен быть заблокирован во время фазы марки, чтобы GC увидел, какие переменные больше не нужны. Вы не можете назвать цикл GC самостоятельно.

Распределение кучи/стека

Оба языка абстрагируют использование и манипуляции кучи/стека. Ни один из языков не позволяет программисту распределять память, где они хотят. Распределение кучи/стека выполняется компилятором (или интерпретатором, на JS).

Обработка ошибок

Оба языка интерпретируют ошибки как обычные значения. Таким образом, они могут быть возвращены или переданы по функциям.

У JS есть Try/Catch/night Constructions как часть своего языка (помните те времена, когда все было обработано window.onerror ?). Это работает для несинзового кода (или когда вы используете ждет )

try {
  throw new Error("This is an error");
  // Code here won't be executed
} catch (e) {
  // Handle e as you want.
  // What about `throw e`? 
} finally {
  // This block will be executed regardless an error ocurred.
}

Если ошибки являются продуктом асинхронных операций, обработка может быть такой (используя обещания в качестве примера)

aPromise
  .then(value => value)
  .catch(err => /* handle err */);

В Голанге обработка ошибок немного более многослойно. Во -первых, давайте поговорим о разнице между ошибками и исключениями в Голанге:

  • Ошибка является результатом операции, которая пошла не так. Например, рассмотрим, что вы создаете функцию для преобразования из долларов в другую валюту. Если пользователь вводит строку вместо двойного, вы бы назвали это Исключительная ситуация ? Итак, вы используете ошибки для таких случаев, как этот:
func ConvertDollarToCurrencyX(input float) (float, error) {
  // Here, if `input` is not a float or can't be converted to it
  // you can handle that error.
} 
  • Исключение, как говорится в его названии, является исключительной ситуацией. Например, ваша база данных сбилась без причины? Ну, это исключительная ситуация! В исключительных случаях, Вы должны паника Анкет

A паника Инструкция означает, что ваша программа не может продолжать работать нормально

err := db.connect("someweirdstringhere")
if err != nil {
  panic("Our database is not working, help!!")
}

Эта инструкция завершит выполнение программы (или goroutine), пока вы восстановить от него. Как ты это делаешь?

func foo() int {
  defer func() {
  if err := recover(); err != nil {
    fmt.Println(err)
  }
  }()
  m := 1
  panic("foo: fail")
  m = 2
  return m
}

Вы заметили новое слово, используемое здесь? Да, отсрочка Анкет DEFER будет отложить выполнение функции до конца функции вызывающего абонента. Итак, в нашем примере отсрочка Функция ED будет называться незадолго до выходя из функции, на которой она определяется (foo ()). Здесь мы делаем проверку здравомыслия, так как восстановить будет иметь значение только тогда, когда функция выходит из -за паника , мы должны убедиться Это, если наша функция не паника D, мы не обрабатываем рутину восстановления.

Подробнее о отсрочка , паника и восстановить на Это отличное сообщение в блоге из собственного блога Голанга.

Просто помните одну вещь: отсрочка Контекст исполнения может быть не то, что вы ожидаете ;).

Модули Go против JS -модулей

Как экспортировать/импортировать модули?

С тех пор Es6 У JS есть встроенная система модулей. JS не был создан с учетом модулей. В первые годы было обычным явлением, чтобы увидеть длинные файлы JS, содержащие весь необходимый код, и это было хорошо, так как JS использовался только для предоставления дополнительных функциональности для веб -сайтов. Позже, с бумом JS как Настоящий язык Потребность в разделенном коде появилась. С этой потребностью появились фреймворки и библиотеки, которые включают использование модуля ( commonjs , requirejs , & c). Но как вы определяете модуль ES6?

export const name = 'square';

export function draw(ctx, length, x, y, color) {
  ctx.fillStyle = color;
  ctx.fillRect(x, y, length, length);

  return {
    length,
    x,
    y,
    color,
  };
}

А теперь Импортировать это , потому что только экспорт – это скучно Анкет

import { name, draw } from './path/to/module.js';

Итак, как это в ходе? Ну, история немного отличается. Go был запланирован с Пакеты Поддержка с самого начала. На Go 1.6 была лучшая поддержка инкапсуляции зависимых пакетов внутри Продавец папка. Тем не менее, была большая проблема с этим: не было никаких версий в библиотеках/пакетах, которые вы использовали, и на самом деле вы можете закончить 10 различными версиями одной и той же библиотеки на одном проекте! (Проблема решается в js by package.json и .lock Файлы, используемые для управления зависимостями).

В ходе только версия 1.11 у нас есть приличное управление зависимостями как часть языка. Эта версия представила Go Modules с go.mod и go.sum Файлы, которые заботятся о зависимостях, управлении версиями и поставщиком для ваших библиотек. Это позволило воспроизводимым сборкам, одной из основных проблем сообщества GO.

Теперь, в чем разница? Ну, в JS вы можете экспортировать любой действительный тип JS. Вы можете экспортировать только неназванную функцию и использовать ее. Это невозможно в ходе. Go export Пакеты , которые являются пространствами имен для экспортируемой функциональности на нем.

package myPackage

var Name string = "square"

func Draw(ctx context.Context, color string, length, x, y int) context.Context {
  ctx.DoNiceThings(color, length, x, y)
  ctx.Draw(x,y,length)
  return ctx
}

И в другом файле …

// `as` allows to rename an imported package. If not, the name of the package will be used as the descriptor
import "myPackage" as package

package.Draw(...)

Это может заставить вас задуматься: Как Go знает, что экспортируется из упаковки, если я не говорю об этом?

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

package test

var name string = "not exported"

Призыв test.name Выбросит ошибку, так как вы не можете получить доступ к собственности частного пакета.

Как установить зависимости?

В JS вы можете использовать хорошо известный Npm Чтобы установить внешние библиотеки, запустив NPM Установить мою зависимость@Последний Анкет

В ходе, однако, управление зависимостями встроено в Go команда, так что запустив Иди, чтобы получить свою библиотеку , вы установите моя библиотека В вашем проекте! Как вы узнаете позже, Go Deps можно размещать на GitHub, Bitbucket, Gitlab …

Это краткое вступление в огромную экосистему GO, как она была разработана, чтобы быть простым, чистым и читаемым. Я надеюсь, что на данный момент вы знаете:

  • Различия между JS и GO в типах, модулях и синтаксисе
  • Как создать переменные Golang
  • Как GO управляет ошибками и исключениями

Итак, начнем!

Оригинал: “https://dev.to/kaleman15/from-javascript-to-go-50ef”