Статья Основы языка программирования Golang, Часть 1

Основы языка программирования Golang. Часть 1.

gophers_part1.png


Пролог.
Собрав небольшой фидбек от завсегдателей , а также от команды форума, было принято решение писать курс на ИБ тематику. И вместо обычного веб сервера, который я планировал изначально реализовать, будем с вами писать горизонтальный сканер портов.
Это когда мы берем один порт и сканим его на всех хостах, а не хост по всем портам
Я уже начал его писать и пытаюсь его реализовать таким образом, чтобы задействовать и показать все плюшки Go.
spoiler.png
Ну, собственно, погнали по основам. 😈

Литература и площадки для самостоятельного изучения.

Литература.
Раннее уже мой коллега писал перечень литературы, которая необходима для изучения языка. (Вот тут)
Лично мое мнение и лично мой совет. Если вы действительно плотно решаетесь засесть за изучение этого языка, вам необходима одна книга - Алан А. А. Донован, Брайан У. Керниган. Язык программирования Go.
Данная книга не просто книга, а святое святых настоящих гоферов! По сути в ней очень мало воды и очень много крутых кейсов, которые используются в решениях неординарных задач.

Площадки.

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

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

Единственное, на чем хотелось бы заострить внимание - GOROOT, GOPATH.

  • GOROOT - это переменная, в которой прописан путь до всех бинарей go​
  • GOPATH - это переменная, в которой будет прописан путь до всех библиотек и до всех бинарей, с которыми вы будете работать в дальнейшем. По сути, это ваш workspace.​
Совет от меня - создавать GOPATH для каждого проекта. Это удобно для архитектуры вашего приложения.


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

И... Чтоже мы видим...? УРА! Первое приложение нам написало в консоль!
hwout.png


Ну, а теперь по порядку.

Пакеты.
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. Извините за ошибки, если будут... )
 
Последнее редактирование:

SearcherSlava

Red Team
10.06.2017
943
1 261
BIT
206
Это только начало. И по сути рассказаны базовые вещи. Просто красиво описано)
Чуть похже кейсы буду раскрывать классные

Здрав будь, коллега! К списку литературы:
 

G0p43R

Green Team
27.02.2018
125
167
BIT
0
Здрав будь, коллега! К списку литературы:
Я смотрел этот список. Очень много левого шлака.

Опять же, это ИМХО, но лучше Керниган никого нет. И просто люди потеряюся во всей этой воде.
 

SearcherSlava

Red Team
10.06.2017
943
1 261
BIT
206
Я смотрел этот список. Очень много левого шлака.

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!