var.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package main
  2. import "fmt"
  3. func main() {
  4. // foo1()
  5. // foo2()
  6. // foo3()
  7. // foo4()
  8. // foo5()
  9. // foo6()
  10. // foo7()
  11. foo8()
  12. }
  13. // строки
  14. // Строки в Go неизменяемы
  15. func foo1() {
  16. // Строка как есть
  17. var world string = `Мир\r\n`
  18. fmt.Println(world)
  19. // Одинарный кавычки для байт (uint8)
  20. var rawBinary byte = '\x27'
  21. fmt.Println(rawBinary)
  22. fmt.Println(string(rawBinary))
  23. // rune (uint32) для UTF-8 символов
  24. var someRune rune = 'ℒ'
  25. fmt.Println(someRune)
  26. fmt.Println(string(someRune))
  27. // получение подстроки, в байтах, не в символах!
  28. var helloWorld string = "Hello world!"
  29. hello := helloWorld[:5]
  30. fmt.Println(hello)
  31. // конвертация в слайс байт о обратно
  32. byteString := []byte(helloWorld)
  33. helloWorld = string(byteString)
  34. fmt.Println(byteString)
  35. fmt.Println(helloWorld)
  36. }
  37. // константры
  38. func foo2() {
  39. const pi = 3.14
  40. // блок констант
  41. const (
  42. hello = "Привет"
  43. e = 2.718
  44. )
  45. // iota - автоинкремент для констант
  46. const (
  47. zero = iota
  48. _ // пустая переменная, пропуск iota
  49. three // = 3
  50. )
  51. const (
  52. // нетипизироанная константа
  53. year = 2017
  54. // типизированная константа
  55. yearTyped int = 2026
  56. )
  57. }
  58. // указатели
  59. func foo3() {
  60. // получение указателя на переменную типа int
  61. // инициализированную значением по умолчанию
  62. d := new(int)
  63. fmt.Println(d)
  64. }
  65. // массивы
  66. func foo4() {
  67. // определение размера при объявлении
  68. a1 := [...]int{1, 2, 3}
  69. fmt.Println(a1)
  70. }
  71. // слайсы
  72. func foo5() {
  73. // создание
  74. /*
  75. var buf0 []int
  76. buf1 := []int{}
  77. buf2 := []int{42}
  78. buf3 := make([]int, 0) // len = 0, cap = 0
  79. buf4 := make([]int, 5) // len = 5, cap = 5
  80. buf5 := make([]int, 5, 10) // len = 5, cap = 10
  81. */
  82. // добавление элементов
  83. var buf []int
  84. buf = append(buf, 9, 10)
  85. // добавление слайса в слайс
  86. otherBuf := make([]int, 3)
  87. buf = append(buf, otherBuf...)
  88. // можно копировать в часть существующего слайса
  89. ints := []int{1, 2, 3, 4}
  90. copy(ints[1:3], []int{5, 6})
  91. fmt.Println(ints)
  92. }
  93. // map
  94. func foo6() {
  95. // инициализация при создании
  96. var user map[string]string = map[string]string{
  97. "name": "Vasily",
  98. "lastname": "Romanov",
  99. }
  100. fmt.Println(user)
  101. // сразу с нужной емкостью
  102. // profile := make(map[string]string, 10)
  103. // проверка на существование ключа
  104. mName, nNameExist := user["middleName"]
  105. fmt.Println(mName, nNameExist)
  106. // удаление ключа
  107. delete(user, "lastName")
  108. }
  109. // условный оператор
  110. func foo7() {
  111. mapVal := map[string]string{"name": "rvasily"}
  112. // условие с блоком инициализации
  113. if keyValue, keyExist := mapVal["name"]; keyExist {
  114. fmt.Println("name =", keyValue)
  115. }
  116. // получаем только признак существование ключа
  117. if _, keyExist := mapVal["name"]; keyExist {
  118. fmt.Println("key 'name' exist")
  119. }
  120. // switch по 1 переменной
  121. strVal := "name"
  122. switch strVal {
  123. case "name":
  124. fallthrough // чтобы провалиться в следующее условие
  125. case "test", "lastName":
  126. // some work
  127. default:
  128. // some work
  129. }
  130. // switch как замена многим ifelse
  131. var val1, val2 = 2, 2
  132. switch {
  133. case val1 > 1 || val2 < 11:
  134. fmt.Println("first block")
  135. case val2 > 10:
  136. fmt.Println("second block")
  137. }
  138. // выход из цикла, находясь внутри switch
  139. Loop:
  140. for key, val := range mapVal {
  141. fmt.Println("switch in loop", key, val)
  142. switch {
  143. case key == "lastName":
  144. break
  145. fmt.Println("dont print this")
  146. case key == "firstName" && val == "Vasily":
  147. fmt.Println("switch - break loop here")
  148. break Loop
  149. }
  150. } // конце for
  151. }
  152. // циклы
  153. func foo8() {
  154. // цикл без условия
  155. isRun := true
  156. for isRun {
  157. fmt.Println("loop iteration with condition")
  158. isRun = false
  159. }
  160. // операции по slice
  161. sl := []int{1, 2, 3}
  162. idx := 0
  163. for idx , len(s1) {
  164. fmt.Println("while-type loop, idx:", idx, "value:", sl[idx])
  165. idx++
  166. }
  167. for i := 0; i < len(sl); i++ {
  168. fmt.Println("c-style loop", i, sl[i])
  169. }
  170. for idx := range sl {
  171. fmt.Println("range slice by index", idx)
  172. }
  173. for idx, val := range sl {
  174. fmt.Println("range slice by idx-value", idx, val)
  175. }
  176. // операции по map
  177. profile := map[int]string{1: "Vasily", 2: "Romanov"}
  178. for key := range profile {
  179. fmt.Println("range map by key", key)
  180. }
  181. for key, val := range progile {
  182. fmt.Println("range map by key-val", key, val)
  183. }
  184. for _, val := range profile {
  185. fmt.Println("range map by bal", val)
  186. }
  187. // итерироване по строке
  188. str := "Привет, Мир!"
  189. for pos, char := range str {
  190. fmt.Printf("%#U at pos %d\n" char, pos)
  191. }
  192. }