Обычно самая первая программа программиста выводит в консоль классическую фразу “hello world”. Вот весь код программы.
package main import "fmt" func main() { fmt.Println("hello world") }
Go, как и все ЯП, имеет различные типы данных, такие как строки, целые числа, числа с плавающей запятой, булев тип, и так далее. Вот несколько основных примеров.
package main import "fmt" func main() { //Строки можно объединять с помощью +. fmt.Println("go" + "lang") //Целые числа и числа с плавающей запятой. fmt.Println("1+1 =", 1+1) fmt.Println("7.0/3.0 =", 7.0/3.0) //Булев тип, как вы и ожидаете, с логическими операторами true или false. fmt.Println(true && false) fmt.Println(true || false) fmt.Println(!true) }
Ветвление с if и else в Go очень простое.
Вот простой пример.
package main import "fmt" func main() { if 7%2 == 0 { fmt.Println("7 четное число") } else { fmt.Println("7 нечетное число") } //У вас может быть условие if без else. if 8%4 == 0 { fmt.Println("8 делится на 4") } //Оператор может предшествовать условию; любая переменная, объявленная в этом блоке, доступна во всех ветвлениях. if num := 9; num < 0 { fmt.Println(num, "отрицательное число") } else if num < 10 { fmt.Println(num, "состоит из 1 цифры") } else { fmt.Println(num, "состоит из нескольких цифр") } }
//Обратите внимание, что вам не нужны скобки вокруг условий в Go, но фигурные скобки необходимы.
Оператор switch предназначен для организации выбора из множества различных вариантов.
package main import "fmt" import "time" func main() { //Пример простого оператора switch. i := 2 fmt.Print("write ", i, " as ") switch i { case 1: fmt.Println("one") case 2: fmt.Println("two") case 3: fmt.Println("three") } //Вы можете использовать запятые для разделения нескольких выражений в одном операторе case. Также в этом примере мы используем необязательный оператор default. switch time.Now().Weekday() { case time.Saturday, time.Sunday: fmt.Println("it's the weekend") default: fmt.Println("it's a weekday") } //switch без выражения - это альтернативный путь выразить логику if/else. В этом примере также показано, как case выражения могут быть не постоянными. t := time.Now() switch { case t.Hour() < 12: fmt.Println("it's before noon") default: fmt.Println("it's after noon") } }
For единственная конструкция для циклов в Go. Ниже приводится 3 базовых типа цикла for.
package main import "fmt" func main() { //Самый базовый тип, с единственным условием. i := 1 for i <= 3 { fmt.Println(i) i = i + 1 } //Классический цикл оператора for начальное значение/условие/постусловие. for j := 7; j <= 9; j++ { fmt.Println(j) } //for без условия будет работать до тех пор, пока вы не примените break или return внутри функции. for { fmt.Println("loop") break } }
Массив в языке Go — это нумерованная последовательность элементов одного типа, с фиксированной длинной.
package main
import "fmt"
func main() {
//В этом примере мы создали массив a, который будет содержать именно 5 элементов типа int. Тип данных и размер массива - обязательны при объявлении массива. По-умолчанию массив имеет нулевые значения элементов. Для int это 0.
var a [5]int
fmt.Println("emp:", a)
//Мы можем установить значение элемента в массиве, используя индекс array[index] = value. Получить значение элемента массива можно также array[index].
a[4] = 100
fmt.Println("set:", a)
fmt.Println("get:", a[4])
//Встроенная функция len возвращает размер массива.
fmt.Println("len:", len(a))
//Используйте такой синтаксис, чтобы объявить и инициализировать массив одной строкой.
b := [5]int{1, 2, 3, 4, 5}
fmt.Println("dcl:", b)
//Массив - это одномерный тип данных, но вы можете сделать массив многомерным сочетая несколько массивов.
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
Срезы ключевой тип данных в Go, дающий более мощный интерфейс для работы с последовательностями, чем массивы.
package main
import "fmt"
func main() {
//Срез это часть массива. Как и массивы срезы индексируются и имеют длину. В отличии от массивов, их длину можно изменить. Для создания пустого среза с не нулевой длиной воспользуйтесь встроенной функцией make. В этом примере мы создали срез из строк с размером среза в 3 элемента (инициализированных нулевыми значениями).
s := make([]string, 3)
fmt.Println("emp:", s)
//Установка и чтение значений происходит точно также как в массиве.
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("set:", s)
fmt.Println("get:", s[2])
//len возвращает размер среза.
fmt.Println("len:", len(s))
//В дополнение к этим базовым функциям, срезы поддерживают несколько других функций которые делают их возможности гораздо шире чем у массивов. Одна из них - это append, которая возвращает срез содержащий 1 или более новых значений. Обратите внимание, что мы должны принять возвращаемое функцией append значение - таким образом мы получаем новое значение среза.
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)
//Срезы можно копировать. В этом примере мы создали пустой срез c той же самой длины что и s и скопировали содержимое из s в c.
c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:", c)
//Срезы поддерживают “slice”-оператор с синтаксисом slice[low:high]. Например, здесь мы получаем срез элементов s[2], s[3], и s[4].
l := s[2:5]
fmt.Println("sl1:", l)
//Здесь делается срез элементов от s[0] до s[5] (но исключая).
l = s[:5]
fmt.Println("sl2:", l)
//А это срез начиная с элемента s[2] (включительно) и до конца среза.
l = s[2:]
fmt.Println("sl3:", l)
//Мы можем объявить и инициализировать переменную для среза в одну строку.
t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)
//Срезы могут быть составлены в многомерные структуры данных. В отличии от многомерных массивов, размер внутренних срезов может различаться.
twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
В Go, переменные объявляются явно и используются компилятором, для проверки корректности типов вызываемых функций.
package main import "fmt" func main() { //var объявляет 1 или более переменных. var a string = "initial" fmt.Println(a) //Вы можете объявить несколько переменных за раз. var b, c int = 1, 2 fmt.Println(b, c) //Go определит тип инициализированных переменных автоматически. var d = true fmt.Println(d) //Не инициализированные переменные имеют нулевое значение. Например нулевое значение для int это 0. var e int fmt.Println(e) //Синтаксис := это сокращение для объявления и инициализации переменной, например в этом примере var f string = "short". f := "short" fmt.Println(f) }
Ого, спасибо ребят, очень много мне накидали всего разного. Пойду теперь разбираться со всем этим и пробовать самому писать код, основываясь на этих примерах.
package main import "fmt" func main() { //В этом примере мы создали массив a, который будет содержать именно 5 элементов типа int. Тип данных и размер массива - обязательны при объявлении массива. По-умолчанию массив имеет нулевые значения элементов. Для int это 0. var a [5]int fmt.Println("emp:", a) //Мы можем установить значение элемента в массиве, используя индекс array[index] = value. Получить значение элемента массива можно также array[index]. a[4] = 100 fmt.Println("set:", a) fmt.Println("get:", a[4]) //Встроенная функция len возвращает размер массива. fmt.Println("len:", len(a)) //Используйте такой синтаксис, чтобы объявить и инициализировать массив одной строкой. b := [5]int{1, 2, 3, 4, 5} fmt.Println("dcl:", b) //Массив - это одномерный тип данных, но вы можете сделать массив многомерным сочетая несколько массивов. var twoD [2][3]int for i := 0; i < 2; i++ { for j := 0; j < 3; j++ { twoD[i][j] = i + j } } fmt.Println("2d: ", twoD) }
@lauren
Пожалуйста! Вот еще один пример кода на языке Go, который демонстрирует работу с массивами. Успехов в изучении Go! Если у вас будут вопросы или нужна помощь - обращайтесь.
@lauren
Спасибо! Я буду изучать и экспериментировать с этим кодом. Если у меня возникнут вопросы, я обязательно обращусь за помощью. До свидания!