Быстрый старт GoLang. Часть 2: Типы данных, константы, операторы и циклы в Go

Основы языка Go GoLang
Обзор типов данных, переменных, констант, операторов. Условные операторы и циклы в Go.

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

Типы данных

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

Примитивные типы данных

  • Целые числа: В GoLang есть несколько типов для представления целых чисел: int и uint (со знаком и без знака соответственно), а также их вариации, такие как int8, int16, int32, int64, uint8, uint16, uint32, uint64. Выбор типа зависит от того, какое значение вы хотите хранить.
var i int = 10
var bigInt int64 = 1<<60
fmt.Println(i, bigInt)
Code language: Go (go)
  • Вещественные числа: В Go есть два типа для представления вещественных чисел: float32 и float64. Они используются для хранения чисел с плавающей точкой.
var f float32 = 3.14
fmt.Println(f)
Code language: Go (go)
  • Булев тип (Boolean): Булев тип в Go представлен ключевым словом bool и может принимать два значения: true или false.
var b bool = true
fmt.Println(b)
Code language: Go (go)
  • Строки (String): Строки в GoLang представлены типом string. Они неизменяемы и обычно используются для хранения текстовых данных.
var s string = "Hello, Go"
fmt.Println(s)Code language: JavaScript (javascript)

Составные типы данных в Go

  • Массивы и срезы (Array, Slice): Массивы в GoLang — это набор элементов одного типа. Срезы — это более гибкий тип данных, который может менять свой размер.
var arr [5]int = [5]int{1, 2, 3, 4, 5}
var slice []int = arr[1:4]
fmt.Println(arr, slice)
Code language: Go (go)
  • Карты (Map): Карты в Go — это набор пар ключ-значение. Они похожи на словари в Python или объекты в JavaScript.
var m map[string]int = map[string]int{"one": 1, "two": 2}
fmt.Println(m)
Code language: Go (go)
  • Структуры (Struct): Структуры в GoLang — это пользовательские типы данных, которые могут содержать разные типы данных.
type Person struct {
    Name string
    Age  int
}

var p Person = Person{"Bob", 20}
fmt.Println(p)
Code language: Go (go)
  • Интерфейсы (Interface): Интерфейсы в GoLang — это абстрактные типы, которые определяют методы, которые должна реализовать структура или любой другой тип.
type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

var s Shape = Circle{5.0}
fmt.Println(s.Area())
Code language: Go (go)
  • Каналы (Channel): Каналы используются для коммуникации между горутинами (легковесными потоками).
ch := make(chan int)
Code language: Go (go)
  • Указатели (Pointer): Указатель на значение определенного типа
var x int = 10
var p *int = &x
Code language: Go (go)
  • Функции (Function): Функции также считаются типом данных в GoLang, поскольку их можно присваивать переменным и передавать в другие функции.
func add(x int, y int) int {
  return x + y
}
var f func(int, int) int = add
Code language: Go (go)

Управляющие конструкции в Go

В языке Go управляющие конструкции можно разделить на следующие категории: циклы, условные операторы и операторы выбора.

Циклы в Go

Циклы в GoLang

Циклы в Go используются для повторения определенных участков кода.

«for»

a) Базовый цикл for:

for i := 0; i < 5; i++ {
  fmt.Println(i)
}
Code language: Go (go)

В этом примере переменная i инициализируется значением 0. Затем условие проверяет, меньше ли i чем 5. Если это так, тогда код внутри блока {} выполняется и i увеличивается на 1. Процесс повторяется до тех пор, пока i не станет равным 5.

б) Безусловный цикл for (аналог while в других языках):

i := 0
for {
  if i >= 5 {
    break
  }
  fmt.Println(i)
  i++
}
Code language: Go (go)

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

«range»

Цикл range обычно используется для итерации по элементам слайса или мапы:

nums := []int{2, 4, 6, 8}
for i, num := range nums {
  fmt.Printf("nums[%d] = %d\n", i, num)
}
Code language: Go (go)

В этом случае range возвращает два значения: индекс и значение каждого элемента в nums.

«break» и «continu

Команда break используется для прекращения выполнения текущего цикла, а команда continue используется для пропуска текущей итерации цикла и перехода к следующей.

for i := 0; i < 10; i++ {
  if i%2 == 0 {
    continue
  }
  fmt.Println(i)
  if i == 7 {
    break
  }
}
Code language: Go (go)

В этом примере continue пропускает все четные числа, и цикл завершается, когда i равно 7.

«goto»

Команда goto используется для перехода на метку внутри функции:

func myFunc() {
  i := 0
Here: // это метка
  fmt.Println(i)
  i++
  if i < 5 {
    goto Here
  }
}
Code language: Go (go)

В этом случае цикл повторяется пять раз, и после каждой итерации значение i увеличивается на 1. Когда i достигает 5, цикл останавливается.

Условные операторы

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

if

Оператор if проверяет, выполняется ли условие. Если условие истинно, выполняется блок кода внутри фигурных скобок {}.

Пример:

x := 10
if x > 5 {
  fmt.Println("x больше 5")
}
Code language: Go (go)

В этом примере, если x больше 5, выводится сообщение «x больше 5».

if-else

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

Пример:

x := 3
if x > 5 {
  fmt.Println("x больше 5")
} else {
  fmt.Println("x меньше или равно 5")
}
Code language: Go (go)

В этом примере, если x больше 5, выводится сообщение «x больше 5», а если x меньше или равно 5, выводится «x меньше или равно 5».

if-else-if

Оператор if-else-if используется, когда нужно проверить несколько условий.

Пример:

x := 5
if x > 5 {
  fmt.Println("x больше 5")
} else if x < 5 {
  fmt.Println("x меньше 5")
} else {
  fmt.Println("x равно 5")
}
Code language: Go (go)

В этом примере есть три ветви: если x больше 5, выводится «x больше 5», если x меньше 5, выводится «x меньше 5», а если x равно 5, выводится «x равно 5».

Оператор выбора

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

Оператор Switch

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

Оператор switch в GoLang используется для проверки множественных потенциальных значений переменной или выражения.

Пример:

x := 3
switch x {
case 1:
  fmt.Println("x равно 1")
case 2:
  fmt.Println("x равно 2")
case 3:
  fmt.Println("x равно 3")
default:
  fmt.Println("x не равно 1, 2 или 3")
}
Code language: Go (go)

В этом примере, если x равно 1, выводится «x равно 1», если x равно 2, выводится «x равно 2», если x равно 3, выводится «x равно 3», иначе выводится «x не равно 1, 2 или 3».

switch с условиями

В GoLang вы также можете использовать switch с условиями, аналогично оператору if.

Пример:

x := 5
switch {
case x > 5:
  fmt.Println("x больше 5")
case x < 5:
  fmt.Println("x меньше 5")
default:
  fmt.Println("x равно 5")
}
Code language: Go (go)

В этом примере, если x больше 5, выводится «x больше 5», если x меньше 5, выводится «x меньше 5», а если x равно 5, выводится «x равно 5».

type switch

В GoLang существует также конструкция type switch, которая позволяет вам обрабатывать значения различных типов.

Пример:

var i interface{} = "hello"

switch v := i.(type) {
case int:
  fmt.Println("Целое число:", v)
case string:
  fmt.Println("Строка:", v)
default:
  fmt.Println("Неизвестный тип")
}
Code language: Go (go)

этом примере, переменная i является интерфейсом и может принимать значения любого типа. Type switch позволяет проверить конкретный тип значения i.

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

Оператор Select

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

ch1 := make(chan string)
ch2 := make(chan string)

go func() {
    ch1 <- "message from ch1"
}()

go func() {
    ch2 <- "message from ch2"
}()

select {
case msg1 := <-ch1:
    fmt.Println(msg1)
case msg2 := <-ch2:
    fmt.Println(msg2)
}
Code language: Go (go)

этом примере select будет ждать, пока не получит сообщение от ch1 или ch2. Как только одно из этих условий выполнится, код в соответствующем блоке case будет выполнен.

Таким образом, основное отличие между select и switch в Go заключается в том, что switch обычно используется для контроля потока выполнения в обычном последовательном коде, в то время как select используется для управления одновременностью при работе с каналами

Оценить
Exception.Expert