package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	// значение по умолчанию
	var num0 int

	// значение при инициализации
	var num1 int = 1

	// пропуск типа
	var num2 = 20
	fmt.Println(num0, num1, num2)

	// короткое объявление переменной
	num := 30
	// только для новых переменных (работает 1 раз)
	// num := 31

	num += 1
	fmt.Println("+=", num)

	// ++num нету
	num++
	fmt.Println("++", num)

	// camelCase - принятый стиль
	userIndex := 10
	// under_score - не принято
	user_index := 10
	fmt.Println(userIndex, user_index)

	// объявление нескольких переменных
	var weight, height int = 10, 20

	// присваивание в существующие переменные
	weight, height = 11, 21

	// короткое присваивание
	// хотя бы одна переменная должна быть новой!
	weight, age := 12, 22

	fmt.Println(weight, height, age)
	//dataType()
}

func dataTypeDigit() {
	// int - платформозависимый тип, 32/64
	var i int = 10

	// автоматически выбранный int
	var autoInt = -10

	// int8, int16, int32, int64
	var bigInt int64 = 1<<32 - 1

	// платформозависимый тип, 32/64
	var unsignedInt uint = 100500

	// uint8, uint16, uint32, uint64
	var unsignedBigInt uint64 = 1<<61 - 1

	fmt.Println(i, autoInt, bigInt, unsignedInt, unsignedBigInt)

	// float32, float64
	var pi float32 = 3.141
	var e = 2.718
	goldenRatio := 1.618

	fmt.Println(pi, e, goldenRatio)

	// bool
	var b bool // false по-умолчан
	var isOk bool = true
	var success = true
	cond := true

	fmt.Println(b, isOk, success, cond)

	// complex64, complex128
	//var c complex128 = -1.1 + 7.12i
	//c2 := -1.1 + 7.12i
}


func dataTypeString()
{
	// пустая строка по умолчанию
	var str string

	// со спец символами
	var hello string = "Привет\n\r"

	// без спец символов
	var world string = `Мир\r\n`

	// UTF-8 из коробки
	var hellowWorld = "Привет, мир!"

	// одинарные кавычки для байт (uint8)
	var rawBinary byte = '\x27'

	// rune (uint32) для UTF-8 символов

	// конкатенация строк
	andGoodMorning := helloWorld + " и доброе утро"

	// строки неизменяемы
	// helloWorld[0] = 72

	// получение длины строки (возыращает длину в байтах)
	byteLen := len(hellowWorld)
	sybols := utf8.RuneCountInString(hellowWorld)

	// получение подстроки, в байтах, не символах!
	hello := hellowWorld[:12] // Привет, 0-11 байты
	H := hellowWorld[0]	// byte, 72, не "П"

	// конвертация в слайс байт и обратно
	byteString = []byte(hellowWorld)
	helloWorld = string(byteString)

	
}

