Язык программирования go: мнения и перспектива

Содержание:

Тип interface в Golang

Большинство типов фокусируется на значениях, что они хранят: integer для целых чисел, string для текста и так далее. Тип отличается. Интерфейсы сконцентрированы на том, что тип делает, а не на сохраняемых им значениях.

Методы выражают поведение предоставленного типа, поэтому интерфейсы объявляются с набором методов, которых тип должен удовлетворить. В следующем примере объявляется переменная с типом :

Листинг 1

Go

var t interface {
talk() string
}

1
2
3

vartinterface{

talk()string

}

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

В следующем примере объявляются два типа, что соответствуют требованиям:

Листинг 2

Go

type martian struct{}

func (m martian) talk() string {
return «nack nack»
}

type laser int

func (l laser) talk() string {
return strings.Repeat(«pew «, int(l))
}

1
2
3
4
5
6
7
8
9
10
11

typemartianstruct{}

func(mmartian)talk()string{

return»nack nack»

}
 

typelaser int

func(llaser)talk()string{

returnstrings.Repeat(«pew «,int(l))

}

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

Листинг 3

Go

var t interface {
talk() string
}

t = martian{}
fmt.Println(t.talk()) // Выводит: nack nack

t = laser(3)
fmt.Println(t.talk()) // Выводит: pew pew pew

1
2
3
4
5
6
7
8
9

vartinterface{

talk()string

}
 

t=martian{}

fmt.Println(t.talk())// Выводит: nack nack

t=laser(3)

fmt.Println(t.talk())// Выводит: pew pew pew

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

Обычно интерфейсы объявляются как именованные типы, что можно повторно использовать. Существуют правило в отношении именования типов интерфейса с суффиком : к примеру, talker, то есть тот, кто говорит (talk+er), как показано в следующем примере:

Листинг 4

Go

type talker interface {
talk() string
}

1
2
3

typetalkerinterface{

talk()string

}

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

Листинг 5

Go

func shout(t talker) {
louder := strings.ToUpper(t.talk())
fmt.Println(louder)
}

1
2
3
4

funcshout(ttalker){

louder=strings.ToUpper(t.talk())

fmt.Println(louder)

}

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

Листинг 6

Go

shout(martian{}) // Выводит: NACK NACK
shout(laser(2)) // Выводит: PEW PEW

1
2

shout(martian{})// Выводит: NACK NACK

shout(laser(2))// Выводит: PEW PEW

Аргумент, который вы передаете функции , должен удовлетворять требования интерфейса . К примеру, тип не удовлетворяет интерфейс , поэтому компилятор Go откажется компилировать программу:

Go

type crater struct{}
shout(crater{}) // crater не имплементирует talker (отсутствует метод talk)

1
2

typecraterstruct{}

shout(crater{})// crater не имплементирует talker (отсутствует метод talk)

Интерфейсы показывают свою гибкость, когда вам нужно изменить или расширить код. При объявлении нового типа с методом функция будет с ним работать. Любой код, что зависит только от интерфейса, может оставаться прежним, даже если имплементации добавляются или меняются.

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

Листинг 7

Go

type starship struct {
laser
}

s := starship{laser(3)}

fmt.Println(s.talk()) // Выводит: pew pew pew
shout(s) // Выводит: PEW PEW PEW

1
2
3
4
5
6
7
8

typestarshipstruct{

laser

}
 

s=starship{laser(3)}

fmt.Println(s.talk())// Выводит: pew pew pew

shout(s)// Выводит: PEW PEW PEW

Когда говорит космический корабль, за него говорит лазер. Внедрение предоставляет структуре метод , что встраивается в . Теперь космический корабль также удовлетворяет требования интерфейса , позволяя ему использоваться вместе с .

Вопросы для проверки: 

  1. Измените метод лазера из Листинга 4 для предотвращения стрельбы из марсианского оружия, чтобы можно было спасти человечество во время вторжения.
  2. Расширьте Листинг 4, объявив новый тип c методом , что возвращает «whir whir». Используйте функцию с вашим новым типом.

Bitmap-индексы в Go: поиск на дикой скорости

Вступительное слово

Я выступил с этим докладом на английском языке на конференции GopherCon Russia 2019 в Москве и на русском — на митапе в Нижнем Новгороде. Речь в нём идёт о bitmap-индексе — менее распространённом, чем B-tree, но не менее интересном. Делюсь записью выступления на конференции на английском и текстовой расшифровкой на русском.
Мы рассмотрим, как устроен bitmap-индекс, когда он лучше, когда — хуже других индексов и в каких случаях он значительно быстрее них; увидим, в каких популярных СУБД уже есть bitmap-индексы; попробуем написать свой на Go. А «на десерт» мы воспользуемся готовыми библиотеками, чтобы создать свою супербыструю специализированную базу данных.
Очень надеюсь, что мои труды окажутся для вас полезными и интересными. Поехали!

Терминал

Большая часть взаимодействия с компьютером сейчас осуществляется с помощью
графического пользовательского интерфейса (GUI). Мы используем клавиатуру, мышь,
сенсорные экраны для взаимодействия с визуальными кнопками и другими
отображаемыми элементами.

Но так было не всегда. Перед GUI в ходу был терминал — простой текстовый
интерфейс к компьютеру, где вместо работы с кнопками на экране мы вводили
команды и получали ответы.

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

Windows

Чтобы вызвать терминал (командную строку) в Windows, нужно нажать комбинацию
клавиш Win+R (удерживая клавишу с логотипом Windows нажмите R), ввести в
появившееся окно и нажать Enter. Вы должны увидеть черное окно,
похожее на то, что ниже:

По умолчанию командная строка запускается из вашей домашней директории (в моём
случае это ). Вы отдаёте команды компьютеру, набирая их в этом
окне и нажимая Enter. Попробуйте ввести команду , которая выводит
содержимое текущего каталога на экран. Вы должны увидеть что-то вроде этого:

Вы можете изменить текущий каталог с помощью команды . Например, там
наверняка есть директория под названием . Вы можете посмотреть её
содержимое, набрав , а затем . Чтобы вернуться в домашнюю
директорию, используйте специальное имя (две точки): . Одна точка
обозначает текущий каталог (известен как рабочая директория), так что
ничего не сделает. Конечно, существует намного больше команд, которые можно
использовать, но этих будет вполне достаточно для начала.

OSX

В OSX терминал можно найти, перейдя в Finder → Applications → Utilities →
Terminal. Вы увидите такое окно:

По умолчанию, командная строка запускается из вашей домашней директории (в моём
случае это ). Вы отдаёте команды компьютеру, набирая их в этом
окне и нажимая Enter. Попробуйте ввести команду , которая выводит содержимое
текущего каталога на экран. Вы должны увидеть что-то вроде этого:

Вы можете изменить текущий каталог с помощью команды . Например, там
наверняка есть директория под названием . Вы можете посмотреть её
содержимое набрав , а затем . Чтобы вернуться в домашнюю
директорию, используйте специальное имя (две точки): . Одна точка
обозначает текущий каталог (известен как рабочая директория), так что
ничего не сделает. Конечно, существует намного больше команд, которые можно
использовать, но этих будет вполне достаточно для начала.

Ozon go school: Как не нужно проводить отбор

Go School

Как вы знаете, в середине мая Ozon объявил о запуске школы программирования на языке Go. Обещали следующее:

  • бесплатное обучение
  • возможность получить знания по реальной разработке на Go от Ozon
  • возможность получить работу в Ozon

Чтобы попасть в школу, нужно было:

  • иметь опыт промышленного программирования
  • пройти тестовые задания по программированию на платформе Яндекс.Контест
  • пройти skype-собеседования

Уже в ходе отбора выяснилось, что онлайн школа будет только до момента, пока эпидемиологическая ситуация не наладится. Впрочем, иногородним жителям все-таки была обещана возможность проходить обучение по интернету.
Тогда же было озвучено число студентов, которое готовы принять в Школу — около 40 человек.
Так понемногу условия поступления прирастали новыми пунктами, среди добавленных также значилось:

  • желательно проживать в Москве
  • быть гражданином РФ
  • возраст старше 18 лет

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

Объявление новых типов Golang

В Go можно объявить множество типов. Иногда данные типы не вполне верно описывают значения, к которым они относятся.

Температура не является , хотя это может быть ее базовым типом. Температура измеряется в Цельсиях, Фаренгейтах или Кельвинах. Объявление новых типов не только делает код чище, но также помогает предотвратить ошибки.

Ключевое слово объявляет новый тип с названием и базовым типом, что показано в следующем примере:

Листинг 1

Go

type celsius float64 // Базовый тип float64

var temperature celsius = 20

fmt.Println(temperature) // Выводит: 20

1
2
3
4
5

typecelsius float64// Базовый тип float64

vartemperature celsius=20

fmt.Println(temperature)// Выводит: 20

Числовой литерал 20, как и все числовые литералы, является нетипизированной константой. Ее можно присвоить переменной типа int, или любому другому числовому типу. Тип является новым числовым типом с таким же поведением, что и , так что присваивание в предыдущем листинге по-прежнему работает.

Вы также можете добавить значения температуре и в общем использовать ее как тип , как показано далее:

Листинг 2

Go

type celsius float64

const degrees = 20
var temperature celsius = degrees

temperature += 10

1
2
3
4
5
6

typecelsius float64

constdegrees=20

vartemperature celsius=degrees

temperature+=10

Тип является уникальным типом, а не просто другим названием типа . Подробнее о возможности использования других названий типов в статье о работе со строкам в Go. Однако здесь при попытке использовать выйдет ошибка:

Go

var warmUp float64 = 10
temperature += warmUp // Ошибка в операции: несовпадение типов

1
2

varwarmUp float64=10

temperature+=warmUp// Ошибка в операции: несовпадение типов

При добавлении переменной ее нужно конвертировать в тип . Такая версия действует:

Go

var warmUp float64 = 10
temperature += celsius(warmUp)

1
2

varwarmUp float64=10

temperature+=celsius(warmUp)

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

Листинг 3

Go

type celsius float64
type fahrenheit float64

var c celsius = 20
var f fahrenheit = 20

// Ошибка в операции: несовпадение типов celsius и fahrenheit
if c == f {
}

c += f

1
2
3
4
5
6
7
8
9
10
11

typecelsius float64

typefahrenheit float64

varccelsius=20

varffahrenheit=20

 
// Ошибка в операции: несовпадение типов celsius и fahrenheit

ifc==f{

}
 

c+=f

Вопрос для проверки:

В чем преимущества объявления новых типов, таких как и ?

И мышонок, и лягушка. Универсальный Компилятор

В серии про надежное программирование , остался незаслуженно забытым Swift. Я, честно говоря, просто не считал его кроссплатформенным, а работающим исключительно для macOS/iOS. Тут случайно выяснилось, что Swift также поддерживается такой средой разработки, как RemObjects Elements.
Оказалось, у неё Универсальный Компилятор. Умеет компилировать программы на C#, Go, Java, Oxygene Object Pascal, Swift для: Android, Cocoa (MacOS, iOS, tvOS), JVM, Linux (x64, armv6, aarch64), .NET/.NET Core/Mono, Native Windows(x86/x64), WebAssembly.
Причем делает это практически в любых комбинациях язык → целевая система! Например, можно написать программу на Java, которая будет использовать WPF для целевой платформы .NET, и это все есть в примерах, идущих в поставке.
Итак, представляю мини-заметку про RemObjects Elements, а заодно про надежность двух поддерживаемых в ней языков — Swift и Oxygene.

Рисунок с сайта radionetplus

Материалы с казанского Go-митапа: разбор XML, gopls, drone.io и работа с миграциями

Привет! Мы вернулись из Казани, где проводили свой первый региональный митап для Go-разработчиков вместе с сообществом GolangKazan. Спасибо всем, кто пришёл послушать доклады и познакомиться — было здорово.

На митапе выступали спикеры из компаний «Дремучий лес», Авито, Ozon.ru и Marketplace Technologies. Они рассказывали про разбор и хранение большого XML-файла на маленькой VDS, language server gopls, CI/CD платформу drone.io и инструменты для миграции баз данных.

Под катом вас ждут видеозаписи всех докладов с таймкодами для удобной навигации, ссылки на репозитории спикеров на Гитхабе и фотоотчёт с митапа. А мы пойдём паковать рюкзаки ко второму казанскому митапу по фронтенду, который пройдёт уже 15 февраля.

Скобки в Golang

Go достаточно придирчив в плане места размещения фигурных скобок . В предыдущем примере открывающая скобка находится на той же строке, что и ключевое слово . Закрывающая скобка расположена на отдельной строке. Это единственный правильный скобочный стиль, также известный как one true brace style или .

Чтобы понять, как Go стал таким строгим языком, нужно вернуться к времени его создания. Тогда структура кода был переполнена точками с запятой. Они были везде. Каждый оператор заканчивался точкой с запятой. К примеру:

Go

fmt.Println(«Hello, fire hydrant»);

1 fmt.Println(«Hello, fire hydrant»);

В декабре 2009 группе разработчиков Go удалось избавиться от точек с запятой из языка. Хотя, не совсем. По сути дела, компилятор Go стал автоматически добавлять точки с запятой. Все отлично. Однако теперь стало важным придерживаться единственного правильного скобочного стиля.

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

Go

func main() // отсутствует тело функции
{ // ошибка синтаксиса: лишняя точка с запятой или
} // новая строка перед {

1
2
3

funcmain()// отсутствует тело функции

{// ошибка синтаксиса: лишняя точка с запятой или

}// новая строка перед {

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

Заключение

  • На Go Playground можно использовать Go без предварительной установки;
  • Каждая программа Go состоит из функций, что находятся в пакетах;
  • Для вывода текста на экран используется пакет , предоставленный стандартной библиотекой;
  • Пунктуация также важна в языках программирования, как и в естественных языках;
  • В уроке были рассмотрены 3 из 25 ключевых слов Go: , и .

При желании проверить собственные силы, можете выполнить следующее задание:

  • Измените результат вывода, отредактировав текст между кавычками. Пускай, это будет ваше персональное приветствие.
  • Отобразите две строки текста, написав вторую строку кода внутри тела функции . К примеру:

    Go

    fmt.Println(«Hello, world»)
    fmt.Println(«Hello, Ѝउ «)

    1
    2

    fmt.Println(«Hello, world»)

    fmt.Println(«Hello, Ѝउ «)

  • Go поддерживает символы любого языка. Выведите текст на китайском, японском, русском или румынском. При необходимости воспользуйтесь переводчиком Google Translate, после чего скопируйте и вставьте полученный текст в Go Playground.
  • Модифицируйте код в Go Playground и нажмите на кнопку Run, чтобы увидеть результат. Если у вас возникли сложности, обновите браузер и посмотрите на оригинальный код.
  • Используйте кнопку Share для получения ссылки на свою программу. Если хотите, можете поделиться результатом с друзьями или сохранить для себя.

Возможный вариант выполнения задания:

Go

package main

import (
«fmt»
)

func main() {
fmt.Println(«Hello, Nathan»)
fmt.Println(«こんにちは Здравствуйте Hola»)
}

1
2
3
4
5
6
7
8
9
10

packagemain

import(

«fmt»

)
 

funcmain(){

fmt.Println(«Hello, Nathan»)

fmt.Println(«こんにちは Здравствуйте Hola»)

}

Я не знал, как работают процессоры, поэтому написал программный симулятор

Перевод

Несколько месяцев назад меня вдруг поразила мысль, что я понятия не имею о принципах работы компьютерного железа. Я до сих пор не знаю, как работают современные компьютеры.
Я прочитал книгу «Но откуда он знает?» Кларка Скотта с детальным описанием простого 8-битного компьютера: начиная с логических вентилей, ОЗУ, транзисторов процессора, заканчивая арифметико-логическим устройством и операциями ввода-вывода. И мне захотелось реализовать всё это в коде.
Хотя я не настолько интересуюсь физикой микросхем, но книга просто скользит по волнам и красиво объясняет электросхемы и как биты перемещаются по системе — от читателя не требуется знание электротехники. Но мне недостаточно текстового описания. Я должен видеть вещи в действии и учиться на своих неизбежных ошибках. Так я начал реализацию схем в коде. Путь оказался тернист, но поучителен.

Оптимизация работы с PostgreSQL в Go: от 50 до 5000 RPS

Привет, меня зовут Иван, и я делаю Авито Доставку. Когда пользователь покупает товар с доставкой, мы показываем ему список отделений служб доставки с ценами. Цена доставки может меняться от отделения к отделению. Мы смотрим на область карты, где покупатель ищет товар и информацию по объявлению, например, координаты продавца, вес и размеры товара. И на выходе показываем человеку список отделений с адресами и ценой доставки в каждое из них.

В ходе разработки калькулятора цены доставки возникла такая задача: есть структура базы данных PostgreSQL и запрос к ней от сервиса на Go. Нужно заставить всё это работать достаточно быстро. В итоге нам удалось поднять пропускную способность сервиса с 50 до 5000 RPS и выявить пару нюансов при общении сервиса с базой. Об этом и пойдёт рассказ.

Унифицируй это: как Lamoda делает единообразными свои Go сервисы

Мы широко используем микросервисную архитектуру, хоть и не считаем ее панацеей, и чуть больше 2 лет назад начали переходить на язык Go. Он сравнительно прост и, на мой взгляд, очень хорошо подходит для создания простых, небольших и быстрых микросервисов. Эта простота имеет и обратную сторону: из-за неё возникает множество способов решить одну и ту же задачу.

Казалось бы, насколько сильно может отличаться один микросервис, который ходит в базу данных, от другого микросервиса, который ходит в соседнюю базу данных? Например, одна команда использует Go 1.9, glide, стандартный database/sql и одну структуру проекта, а в это же время другая команда использует Go 1.13, modules, sqlx и, конечно же, другую структуру проекта.

Когда один микросервис в компании отличается от другого, а он, в свою очередь, отличается от третьего — это замедляет разработку. А медленная разработка — это убытки повод для оптимизации.

Меня зовут Алексей Партилов, я техлид команды web-разработки в компании Lamoda. В этой статье я расскажу, как мы справляемся с разношерстностью около 40 наших микросервисов на Go. Статья будет полезна разработчикам, которые только вливаются в Go и не знают, с чего начать более сложный проект, чем “helloworld”.

Создание Web-сервера

Язык go появился в эпоху Интернет, а в это время любой претендующий на место под солнцем язык программирования должен предоставлять богатые возможности для создания распределенных приложений. Эти средства представлены в go пакетами http, net и websocket, также имеются и пакеты для работы с html и xml. Наличие подобной функциональности говорит о серьезных намерениях языка закрепиться в качестве платформы для разработки корпоративных приложений. Однако отсутствие полноценной поддержки платформы MS Windows может помешать этому.

Web-версия самой известной программы на языке go будет выглядеть следующим образом.

Листинг 1. Простейшее Web-приложение
package main;

import (
"http"
"fmt"
)

func requestHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, world")
}

func main(){
	http.HandleFunc("/", requestHandler)
	http.ListenAndServe(":8080", nil)
}

Перед подробным анализом исходного кода приложения необходимо описать, как собрать и запустить приложение, а также принцип его работы. Для компиляции приведенный выше код необходимо сохранить в файле hello.go и выполнить две команды:

  8g hello.go
  8l hello.8.

После этого приложение надо запустить и проверить его работоспособность. Для этого потребуется открыть Web-браузер и ввести в его адресной строке URL: localhost:8080. Если все действия были выполнены успешно, то в окне браузера отобразится строка Hello, world. Если же строка не отобразилась, то следует проверить наличие брандмауэра и, если таковой имеется, то разрешить в нем активность на порту 8080. Также причиной ошибки может быть другое приложение, уже запущенное на этом порту.

После успешного запуска примитивного Web-сервера можно переходить к анализу его исходного кода. Функция main является точкой входа в программу, и в ней происходят вызовы двух функций из пакета http. Первый вызов устанавливает обработчик для подключившихся клиентов (функция requestHandler), а вторым вызовом на указанном порту запускается сервер, так что все запросы, поступающие на порт 8080, будут обрабатываться функцией requestHandler. Для этой функции также будет доступен контекст соответствующего запроса в виде объектов http.Request и http.ResponseWriter.

О репозиториях замолвите слово

В последнее время на хабре, и не только, можно наблюдать интерес GO сообщества к луковой/чистой архитектуре, энтерпрайз паттернам и прочему DDD. Читая статьи на данную тему и разбирая примеры кода, постоянно замечаю один момент — когда дело доходит до хранения сущностей предметной области — начинается изобретение своих велосипедов, которые зачастую еле едут. Код вроде бы состоит из набора паттернов: сущности, репозитории, value object’ы и так далее, но кажется, что они для того там “чтобы были”, а не для решения поставленных задач.
В данной статье я бы хотел не только показать, что, по моему мнению, не так с типичными DDD-примерами на GO, но также продемонстрировать собственную ORM для реализации персистентности доменных сущностей.

Профессия «Backend-разработчик на Go» от SkillFactory

Длительность 1 год
Уровень С нуля
Для кого подходит С любым уровнем подготовки
Формат Видеолекции + практика + фидбек от ментора
Итоги Сертификат + проекты в портфолио
Цена
  • полная — 11 250 ₽/мес.
  • со скидкой — 6 750 ₽/мес.
  • рассрочка
Ссылка на курс Полная  информация о курсе

Преподаватели

Илья Ибрагимов — Backend Golang Developer в Simplinic.

Владимир Высокий — Team Lead Developer в Rambler.

И ещё 1 преподаватель. Подробнее о них смотрите на сайте курса.

Чему вы научитесь

  • программировать на Golang, проверять и исправлять свой код,
  • разработать микросервисы и высоконагруженные приложения,
  • разворачивать приложения в продакшене,
  • настраивать непрерывную интеграцию и развёртывание,
  • использовать devops-практики в процесс разработки,
  • быть частью команды разработки.

Тизер школы

Мнение редакции

Комплексное обучения для новичков в разработке высоконагруженных приложений. Вы научитесь программировать на Go и создавать масштабируемые серверные приложения, что позволит вам поучаствовать в крупных IT-проектах. Вы получите знания по архитектуре сетей и баз данных, CI/CD-процессу, а также прокачаете свои скиллы в общении с командой разработки. Практические навыки вы будете отрабатывать на специальных тренажёрах, создавая себе крутое портфолио для будущих работодателей. Проблем с поиском работы точно не будет.

Получить скидку →

Цель

Разработчики в Google столкнулись со следующими проблемами:

  • Вычислительный масштаб чрезвычайно вырос.
  • Компьютеры стали работать быстрее, но скорость разработки не ускорилась.
  • Контроль зависимостей занимает большую часть в разработки ПО на сегодняшний день, но «заголовочные файлы» языков в стиле C мешают анализу зависимостей, а также быстрой компиляции.
  • Существует растущая тенденция против громоздких систем таких как Java и C++ таким образом толкая людей использовать динамически типизированные языки такие как Python и JavaScript.
  • Некоторые фондументальные концепты такие как сборщик мусора и параллельные вычисления не особо поддерживаются в популярных системных языках программирования.
  • Появление многоядерных компьютеров породило беспокойство и путаницу.

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

  • Можно компилировать большие программы написанные на Go за считанные секунды на одном компьютере.
  • Go позволяет легко проводить анализ зависимостей и позволяет избежать многие проблемы подключения файлов (директива include) и библиотек в стиле C.
  • Система типов в Go не имеет иерархии тем самым не приходится тратить времени на выявление связей между типами. Также, несмотря на то, что Go имеет статическую типизацию язык пытается сделать типы более простыми в отличии от рядового объектно ориентированного языка программирования.
  • В основании Go заложен сборщик мусора и выполнении программы в конкурентном режиме с поддержкой коммуникации в виде каналов.
  • Из-за своих особенностей, заложенных во время разработки языка, Go нацелен на большие системы под нагрузкой.

Как мы оптимизировали наш DNS-сервер с помощью инструментов GO

Перевод

В преддверии старта нового потока по курсу «Разработчик Golang» подготовили перевод интересного материала.
Наш авторитативный DNS-сервер используют десятки тысяч веб-сайтов. Мы ежедневно отвечаем на миллионы запросов

В наши дни DNS-атаки становятся все более и более распространенными, DNS является важной частью нашей системы, и мы должны убедиться, что мы можем хорошо работать под высокой нагрузкой.dnsflood — это небольшой инструмент, способный генерировать огромное количество udp запросов

Мониторинг систем показал, что использование памяти нашим сервисом росло так быстро, что нам пришлось остановить его, иначе мы столкнулись бы с OOM ошибками. Это было похоже на проблему утечки памяти; существуют различные причины «похожих на» и «реальных» утечек памяти в go:

Ускоряем кеш проекта в NoVerify (линтер для PHP) в 10 раз

Одним вечером, обсуждая с Искандером @quasilyte сложности в разработке линтера для PHP на Go, Искандер упомянул, что тесты как-то долго идут при локальном прогоне (около минуты, и, как мне кажется, для Go это довольно долго). Стали копать, и быстро выяснилось, что в основном «тормозят» тесты, которые запускают NoVerify (название линтера) в режиме со включенным race-детектором. На каждый запуск индексируется репозиторий phpstorm-stubs, в котором содержатся все определения встроенных функций/классов/констант, которые есть в PHP, и индексация этого репозитория занимает около 4 секунд на 4-ядерной машине (замечу, что без race detector всё существенно быстрее). Поскольку таких прогонов делается несколько, по одному на каждый тестируемый open-source проект, суммарное время исполнения всех тестов может занимать минуты. NoVerify позиционирует себя как очень быстрый линтер для PHP, поэтому, конечно же, такая производительность несколько печалит и нужно было найти какое-то решение.

Как читать программу на Go

Теперь давайте рассмотрим программу более детально. Программы на Go читаются
сверху вниз, слева направо (как книга). Первая строка гласит:

Это называется «определением пакета». Любая Go программа должна начинаться с определения
имени пакета. Пакеты — это подход Go к организации и повторному использованию
кода. Есть два типа программ на Go: исполняемые файлы и разделяемые библиотеки.
Исполняемые файлы являются видом программ, которые можно запустить прямо из
терминала (в Windows их имя заканчивается на ). Библиотеки являются
коллекциями кода, который можно использовать из других программ. Детальнее мы
будем рассматривать библиотеки чуть позже, а пока просто не забудьте включать эту
строку в программы, которые вы пишете.

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

Дальше следует это:

Ключевое слово позволяет подключить сторонние пакеты для использования
их функциональности в нашей программе. Пакет (сокращение от format) реализует
форматирование для входных и выходных данных. Учитывая то, что мы только что
узнали о пакетах, как вы думаете, что будет содержаться в верхней части файлов
пакета ?

Обратите внимание, что взят в двойные кавычки. Использование двойных
кавычек называется «строковым литералом», который в свою очередь является видом
«выражения»

Строки в Go представляют собой набор символов (букв, чисел, …)
определенной длины. Строки мы рассмотрим детально в следующей главе, а сейчас
главное иметь в виду, что за открывающим символом в конечном итоге должен
последовать и закрывающий. Всё, что находится между ними, будет являться строкой
(символ сам по себе не является частью строки).

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

Далее можно увидеть объявление функции:

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

Заключительной частью нашей программы является эта строка:

Этот оператор содержит три части: доступ к функции пакета под
названием (Print line), затем создание новой строки, содержащей
, и вызов функции с этой строкой в качестве первого и
единственного аргумента.

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

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

Среди прочей информации вы должны увидеть это:

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

Сейчас документация говорит нам, что вызов пошлет передаваемые ей
данные на стандартный вывод — терминал, вы сейчас работаете в нём. Эта функция
является причиной, по которой отображается на экране.

В следующей главе вы поймете, каким образом Go хранит и представляет вещи вроде
с помощью типов.

Какой язык — D, Go или Rust имеет лучшие перспективы заменить C и почему?

  • Перевод

Несмотря на мой статус и очевидную предвзятость как одного из создателей D, я постараюсь отвечать откровенно; Я следовал путям Go и Rust, и я абсолютно точно знаю, где стирают грязное белье в D. Я поощряю людей на аналогичных позициях в сообществах Rust и Go чтобы и они делились своим мнением. Так вот.
Для начала, где то в вопросе должен фигурировать и C++. Должен ли он быть заменен вместе с С, или же он один из кандидатов на замещение С, но в любом случае С++ это ключевой элемент уравнения. Это ближайший язык к С и очевидный шаг вперед. Учитывая возраст С++, я в дальнейшем полагаю в этом вопросе что С++ вместе с С является целью для замены.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector