Основы языка программирования Golang. Часть 1.
Пролог.
Собрав небольшой фидбек от завсегдателей , а также от команды форума, было принято решение писать курс на ИБ тематику. И вместо обычного веб сервера, который я планировал изначально реализовать, будем с вами писать горизонтальный сканер портов.
Пролог.
Это когда мы берем один порт и сканим его на всех хостах, а не хост по всем портам
Литература и площадки для самостоятельного изучения.
Литература.
Раннее уже мой коллега писал перечень литературы, которая необходима для изучения языка. (Вот тут)Литература.
Лично мое мнение и лично мой совет. Если вы действительно плотно решаетесь засесть за изучение этого языка, вам необходима одна книга - Алан А. А. Донован, Брайан У. Керниган. Язык программирования Go.
Данная книга не просто книга, а святое святых настоящих гоферов! По сути в ней очень мало воды и очень много крутых кейсов, которые используются в решениях неординарных задач.
Площадки.
- Ссылка скрыта от гостей- виртуальный тур, который даст ту же информацию, что и я с интерактивной площадкой, что очень круто сделано.
- Ссылка скрыта от гостей- если не хотите устанавливать компилятор, то вот вам, пожалуйста, веб версия. Все примеры можно будет запускать там и смотреть на результат
- Ссылка скрыта от гостей- цитадель гоферов
Установка Go.
Пошаговую инстуркцию, как установить Go я не буду расписывать, так как не вижу в этом смысла. Все сидят на разных ОС, поэтому я оставлю вот эту ссылочку здесь (
Ссылка скрыта от гостей
). Если у кого то будут проблемы, отписывайтесь в теме и я помогу.
Ну мало ли... Всякое случается
Единственное, на чем хотелось бы заострить внимание - GOROOT, GOPATH.
- GOROOT - это переменная, в которой прописан путь до всех бинарей go
- GOPATH - это переменная, в которой будет прописан путь до всех библиотек и до всех бинарей, с которыми вы будете работать в дальнейшем. По сути, это ваш workspace.
Hello Codeby!!!
Ну и конечно же, после установки нам нужно выбрать IDE, где мы будем реализовывать наши ИМБО ПРОЕКТЫ.
Я потыкал несколько продуктов, такие как:
-
Ссылка скрыта от гостей- тяжелая, как и все продутку JetBrains, платная, и все такое. В целом - классная, но тяжелая.
- visualfc/liteide - опенсорная IDE. Прикольная, но не мое.
-
Ссылка скрыта от гостей- всеми известный редактор. Ставится плагин Go и жизнь играет новыми красками!
А теперь приступим к практике...
Божечки кошечки! Как же мы этого долго ждали!
Bash:
mkdir HelloWorld && cd HelloWorld & touch main.go
set -x -g GOPATH /path/to/HelloWorld
Открываем наш файлик в редакторе, и пишем:
C:
package main
import "fmt"
func main() {
fmt.Println("Hello Codeby!")
}
Переходим в консоль, и вводим:
go run main.go
И... Чтоже мы видим...? УРА! Первое приложение нам написало в консоль!
Ну, а теперь по порядку.
Пакеты.
package [name]
Любая программа, созданная на Go, состоит из пакетов. По сути, это некая область видимости для крупных проектов.
Старт программы происходит из main пакета.
Так же мы взаимодействуем с другими пакетами через import.
Например, чтобы вывести на экран данные в первом примере, мы объявляем наш файл - как main пакет, имортируем "fmt", это базовая библиотека для работы с вводом и выводом данных.
Функции.
Как говорится, функиця - она и в Африке функция. Функция может принимать, а может не принимать парметры (УДИВИТЕЛЬНО, ДА?!)Конструкция -
func [function_name]([args])[returntype]{}
В данном случае, что интересно. Если наша функция что то будет возвращать, то мы должны обязательно указать какой тип данных возвращаем.
Например:
C-подобный:
package main
import (
"fmt"
)
func output(str string) {
fmt.Println(str)
}
func sum(a, b int) int {
return a + b
}
func main() {
output("Hello Codeby!")
fmt.Println(sum(1300, 37))
}
В нашем примере, можно увидеть, что output принимает на вход только строку, а потом ее выводит на экран, а ф-ия sum принимает на вход два параметра a,b типа int, а возвращает их сумму, тоже в int.
Собственно поэтому мы и вызываем в fmt.Println(sum(1300,37)), чтобы на экран сразу вывести наше значение.
Типы данных.
Так, как go у нас типизированный язык, то мы имеем следующий набор типов данных:- bool
- int и его рядность int8 int16 int32 int64
- uint uint8 uint16 uint32 uint64
- float32 float64
- byte
- string
Рассмтри пример с объявленим переменных:
C-подобный:
var i int
i = 1
j := 2
Два варианта присвоения данных для переменных.
Первый вариант имеет конструкцию: var {variable_name} {type}
Второй вариант короче: {variable_name} := {value}
По первому варианту вроде бы понятно все, мы говорим явно какой тип будет у переменной и в дальнейшем будем присваивать ей данные этого типа.
Второй вариант чуть хитрее. Мы объявляем переменную сразу со значением и в дальнейшем, наша переменная будет типа данных, которые ей присвоили. Короткая, приятная запись
Массивы.
Теперь коротко пройдемся по массивам, чтобы в дальнейшем рассмотреть циклы.
Есть два понятия:
- Slice (слайс/срез и тд)
- Array (массив)
Array -имеет строгий размер данных.
Slice -имее динамический размер. Это означает, что мы можем не указывать размер, а пихать в него столько элементов, сколько хотим.
C-подобный:
array := [5]int{1, 2, 3, 4, 5}
slice := []int{1}
Циклы.
Циклы в Go не отличаются от циклов других ЯП.
Классический цикл:
for [index]; [statement]; [increment]{[body]}
Например, выведем цифры от 1 до 10
C-подобный:
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++{
fmt.Println(i)
}
}
for{[body]}
Аналог while True
Из интересного, проход по массиву:
for idx, value := range array{[body]}
Через range мы можем получить, как индекс переменной в массиве, так и само значение.
Например:
C-подобный:
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5}
for idx, val := range arr {
fmt.Printf("Index: %d Value: %d\n", idx, val)
}
}
Например, если мы хотим пройтись по всем элементам массива, но не хотим знать про их индекс,то мы заменяем idx на _
C-подобный:
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5}
for _, val := range arr {
fmt.Printf("Value: %d\n", val)
}
}
Базовые условия.
Итак, по условиям. Тоже ничего нового нет.
Классический
if [statement]{}else{}
Например:
C-подобный:
package main
import "fmt"
func main() {
i := 3
j := 2
if i < j {
fmt.Println("i < j")
} else {
fmt.Println("i > j")
}
}
Эпилог.
В данной статье я дал максимально базовые вещи, которые в дальнйшем не будем вспоминать. В следующей части я буду рассказывать про более серьезные вещи, такие как методы, каналы, структуры.
P.S. ну в этот раз то негатива я получу меньше, надеюсь ?
P.S.S. Извините за ошибки, если будут... )
Последнее редактирование: