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

Прежде всего, давайте сделаем небольшую теорию о том, что такое go и почему go, ведь вам нужно знать, почему вы решили работать с go, а не с другим языком программирования, таким как python, java и т. д.

Прежде чем мы начнем

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

Компилируемый и интерпретируемый язык

Скомпилировано = Код -> машинный код (двоичные 1 и 0) -> выполнить. Например: Go, C/C++

Interpreted = Code -> Interpreter -> Execute = Сравнительно медленнее, чем скомпилированные языки программирования. Например: PHP, Python, Java. С развитием JIT этот разрыв сокращается

Статически и динамически типизированный язык

Статически типизированный = проверка типов во время компиляции, например: Go

Динамически типизированный = проверка типов во время выполнения, например: Python

Сильно и слабо типизированный язык

Строгая типизация = преобразование типов между несвязанными типами позволяет, например: Python, Go

Слабо типизированный = неявное преобразование типов между несвязанными типами, например: Javascript

Что такое Го?

Go — это язык программирования со статической типизацией, созданный в Google примерно в 2007–2009 годах. Синтаксис Go немного вдохновлен C с гораздо большим количеством функций, таких как сборка мусора, параллелизм и т. д. Go — опионированный язык программирования, по умолчанию применяющий стандартные лучшие практики, это оставляет меньше места для ошибок или ошибочного кода.

Го ООП?

Go выглядит как ООП, но это не так.

Вещи, которых нет в Go

  1. Нет класса / подкласса
  2. Нет конструктора и деконструктора
  3. Нет парадигмы try/catch
  4. Нет цикла "пока"

Перейти по сравнению с другими языками программирования

Го против Питона

  • Статическая типизация против динамической типизации
  • Скомпилированные и интерпретированные
  • Встроенная поддержка параллелизма против необходимости импортировать дополнительный пакет

Go vs C/C++

  • Круговая зависимость
  • Сборка мусора для управления очисткой памяти
  • Нет арифметики указателя

Go против Java

  • Меньше кода vs больше подробностей
  • Быстрее, чем джава

Зачем использовать Go?

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

1. Имеет встроенные сборщики мусора, предотвращающие утечки памяти и правильное управление памятью

2. В отличие от C, C++ или даже JAVA, синтаксис Go очень легко читать, писать и понимать. Это было сделано намеренно. Создатели Go (Кен Томсон, Роб Пайк и их команда) хотели сделать программирование эффективным, но также хотели, чтобы оно было простым.

3. Одна вещь, которая меня очаровала, это то, что Go не использует цикл while, вместо этого для выполнения этой задачи можно использовать for look.

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

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

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

8. Форматирование исходного кода Форматирование кода также является еще одной очень удобной функцией. Прошли те времена, когда вы занимались форматированием кода для лучшей читабельности.

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

10. Простая упаковка и компиляция приложения на основе целевой ОС и архитектуры.

Предпосылка

Честно говоря, нет никаких предварительных условий для обучения го. Вы можете использовать go в качестве своего первого языка программирования, и все равно с ним все будет в порядке. Если у вас есть опыт программирования на таких языках, как C, Java, Python, вам будет легче понять.

Когда использовать Go?

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

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

Разбираем простое приложение hello world go

Прежде всего, все коды go создаются в файле с именем `*.go`. В go должна быть точка входа приложения, которая обычно определяется в файле с именем `main.go`, но вы можете назвать его любым именем файла. `main.go` – это основная точка входа в приложение.

Давайте посмотрим на пример кода «Hello world», написанный на go.

package main

import "fmt"

func main() {
  fmt.Println("Hello world")
}

Давайте посмотрим на код поближе

`package main`: Go использует идиоматический подход, когда начинается выполнение программы. Сначала он ищет функцию `main` внутри пакета `main`, чтобы начать выполнение. Приложение Go должно иметь основной пакет, который действует как точка входа в ваше приложение. Эта директива означает, что этот файл является основным для приложения go.

`import “fmt”` : этот шаг импортирует пакет `fmt`, который состоит из методов для вывода информации в стандартный вывод с использованием `Println` или `Printf` и многое другое.

`func main() {}`: этот шаг сообщает, что мы создаем функцию с именем `main`. Как уже говорилось, у каждого перехода должен быть основной пакет, и эта основная функция является точкой входа этого приложения. Go ищет основную функцию как функцию точки входа. Это похоже на создание основной функции при использовании приложений JAVA.

`fmt.Println("Hello world")`: этот шаг сообщает, что мы хотим использовать метод `Println` из пакета `fmt` . `Println` форматирует ввод с форматами по умолчанию для своих операндов и записывает в стандартный вывод. Между операндами всегда добавляются пробелы и добавляется новая строка.

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

$ go run main.go
Hello world

или вы можете скомпилировать код в двоичный исполняемый файл и запустить его. Этот способ намного быстрее. Это создаст исполняемый файл `main`, и вы сможете выполнять его так же, как запускаете другие исполняемые файлы.

$ go build main.go
$ ./main
Hello world

Вы можете использовать онлайн-редактор для кода и запустить свой код: https://play.golang.org/p/PHr9qtsC_QX

Комментирование в Go

В Go комментарии записываются как `//` для однострочного комментария и `/* */` для многострочного комментария.

// Single line comment
/*
This is a
Multi line comment
*/

Советы: полезно комментировать свои функции, чтобы их можно было просматривать как часть функции, когда вы наводите на нее указатель мыши.

eg:

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

// When you comment over function like this, it can be seen when mouse is hovered over
// the function making it easy to read what function does
func adder() {
}

Переменные и константы

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

var [variable_name] [variable type]

eg:

var myName string
var age int

Если значение переменной задано при объявлении, Go автоматически определит тип переменной. Например, если вы объявляете такую ​​переменную, как `var age = 2`, то она автоматически определяет, что это переменная типа int, или если вы объявляете переменную, подобную этой, `var name = «pbesh», то она автоматически определяет, что это переменная типа строка, которая является аккуратной.

Вы также можете назначить несколько переменных сразу, как это

var value, status = "12", true

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

Когда переменная объявляется без присвоения значения, по умолчанию она будет содержать пустое значение, т.е. если вы объявляете переменную int, то по умолчанию ее значение будет `0`, а если вы объявляете строковую переменную, то она будет содержать пустую строку, а не `nil`.

Переменная может быть объявлена ​​и инициализирована как в сокращенной версии, так и с помощью операции `:=`. Это означает, что вы объявляете и инициализируете переменную, то есть `var age int = 2` можно записать как `age := 2`. Это сильно упрощает задачу.

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

const pi float32 = 3.1415

Целое число, число с плавающей запятой, строки и руны

Целое число в go можно объявить, добавив тип `int` к объявлению переменной, например, `var age int = 24`

Число с плавающей запятой можно объявить, добавив тип `float32` или `float64` в объявление переменной, например `var pi float32 = 3.14` или `var pi float64 = 3,1415`. `float32` использует 32 бита памяти и сохраняет значение в одинарном формате с плавающей запятой, тогда как `float64` использует 64 бита в памяти и сохраняет значения в двойном формате с плавающей запятой.

Как и в других языках, строки представляют собой набор символов. например, «Это строка» — это строка из нескольких символов, а «а» — это также строка из одного символа (включая двойные кавычки).

Если вы представляете «а» как это «а» (обратите внимание на одинарную кавычку), то это называется руной, где этот символ может быть представлен в кодовых точках Unicode.

package main

import (
"fmt"
)

func main() {
  var age int = 22 // Integer
  var pi float32 = 3.14 // Floating point number
  var double_float float64 = 3.141562 // Double float
  fmt.Println(age)
  fmt.Println(pi)
  fmt.Println(double_float)
  rune := 'a'
  string_with_single_char := "a"
  string_with_multiple_char := "Prabesh"
  // This prints unicode code point
  fmt.Println(rune)
  // This prints out character
  fmt.Println(string_with_single_char)
  // This prints out string with multiple char
  fmt.Println(string_with_multiple_char)
}

Вы можете запустить и посмотреть вывод https://play.golang.org/p/QBlyqo8LxQF

Операции

В программировании мы можем выполнять различные операции, например складывать, вычитать, делить, умножать, вычислять остаток и т. д. Давайте посмотрим, как это сделать. Это похоже на другие языки программирования.

package main

import (
"fmt"
"math"
)

func main() {
  fmt.Println("Addition", 1+2)
  fmt.Println("Subtraction", 4–3)
  fmt.Println("Multiple", 3*2)
  fmt.Println("Division", 22/7) // This will give output in integer as it is integer operation.
  fmt.Println("Division", 22.0/7) // For floating point operations js8ut add ".0" at end
  fmt.Println("Exponential", math.Pow(20.0, 3))
  fmt.Println("Reminder", 3%2)
  // Boolean operations
  fmt.Println("Greater than", 2 > 1)
  fmt.Println("Greater than", 1 > 2)
  fmt.Println("less than", 1 < 2)
  fmt.Println("Greater or quivalent", 2 >= 1)
  fmt.Println(4.0 == 4)
}

Вы можете запустить код https://play.golang.org/p/DhpawiAoSDU

Массив, срез и карты

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

Множество

Массив может быть объявлен в go следующим образом: `[name_of_array] := [length_of_array][array_type]{values}` (обратите внимание на фигурные скобки). Массив может иметь значения с одинаковым типом данных. Пример можно увидеть ниже

package main

import (
"fmt"
)

func main() {
  students := [3]string{"prabesh","pradip","asmita"}
  fmt.Println(students)
}

Массив может быть определен без инициализации перед подобными переменными и добавлен позже с использованием индекса, такого как `array_name[index]`. например

package main

import (
"fmt"
)

func main() {
  movies := [3]string{} // Defined array of type string
  // Adding values later to the array using the index
  movies[0] = "50 Shades of Grey"
  movies[1] = "X-men"
  movies[2] = "Pokemon"
  // Accessing individual element
  fmt.Println(movies[2])
  // Accessing whole array
  fmt.Println(movies)
}

Если в массив не добавлено значение, оно примет значение по умолчанию, т.е. если вы объявите массив в int с длиной 3 и добавите значение к первому, а не к оставшимся двум, тогда они сохранят значение по умолчанию. Значения по умолчанию:

int = 0
float = 0.0
string = ""

длина массива может быть доступна с помощью встроенной функции `len`.

Вы можете запустить код https://play.golang.org/p/iBHx-dYfUHs

Вы также можете создать многомерный массив, как это

rectangle_coordinates := [2][2]int{}

Кусочек

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

Вы можете объявить фрагмент следующим образом

surnames := []string{}

и добавьте к этому фрагменту, используя функцию `append`

surnames = append(surnames, "Thapa")
surnames = append(surnames, "Silwal")
surnames = append(surnames, "Adhikari", "Tamang") // can do this also

пример

package main

import (
"fmt"
)

func main() {
  // Slice = variable length array
  surnames := []string{} // Declaring slices
  surnames = append(surnames, "Thapa")
  surnames = append(surnames, "Silwal")
  surnames = append(surnames, "Adhikari", "Tamang") // Can append multiple data at once.
  fmt.Println(surnames)
}

Вы также можете создать слайс фиксированной длины, используя метод make. например:

package main

import (
"fmt"
)

func main() {
  // Slice = variable length array
  surnames := []string{} // Declaring slices
  surnames = append(surnames, "Thapa")
  surnames = append(surnames, "Silwal")
  surnames = append(surnames, "Adhikari", "Tamang") // Can append multiple data at once.
  fmt.Println(surnames)
  movies := make([]string, 4) // Creating a slice with a default value of 4
  movies[0] = "He-man"
  movies[1] = "Ant man"
  movies[2] = "Iron man"
  movies[3] = "Hulk"
  fmt.Println(movies)
}

Вы можете запустить код https://play.golang.org/p/uZ41JVDSaM6

Слайс поддерживает использование операции среза `:` с синтаксисом имя_слайса[низкий:высокий]

карта

Карты похожи на словари в других языках программирования. Вы можете определить карту, используя ключевое слово hte `map`, подобное этому `map[type_of_key]type_of_value`, например

student := map[string]string{
"name": "prabesh",
"address": "11 nsw str",
"phn_no": "1246322562",
}

Вы можете просто объявить карту только без каких-либо значений

ages := map[string]int{}

Добавление похоже на добавление элемента в массив, но на этот раз вы используете ключ вместо индекса.

ages["kabita"] = 68
ages["pradip"] = 21
ages["prabesh"] = 20

Удаление выполняется с использованием метода `delete` и передачи карты и ее ключевого слова.

delete(ages, "prabesh") // delete entry from map

eg:

package main

import (
"fmt"
)

func main() {
  // map[type_of_key]type_of_value
  birthday := map[string]string{
  "name": "prabesh",
  "address": "11 bond str",
  "phn_no": "0414032050",
  }
  fmt.Println(birthday)
  ages := map[string]int{} // defining map without any pre-values
  ages["prabesh"] = 26
  ages["kabita"] = 68
  ages["pradip"] = 21
  ages["prabesh"] = 20
  delete(ages, "prabesh") // delete entry from map
  fmt.Println(ages)
}

Вы можете запустить код https://play.golang.org/p/1huYnF0jwSC

Если вам понравилась статья, хлопните в ладоши и подпишитесь. Это побудит меня написать больше таких статей и поделиться знаниями. Добрый день :)