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

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

Привет, мир на Голанге

Начнем с кода, без которого введение ни в один язык программирования не кажется полным, классического «Hello, World!» программа. Код на Golang очень лаконичен и легко читается. Вот как написать простую программу на Golang:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

Предложение пакета запускает каждый исходный файл и указывает, что файл принадлежит указанному пакету. Вторая строка import "fmt" импортирует пакет fmt, который предоставляет функции для форматирования и печати текста (например, файл заголовка stdio.h в C++). Скоро мы узнаем больше о пакетах и ​​импорте.

Функция main является точкой входа в программу. Он выполняется при запуске программы. Когда компилятор Go создает программу, он ищет основной пакет и, в частности, основную функцию в этом пакете. Если основная функция не найдена, программа не запустится.

Переменные

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

var x int = 10

Вы также можете объявить несколько переменных одновременно:

var x, y int = 10, 20

В дополнение к ключевому слову var вы также можете использовать сокращенный оператор := для объявления и инициализации переменной:

x := 10

Функции

Функции в Golang определяются с помощью ключевого слова func, за которым следует имя функции, параметры и тип возвращаемого значения. Вот пример:

package main

import "fmt"

func main() {
 var sum int=add(10,2);
 fmt.Println("Sum of 10 and 2 is: ",sum)
}
func add(x int, y int) int {
    return x + y
}

Вы также можете иметь несколько возвращаемых значений:

func swap(x, y string) (string, string) {
    return y, x
}

Пакеты и импорт в Go

В Go нет концепции ООП, как в C++ и Python. Но у Go есть пакеты, с помощью пакетов мы можем определить имя каталога, в котором находятся все исходные файлы Go, относящиеся к этому пакету.

Например: если у нас есть пакет с именем «myutil», который предоставляет некоторые служебные функции, мы можем создать под ним три файла:

myutil/
├── stringutil.go
└── mathutil.go
└── funcutil.go
main.go

myutil — это каталог (и имя пакета), в котором находятся три файла, а main.go — это файл вне каталога. В каждом из этих файлов мы можем определить код, который нам нужен. mathutil.go может иметь такую ​​структуру кода:

package myutil

// Add returns the sum of two integers.
func Add(a, b int) int {
    return a + b
}
// Subtract returns the difference of two integers.
func Subtract(a, b int) int {
    return a - b
}

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

Пример того, как использовать эти функции вне каталога myutil:

package main
import (
    "fmt"
    "myutil"
)
func main() {
    fmt.Println(myutil.Add(2, 3))
    fmt.Println(myutil.Subtract(5, 2))
}

Здесь мы импортируем пакет fmt для печати на консоль и пакет myutil для использования служебных функций, которые мы определили ранее. Мы вызываем функции Add и Subtract из mathutil.go, используя следующий синтаксис:

myutil.<function name>(arguments)

Структуры управления

Golang поддерживает все обычные структуры управления.

если еще

Операторы if, if-else и if-else if используются для проверки условий. Мы указываем условие, и если это условие выполняется, этот блок будет выполнен.

package main
import "fmt"
func main() {
    var num int = 10
    if num < 0 {
        fmt.Println("The number is negative")
    } else if num > 0 && num < 10 {
        fmt.Println("The number is between 1 and 9")
    } else {
        fmt.Println("The number is greater than or equal to 10")
    }
}

Петли

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

package main
import "fmt"
func main() {
    // Simple for loop
    fmt.Println("Counting from 0 to 9")
    for i:=0; i<10; i++{
    	fmt.Println(i)
    }

    // Another way (similar to a while loop in C++)
    j:=0
    for j<10{
    	fmt.Println(j)
    	j++
    }
}

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

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

package main
import "fmt"
func main() {
   var i int = 10
   for i < 20 {
      fmt.Printf("value of i: %d\\\\n", i);
      i++;
      if i > 15 {
         break;
      }
   }
 fmt.Println("After break, Odd numbers from 0 to 9: ")
     for i:=0; i<10; i++{
         if i%2==0{
             continue
         }
      fmt.Println(i)
     }
}

Выключатель

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

package main
import "fmt"
func main() {
    var num int = 2
    switch num {
    case 1:
        fmt.Println("The number is one")
    case 2:
        fmt.Println("The number is two")
    case 3:
        fmt.Println("The number is three")
    default:
        fmt.Println("The number is not one, two or three")
    }
}

Оператор switch проверяет num по каждому из случаев, и, если он соответствует случаю, выполняется соответствующий блок кода. В этом случае вывод будет «Число равно два».

Если ни один из вариантов не соответствует, выполняется блок кода по умолчанию. В этом случае вывод будет «Число не один, два или три».

Множество

Массивы — это структуры данных фиксированной длины, которые хранят данные одного типа в смежных ячейках памяти. Синтаксис: var <array_name> [<array_size>]<data_type>

package main

import "fmt"

func main() {
    var arr [4] int
    arr[0]=1
    arr[1]=2
    arr[2]=3

    for i:=0; i<len(arr); i++{
        fmt.Println(arr[i])
    }
}

Функция len возвращает длину массива. Обратите внимание, что arr[4] не был инициализирован, поэтому было напечатано значение по умолчанию 0.

Массивы также можно инициализировать с помощью следующих сокращенных обозначений:

arr:= []int {1,2,3,4}
\\OR
var arr[4]int = [4]int{1, 2, 3, 4}

Эти обозначения проще в использовании и более читабельны.

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

Кусочек

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

Вы можете объявить срез, используя любой из следующих двух методов:

var numbers[]int
numbers := []int{1, 2, 3, 4}

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

package main

import "fmt"

func main() {
    slice := []int{1, 2, 3, 4}
    fmt.Println(slice)
    slice = append(slice, 5, 6, 7, 8)
    fmt.Println(slice)
    fmt.Println(slice[3])
}

карта

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

package main
import "fmt"
func main() {

    m := make(map[string]int)
    m["apple"] = 1
    m["orange"] = 2
    m["banana"] = 3
    fmt.Println(m)
    fmt.Println(m["apple"])
    fmt.Println(m["mango"])
    delete(m,"apple")
    fmt.Println(m)
}

Результат будет:

map[apple:1 banana:3 orange:2]
1
0
map[banana:3 orange:2]

Структура

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

package main
import "fmt"
type Person struct {
    Name string
    Age int
    Address string
}
func main() {

    var p1 Person // one way to create a new instance of Person
    p1.Name = "Akanksha"
    p1.Age = 30
    p1.Address = "12, XYZ Apartment"
    p2 := Person{Name: "Bunty", Age: 25, Address: "Block 56, ABC street"} // another way to create a new instance of Person

    fmt.Println(p1.Name) // prints "Akanksha"
    fmt.Println(p2.Age) // prints 25
}

указатели

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

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

Чтобы инициализировать переменную-указатель, вы можете использовать оператор адреса (&), который возвращает адрес памяти переменной:

var i int = 10
p = &i

Чтобы разыменовать переменную-указатель и получить доступ к значению, на которое она указывает, вы можете использовать оператор разыменования (*):

fmt.Println(*p) // prints 10

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

package main
import "fmt"
func increment(p *int) {
    *p++
}
func main() {
    i:= 10
    increment(&i)
    fmt.Println(i) // prints 11
}

Заключение

Это лишь некоторые из основ Golang. Golang становится все более популярным благодаря своей простоте и эффективности. Если вы хотите изучить новый язык программирования, Golang определенно стоит рассмотреть.

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