|
|
@@ -0,0 +1,231 @@
|
|
|
+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)
|
|
|
+ }
|
|
|
+}
|