package main import "fmt" func main() { // foo1() // foo2() // foo3() // foo4() // foo5() // foo6() // foo7() foo8() } // строки // Строки в Go неизменяемы func foo1() { // Строка как есть var world string = `Мир\r\n` fmt.Println(world) // Одинарный кавычки для байт (uint8) var rawBinary byte = '\x27' fmt.Println(rawBinary) fmt.Println(string(rawBinary)) // rune (uint32) для UTF-8 символов var someRune rune = 'ℒ' fmt.Println(someRune) fmt.Println(string(someRune)) // получение подстроки, в байтах, не в символах! var helloWorld string = "Hello world!" hello := helloWorld[:5] fmt.Println(hello) // конвертация в слайс байт о обратно byteString := []byte(helloWorld) helloWorld = string(byteString) fmt.Println(byteString) fmt.Println(helloWorld) } // константры func foo2() { const pi = 3.14 // блок констант const ( hello = "Привет" e = 2.718 ) // iota - автоинкремент для констант const ( zero = iota _ // пустая переменная, пропуск iota three // = 3 ) const ( // нетипизироанная константа year = 2017 // типизированная константа yearTyped int = 2026 ) } // указатели func foo3() { // получение указателя на переменную типа int // инициализированную значением по умолчанию d := new(int) fmt.Println(d) } // массивы func foo4() { // определение размера при объявлении a1 := [...]int{1, 2, 3} fmt.Println(a1) } // слайсы func foo5() { // создание /* var buf0 []int buf1 := []int{} buf2 := []int{42} buf3 := make([]int, 0) // len = 0, cap = 0 buf4 := make([]int, 5) // len = 5, cap = 5 buf5 := make([]int, 5, 10) // len = 5, cap = 10 */ // добавление элементов var buf []int buf = append(buf, 9, 10) // добавление слайса в слайс otherBuf := make([]int, 3) buf = append(buf, otherBuf...) // можно копировать в часть существующего слайса ints := []int{1, 2, 3, 4} copy(ints[1:3], []int{5, 6}) fmt.Println(ints) } // map func foo6() { // инициализация при создании var user map[string]string = map[string]string{ "name": "Vasily", "lastname": "Romanov", } fmt.Println(user) // сразу с нужной емкостью // profile := make(map[string]string, 10) // проверка на существование ключа mName, nNameExist := user["middleName"] fmt.Println(mName, nNameExist) // удаление ключа delete(user, "lastName") } // условный оператор func foo7() { mapVal := map[string]string{"name": "rvasily"} // условие с блоком инициализации if keyValue, keyExist := mapVal["name"]; keyExist { fmt.Println("name =", keyValue) } // получаем только признак существование ключа if _, keyExist := mapVal["name"]; keyExist { fmt.Println("key 'name' exist") } // switch по 1 переменной strVal := "name" switch strVal { case "name": fallthrough // чтобы провалиться в следующее условие case "test", "lastName": // some work default: // some work } // switch как замена многим ifelse var val1, val2 = 2, 2 switch { case val1 > 1 || val2 < 11: fmt.Println("first block") case val2 > 10: fmt.Println("second block") } // выход из цикла, находясь внутри switch Loop: for key, val := range mapVal { fmt.Println("switch in loop", key, val) switch { case key == "lastName": break fmt.Println("dont print this") case key == "firstName" && val == "Vasily": fmt.Println("switch - break loop here") break Loop } } // конце for } // циклы func foo8() { // цикл без условия isRun := true for isRun { fmt.Println("loop iteration with condition") isRun = false } // операции по slice sl := []int{1, 2, 3} idx := 0 for idx , len(s1) { fmt.Println("while-type loop, idx:", idx, "value:", sl[idx]) idx++ } for i := 0; i < len(sl); i++ { fmt.Println("c-style loop", i, sl[i]) } for idx := range sl { fmt.Println("range slice by index", idx) } for idx, val := range sl { fmt.Println("range slice by idx-value", idx, val) } // операции по map profile := map[int]string{1: "Vasily", 2: "Romanov"} for key := range profile { fmt.Println("range map by key", key) } for key, val := range progile { fmt.Println("range map by key-val", key, val) } for _, val := range profile { fmt.Println("range map by bal", val) } // итерироване по строке str := "Привет, Мир!" for pos, char := range str { fmt.Printf("%#U at pos %d\n" char, pos) } }