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