Ответ
Go — это статически типизированный язык программирования с богатым набором встроенных типов, которые делятся на две основные категории:
Базовые (встроенные) типы
- Целочисленные знаковые:
int,int8,int16,int32(псевдонимrune),int64. - Целочисленные беззнаковые:
uint,uint8(псевдонимbyte),uint16,uint32,uint64,uintptr. - Числа с плавающей точкой:
float32,float64. - Комплексные числа:
complex64,complex128. - Логический:
bool(принимает значенияtrueилиfalse). - Строковый:
string(неизменяемая последовательность байт в кодировке UTF-8).
Составные (композитные) типы
- Массив (Array):
[n]T— коллекция элементов одного типа фиксированной длины. - Срез (Slice):
[]T— динамический, гибкий вид на базовый массив. - Структура (Struct):
struct { ... }— коллекция именованных полей, которые могут иметь разные типы. - Указатель (Pointer):
*T— хранит адрес в памяти другой переменной. - Функция (Function):
func(...) ...— функции являются типами первого класса, их можно присваивать переменным. - Интерфейс (Interface):
interface { ... }— определяет набор методов. Любой тип, реализующий эти методы, неявно удовлетворяет интерфейсу. - Карта (Map):
map[K]V— неупорядоченная коллекция пар ключ-значение. - Канал (Channel):
chan T— механизм для безопасного обмена данными между горутинами.
Пример использования:
package main
import "fmt"
// Определяем структуру
type Person struct {
Name string
Age int
}
func main() {
// Базовые типы
var score int = 100
var message string = "Success"
// Составные типы
primes := [3]int{2, 3, 5} // Массив
names := []string{"Alice", "Bob"} // Срез
ages := make(map[string]int) // Карта
ages["Alice"] = 30
// Структура
p := Person{Name: "Charlie", Age: 25}
fmt.Printf("%s: %d, Primes: %v, Names: %v, Person: %+vn",
message, score, primes, names, p)
} Ответ 18+ 🔞
Так, слушай, вот сидишь ты, значит, и думаешь: "А нахуя мне Go, блядь?" А я тебе щас объясню, как оно там внутри устроено, чтоб ты не пиздел потом, что не понял.
Вот есть у нас в Go, понимаешь, типы. И они, сука, делятся на две такие, блядь, категории, как будто кто-то их по полочкам разложил. Первая — это базовые, встроенные, типа как хлеб с маслом, без них нихуя не сваришь. Вторая — составные, это уже типа сложный конструктор, из них можно собрать всё, что угодно, хоть космический корабль, хоть очередной микросервис, который нихуя не работает.
Базовые (встроенные) типы
Ну, тут всё просто, как три копейки, блядь.
- Целые числа со знаком:
int,int8,int16,int32(его ещёruneобзывают, для символов юникода),int64. Хочешь отрицательные — пожалуйста. - Целые числа без знака:
uint,uint8(он жеbyte, для байтиков),uint16,uint32,uint64,uintptr(этот вообще для адресов памяти, не лезь туда, если не уверен). - Числа с плавающей точкой:
float32,float64. Для дробей, типа 3.14 или твоей зарплаты после налогов. - Комплексные числа:
complex64,complex128. Это уже для математиков-извращенцев, обычному человеку нахуй не сдалось. - Логический:
bool. Тут либоtrue, либоfalse. Либо панк, либо труп, третьего не дано. - Строковый:
string. Это не просто строка, ёпта, это неизменяемая последовательность байт в UTF-8. Попробуй изменить — получишь по ебалу от компилятора.
Составные (композитные) типы
А вот тут начинается магия, блядь, или пиздец, смотря как собрать.
- Массив (Array):
[n]T. Коллекция фиксированной длины. Создал на 5 элементов — сиди и мучайся, больше не впихнёшь. Как твои старые джинсы. - Срез (Slice):
[]T. А вот это уже динамический вид на массив. Гибкий, удобный, можно растягивать. Любимый всеми. - Структура (Struct):
struct { ... }. Это типа анкета. Имя, возраст, хобби — поля могут быть любых типов. Собираешь данные в кучку. - Указатель (Pointer):
*T. Хранит не значение, а адрес, где это значение лежит. Как записка "ищи под ковриком". Опасная хуйня, но иногда нужная. - Функция (Function):
func(...) .... Функции — это тоже типы, их можно в переменные пихать и передавать туда-сюда. Красота, блядь. - Интерфейс (Interface):
interface { ... }. Определяет набор методов. Если твой тип умеет делать то, что в интерфейсе описано — поздравляю, он его реализует. Никаких явных указаний, всё по-честному, на доверии, ёпта. - Карта (Map):
map[K]V. Неупорядоченная коллекция "ключ-значение". Как телефонная книга, только быстрее. Искал "Вася" — получил номер. Илиnil, если Вася — мудак. - Канал (Channel):
chan T. Вот это, блядь, мощь Go. Труба для безопасной передачи данных между горутинами. Без них — анархия и гонки данных, пиздец.
Ну и примерчик, чтобы не быть голословным:
package main
import "fmt"
// Объявляем структуру, типа анкету на человека
type Person struct {
Name string
Age int
}
func main() {
// Базовые типы
var score int = 100
var message string = "Success"
// Составные типы
primes := [3]int{2, 3, 5} // Массив из трёх простых чисел
names := []string{"Alice", "Bob"} // Срез, можно добавить "Charlie"
ages := make(map[string]int) // Карта, пока пустая
ages["Alice"] = 30 // А вот теперь не пустая
// Структура
p := Person{Name: "Charlie", Age: 25}
fmt.Printf("%s: %d, Primes: %v, Names: %v, Person: %+vn",
message, score, primes, names, p)
}
Вот и весь сказ. Сначала кажется, что типов — овердохуища, но потом привыкаешь. Главное — не пытайся string в int запихнуть без преобразования, компилятор тебя съест, ядрёна вошь.