План

  1. Бинтаксис ΠΈ структура: ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ элСмСнтами языка Go, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, условныС выраТСния ΠΈ Ρ†ΠΈΠΊΠ»Ρ‹.
  2. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ созданиС ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Go, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ ΠΏΠΎ ссылкС.
  3. Π‘Ρ€Π΅Π·Ρ‹ (slices) ΠΈ массивы: ΡƒΠ·Π½Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ срСзами ΠΈ массивами Π² Go.
  4. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ структур ΠΈ созданиСм ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π½ΠΈΠΌΠΈ.
  5. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ с указатСлями Π² Go ΠΈ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ для измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….
  6. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹: ΡƒΠ·Π½Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ интСрфСйсы ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² Go для достиТСния ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°.
  7. Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈ ΠΊΠ°Π½Π°Π»Ρ‹: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ программирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ ΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² Go.
  8. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок: ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°ΠΌΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок Π² Go, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ошибок ΠΈ ΠΏΠ°Π½ΠΈΠΊΠΈ.
  9. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° Π² ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Go.
  10. ВСстированиС: ΡƒΠ·Π½Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты для своСго ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° testing Π² Go.
  11. Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΡΠ΅Ρ‚ΡŒΡŽ: ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ опСрациями Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΡΠ΅Ρ‚ΡŒΡŽ Π² Go.
  12. Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ процСсс сборки ΠΈ развСртывания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС Go, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ.

Бинтаксис ΠΈ структура

НастраиваСм Goland

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠΈ с исходными ΠΊΠΎΠ΄Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

И Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠΈ с компилятором Go

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. main функция

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ всСгда ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ main ΠΈ функция main, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ основныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ прилоТСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ запуска прилоТСния Π½Π° Go

Π’ myVar записана пСрСмСнная, Π° ΡƒΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ форматирования fmt ΠΈ Π΅Ρ‘ ΠΌΠ΅Ρ‚ΠΎΠ΄ Print ΠΌΠΎΠΆΠ½ΠΎ вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² консоли

package main
 
import "fmt"
 
func main() {
	myVar := "Hello world"
	fmt.Print(myVar)
}
  • ΠŸΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ устанавливаСтся ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ SDK Go (компилятор)
  • Π’Ρ‚ΠΎΡ€ΠΎΠΉ - GOPATH - это пСрСмСнная срСды, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² Go для указания ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ пространства, Π³Π΄Π΅ хранятся исходныС ΠΊΠΎΠ΄Ρ‹ ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Go.
  • Π’Ρ€Π΅Ρ‚ΡŒΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ компилятор Go Ρ‡Π΅Ρ€Π΅Π· build ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ -o задаётся ΠΏΡƒΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΡƒΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ tmp Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ. ПослСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - это Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ‡Π΅Ρ€Π΅Π· Π΄Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

go run main.go

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ±ΠΈΠ»Π΄ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ Ρ„Π°ΠΉΠ» Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ нашСй систСмы

go build -o main_app main.go

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ Go, ΠΊΠ°ΠΊ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ самыС распространённыС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…:

  • bool: логичСский Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ true ΠΈΠ»ΠΈ false.
  • числовыС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…:
    • int (int8, int16, int32, int64): Ρ†Π΅Π»ΠΎΠ΅ число со Π·Π½Π°ΠΊΠΎΠΌ.
    • uint (uint8, uint16, uint32, uint64): Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ°.
    • float32, float64: числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.
    • complex64 / complex128
    • byte = uint8
    • rune = int32
  • string: строки тСкста.
  • массивы ΠΈ срСзы: ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ элСмСнтов ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.
  • struct: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, состоящиС ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².
  • ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ: хранят адрСс памяти Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
  • interface: Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ ΠΎΠ±Ρ‰ΠΈΠΌ интСрфСйсом.
  • func: Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.
  • maps: ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
  • channels: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€ΠΈ конструкции:

  • var имя Ρ‚ΠΈΠΏ_Π΄Π°Π½Π½Ρ‹Ρ… = Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - сами ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…
  • var имя = Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - сами ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π±Π΅Π· Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…
  • имя := Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - автоматичСскоС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…

Golang ΠΏΠΎΡ‡Ρ‚ΠΈ строготипизированный язык, поэтому Ссли ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ Ρ‚ΠΈΠΏ, Π½ΠΎ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‚ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ строку Π½Π° чичсло - Π½Π΅ получится

Π’Π°ΠΊ ΠΆΠ΅ Ρƒ нас Π΅ΡΡ‚ΡŒ явный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ int ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти число ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅

func main() {
	myVar := "Hello world"
	fmt.Print(myVar)
 
	var a int = 10
	b := 40
 
	var c uint32 = 50
	d := a + int(c)
}

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ сразу нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ синтаксисом:

func main() {
	var (
		name = "Oleg"
		age = 30
	)
 
	fmt.Print(name)
	fmt.Print(age)
}

Или ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ:

func main() {
	var name, age  = "Oleg", 30
 
	fmt.Print(name)
	fmt.Print(age)
}

Π Π°Π±ΠΎΡ‚Π° со строками

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ строки, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ просто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ +

func main() {
    str1 := "Hello"
    str2 := "World"
 
    result := str1 + " " + str2
    fmt.Println(result) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: Hello World
}

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки Ρ‡Π΅Ρ€Π΅Π· использованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Sprintf, ΠΊΡƒΠ΄Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ строку ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (%s - строка, %d - число), Π° дальшС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

func main() {
	var name, age = "Oleg", 30
 
	c := fmt.Sprintf("Hello! I'm %s. And I'm %d years old", name, age)
 
	fmt.Print(c)
}

Π§Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Join ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ массив Π² строку

func main() {
    strs := []string{"Hello", "World"}
 
    result := strings.Join(strs, " ")
    fmt.Println(result) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: Hello World
}

Ѐункция Split ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ строку ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ Π² массив

func main() {
    str := "apple,banana,orange"
 
    arr := strings.Split(str, ",")
    fmt.Println(arr) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: [apple banana orange]
}
  1. strings.Contains(s, substr):
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, содСрТит Π»ΠΈ строка s подстроку substr.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β true, Ссли s содСрТит substr, ΠΈΠ½Π°Ρ‡Π΅Β false.
  2. strings.HasPrefix(s, prefix):
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, начинаСтся Π»ΠΈ строка s с прСфикса prefix.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β true, Ссли s начинаСтся с prefix, ΠΈΠ½Π°Ρ‡Π΅Β false.
  3. strings.HasSuffix(s, suffix):
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, заканчиваСтся Π»ΠΈ строка s суффиксом suffix.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β true, Ссли s заканчиваСтся Π½Π°Β suffix, ΠΈΠ½Π°Ρ‡Π΅Β false.
  4. strings.Replace(s, old, new, n):
    • ЗамСняСт всС вхоТдСния подстроки oldΒ Π² строкС sΒ Π½Π° подстроку new.
    • МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Β n, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство Π·Π°ΠΌΠ΅Π½.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ строку, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ послС Π·Π°ΠΌΠ΅Π½Ρ‹.
  5. strings.ToLower(s):
    • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ всС символы строки sΒ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ строку с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ символами.
  6. strings.ToUpper(s):
    • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ всС символы строки sΒ Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ строку с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ символами.
  7. strings.TrimSpace(s):
    • УдаляСт всС Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈΠ· строки s.
    • Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ строку Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅.

Π¦ΠΈΠΊΠ»Ρ‹

Π¦ΠΈΠΊΠ» for

Основной Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сущСствуСт Π² Go прСдставлСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ вариациями:

// Π€ΠΎΡ€ΠΌΠ° 1: Π‘ наибольшим ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ
for init; condition; post {
    // Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°
}
 
// Π€ΠΎΡ€ΠΌΠ° 2: Как классичСский Ρ†ΠΈΠΊΠ» while
for condition {
    // Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°
}
 
// Π€ΠΎΡ€ΠΌΠ° 3: БСсконСчный Ρ†ΠΈΠΊΠ»
for {
    // Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°
}

Π¦ΠΈΠΊΠ» range

Π¦ΠΈΠΊΠ» range ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ элСмСнтам массива, срСза (slice), строки, ΠΊΠ°Ρ€Ρ‚Ρ‹ (map) ΠΈΠ»ΠΈ ΠΊΠ°Π½Π°Π»Π° (channel). Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСкс ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта ΠΈ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

for index, value := range collection {
    // Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°
}

while

Π¦ΠΈΠΊΠ» while модСлируСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ оставлСниСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ кондишСнСла Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°

for condition {
    // Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°
}

do-while

Π’ Go Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Ρ‚ прямой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ†ΠΈΠΊΠ»Π° do-while, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ бСсконСчный Ρ†ΠΈΠΊΠ» ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° break

for {
    // Π’Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°
 
    if !condition {
        break
    }
}

ВСтвлСния

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ самого стандартного вСтвлСния:

func main() {
    x := 10
 
    if x > 5 {
        fmt.Println("x большС 5")
    }
}

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ else-if:

func main() {
    age := 20
 
    if age < 18 {
        fmt.Println("Π’Ρ‹ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠ»Π΅Ρ‚Π½ΠΈΠΉ")
    } else if age >= 18 && age < 60 {
        fmt.Println("Π’Ρ‹ взрослый")
    } else {
        fmt.Println("Π’Ρ‹ ΠΏΠΎΠΆΠΈΠ»ΠΎΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ")
    }
}

Π’ Go Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ условныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (:=). Π­Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ условия if

func main() {
    if x := 5; x > 0 {
        fmt.Println("x ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число")
    } else if x < 0 {
        fmt.Println("x ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число")
    } else {
        fmt.Println("x Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ")
    }
}

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Бамая стандартная функция начинаСтся с конструкции func. Π”Π°Π»Π΅Π΅ слСдуСт имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΅Ρ‘ сигнатура, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΈΡ… Ρ‚ΠΈΠΏ. ПослС сигнатуры указываСтся Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния (Ссли Π΅ΡΡ‚ΡŒ).

Π’ Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выполняСтся повторяСмый ΠΊΠΎΠ΄. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ, Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ return

func sayHello() {
    fmt.Println("ΠŸΡ€ΠΈΠ²Π΅Ρ‚!")
}
 
func add(a, b int) int {
    return a + b
}

Π’Π°ΠΊ ΠΆΠ΅ функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сразу нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

func values() (int, int) {
	x := 3
	y := 4
 
	return x, y
}
 
horizontal, vertical := valuews()

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ достаточно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‘ имя, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ

sayHello() // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!"
 
result := add(3, 5) // ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 8

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Go ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ создаСтся копия значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ эта копия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

func increment(x int) {
    x = x + 1
    fmt.Println("Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:", x)
}
 
num := 5
increment(num)
fmt.Println("ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:", num)
 
// Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 6 - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ
// ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 5 - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ (Π½Π΅ ΠΌΡƒΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ ссылкС

Если трСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ эти измСнСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎ ссылкС (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ)

func incrementByReference(x *int) {
    *x = *x + 1
    fmt.Println("Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:", *x)
}
 
num := 5
incrementByReference(&num)
fmt.Println("ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:", num)
 
// Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 6
// ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 6

ΠžΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово defer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Когда функция содСрТит ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ defer, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ выполняСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° откладываСтся Π΄ΠΎ окончания выполнСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ°.

Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности defer:

  1. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ выполнСния: Если Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ нСсколько инструкций defer, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π² порядкС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΈΡ… объявлСнию.
  2. Π—Π°Ρ…Π²Π°Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²: АргумСнты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ defer, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈ объявлСнии defer.
  3. АргумСнты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π·Π°Ρ€Π°Π½Π΅Π΅: Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² defer, ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ измСнСниям Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° выполнСния ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ отлоТСнная функция всС Ρ€Π°Π²Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΈΡ… исходныС значСния, Π° Π½Π΅ значСния Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π°.
  4. Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ рСсурсами: defer часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для освобоТдСния рСсурсов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти рСсурсы Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ освобоТдСны нСзависимо ΠΎΡ‚ ΠΏΡƒΡ‚ΠΈ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
func readFile(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer file.Close()
 
    // Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
 
    return nil
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² file.Close() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ функция readFile(). Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ рСсурсов ΠΈ обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ бСзопасноС ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсами.

Π‘Ρ€Π΅Π·Ρ‹, массивы ΠΈ map

ΠœΠ°ΡΡΠΈΠ²Ρ‹

ОбъявлСниС ΠΈ использованиС массивов. ΠœΠ°ΡΡΠΈΠ²Ρ‹ хранят Π² сСбС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ

func main() {
	var arr [5]int // инициализация массива
	arr[1] = 5     // Π·Π°Π΄Π°Π½ΠΈΠ΅ значСния
 
	arr2 := [5]int{}
	arrWithValues := [5]int{1, 2, 3, 4}
}

Блайсы

Блайс - это динамичСский массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ количСства элСмСнтов

package main
 
import "fmt"
 
func main() {
	week := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8}
	weekend := week[6:8]
	fmt.Println(len(week))    // len ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ массива - 8
	fmt.Println(weekend)      // [6 7]
	fmt.Println(week[6:])     // [6 7 8]
	fmt.Println(cap(weekend)) // cap ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, сколько памяти ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ слайс
 
	animals := []string{}             // это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания слайса - Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива
	animals = append(animals, "lion") // Ρ‚ΡƒΡ‚ ΠΌΡ‹ добавляСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² слайс
 
	cars := make([]string, 5, 10) // Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ любого Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…
}

Блайс ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ особСнности ΠΏΡ€ΠΈ Π΅Π³ΠΎ использовании

package main
 
import "fmt"
 
func main() {
	a := []int{1}
	b := a[0:1] // Ρ‚ΡƒΡ‚ ΠΌΡ‹ связали слайсы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ сСйчас Π½Π°Ρ‡Π°Π»ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΎΠ΄ΠΈΠ½ массив
	b[0] = 0    // Π·Π°Π΄Π°Π»ΠΈ Π½ΠΎΠ»ΠΈΠΊ Π² стоковом массивС
 
	fmt.Println(a) // [0] - Π²Ρ‹ΡˆΠ΅Π» Π½ΠΎΠ»ΠΈΠΊ
	a[0] = 1       // помСняли стоковый массив Π½Π° 1
	fmt.Println(b) // [1] - Π²Ρ‹ΡˆΠ»Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡ΠΊΠ°
 
	a = append(a, 2)  // данная функция вмСстС с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ значСния Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ слайсы
	fmt.Println(a, b) // [1 2] [1] - Ρ‚ΡƒΡ‚ ΡƒΠΆΠ΅ слайсы стали ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ массивы
}

Map

ΠšΠ°Ρ€Ρ‚Π° - это ассоциативный массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ

ΠšΠ»ΡŽΡ‡ΠΈ ΠΈ значСния ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…

package main
 
import "fmt"
 
func main() {
	workdays := map[string]int{
		"monday":    1,
		"tuesday":   2,
		"wednesday": 3,
		"thursday":  4,
		"friday":    5,
	}
 
	workdays["saturday"] = 6
	workdays["sunday"] = 7
 
	day, ok := workdays["saturday"] // Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сущСствования ΠΊΠ»ΡŽΡ‡Π° - true
 
	if ok { // Ссли ΠΊΠ»ΡŽΡ‡ сущСствуСт
		fmt.Println(day)
	}
 
	delete(workdays, "sunday") // ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π°
 
	fmt.Println(workdays["tuesday"]) // 2
}

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

структуры

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° - это Π½Π°Π±ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Имя поля с Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ - экспортируСтся, со строчной - Π½Π΅ экспортируСтся ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π²Π½Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ

type Human struct {
    Name   string
    age    int
    Width  int
    Height int
}

Π”Π°Π»Π΅Π΅ Π² Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ экзСмпляр структуры Human

package main
 
import "fmt"
 
type Human struct {
	Name   string
	age    int
	Width  int
	Height int
}
 
func main() {
	person := Human{
		age:    20,
		Name:   "Valery",
		Height: 178,
		Width:  109,
	}
 
	fmt.Println(person)
}

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹

Базовая структура

type Person struct {
    Name string
    Age  int
}

ΠœΠ΅Ρ‚ΠΎΠ΄ - это функция, которая привязана ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ структурС. Π’ΠΎ Π΅ΡΡ‚ΡŒ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ структуру

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° структурС Person. НуТно ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ имя структуры указываСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² скобках - это рСсивСр (ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊ) - ΠΎΠ½ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊ структурС.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ называСтся GetName() ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля Name структуры Person. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ называСтся SetAge(age int) ΠΈ устанавливаСт ΠΏΠΎΠ»Π΅ Age структуры Person Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ age.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΌΡ‹ использовали ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ (ссылку) ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ структуры ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ Π½Π΅ использовали ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ имя

func (p Person) GetName() string {
    return p.Name
}
 
func (p *Person) SetAge(age int) {
    p.Age = age
}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ структуры ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр структуры ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π° этом экзСмплярС

person := Person{Name: "Alice", Age: 25}
 
name := person.GetName()   // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ GetName()
fmt.Println(name)         // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: Alice
 
person.SetAge(30)         // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ SetAge()
fmt.Println(person.Age)  // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: 30

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€

Иногда, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎ структурС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ запись ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ поля ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

type User struct {
	name, email string
	isConfirmed bool
}
 
func NewUser(name, email string) User {
	return User{
		email:       email,
		name:        name,
		isConfirmed: false,
	}
}
 
func main() {
	user := NewUser("Oleg", "oleg@yandex.ru")
 
	fmt.Println(user) // {Oleg oleg@yandex.ru false}
}

ВстраиваниС структуры

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, разбивая ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅

type Person struct {
	name       string
	Parameters Parameters
}
 
type Parameters struct {
	height int
	age    uint8
}

Π’Π°ΠΊ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ указания встроСнной структуры, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ поля ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ структурС Parameters, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Person

type Person struct {
	name       string
	Parameters
}
 
type Parameters struct {
	height int
	age    uint8
}

ЗанСсСниС структуры

param := Parameters{height: 178, age: 20}
person := Person{name: "Oleg", Parameters: param}

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ указатСля

Π’ Go ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ - это пСрСмСнная, которая содСрТит адрСс Π² памяти Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π§Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π° Ρ‚Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния адрСса ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

var x int = 10
var ptr *int = &x

Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ указатСля

Π’ Go ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ * ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для разымСнования указатСля ΠΈ доступа ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚.

fmt.Println(*ptr) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ptr (10)

ИзмСнСниС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ содСрТит адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для измСнСния значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ

*ptr = 20 // Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ptr
fmt.Println(x) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (20)

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° указатСля Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ссылкС Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ указатСля Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, измСнСния, сдСланныС Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ Π½Π° исходных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

func changeValue(ptr *int) {
    *ptr = 30 // Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ
}
 
var y int = 10
changeValue(&y) // ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° указатСля Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ y Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
fmt.Println(y) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (30)

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° указатСля Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ структуры. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° структуры позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ копирования Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

type Person struct {
    Name string
    Age  int
}
 
func changeName(p *Person, newName string) {
    p.Name = newName
}
 
var person1 = Person{"John", 25}
changeName(&person1, "Mike")
fmt.Println(person1.Name) // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ имя ("Mike")

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ интСрфСйса

Для создания интСрфСйса Π² Go Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ с Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбуСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс β€œShape” для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… гСомСтричСских Ρ„ΠΈΠ³ΡƒΡ€:

type Shape interface {
    Area() float64
    Perimeter() float64
}

ИспользованиС интСрфСйса

Π—Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ этот интСрфСйс. НапримСр, Π²ΠΎΡ‚ рСализация интСрфСйса β€œShape” для ΠΊΡ€ΡƒΠ³Π° ΠΈΠ»ΠΈ β€œSquare” для ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°:

type Circle struct {
    radius float64
}
 
func (c Circle) Area() float64 {
    return math.Pi * c.radius * c.radius
}
 
func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.radius
}
type Square struct {
    sideLength float64
}
 
func (s Square) Area() float64 {
    return s.sideLength * s.sideLength
}
 
func (s Square) Perimeter() float64 {
    return 4 * s.sideLength
}

ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ интСрфСйсу

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π² сСбя значСния ΠΏΠΎ интСрфСйсу

func PrintShapeDetails(s Shape) {
    fmt.Println("Area:", s.Area())
    fmt.Println("Perimeter:", s.Perimeter())
}
 
func main() {
    circle := Circle{radius: 5}
    square := Square{sideLength: 10}
 
    PrintShapeDetails(circle)
    PrintShapeDetails(square)
}

Π˜Ρ‚ΠΎΠ³

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, интСрфСйс - это структура, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для опрСдСлСния Π½Π°Π±ΠΎΡ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ интСрфСйсом, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ для структуры ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Ρ‘ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсу ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Ρ‚ΠΈΠΏΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ позволяСт Π½Π°ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Π²ΠΈΠ΄Π΅ интСрфСйса.

package main
 
import (
	"fmt"
	"math"
)
 
type Shape interface {
	Area() float64
	Perimeter() float64
}
 
type Square struct {
	sideLength float64
}
 
type Circle struct {
	radius float64
}
 
func (c Circle) Area() float64 {
	return math.Pi * c.radius * c.radius
}
 
func (c Circle) Perimeter() float64 {
	return 2 * math.Pi * c.radius
}
 
func (s Square) Area() float64 {
	return s.sideLength * s.sideLength
}
 
func (s Square) Perimeter() float64 {
	return 4 * s.sideLength
}
 
func printShapeDetails(s Shape) {
	fmt.Println("Area:", s.Area())
	fmt.Println("Perimeter:", s.Perimeter())
}
 
func main() {
	circle := Circle{radius: 10}
	square := Square{sideLength: 10}
 
	printShapeDetails(circle)
	printShapeDetails(square)
}

Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈ ΠΊΠ°Π½Π°Π»Ρ‹

Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹

Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ (goroutines) Π² Go - это лСгковСсныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π΅Π· явного создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов. Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ пространство адрСсов ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ сборщиком мусора, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… эффСктивными ΠΈ Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌΠΈ Π² использовании.

Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° - это функция, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ выполнСния

Для создания Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом go

func main() {
    go myFunc() // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹
    // ...
}
 
func myFunc() {
    // Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
}

Канал

ΠšΠ°Π½Π°Π»Ρ‹ (channels) слуТат для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΡŽ выполнСния ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссов. ΠšΠ°Π½Π°Π»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ β€œΡ‚Ρ€ΡƒΠ±Ρ‹β€, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Они ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ бСзопасный доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, прСдотвращая состояниС Π³ΠΎΠ½ΠΊΠΈ (race condition) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ синхронизации.

ΠšΠ°Π½Π°Π»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ

ΠšΠ°Π½Π°Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make

ch := make(chan int) // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° Ρ‚ΠΈΠΏΠ° int

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» Ρ‡Π΅Ρ€Π΅Π· ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ запись

var intChannel chan int // Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ здСсь Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ interface
intChannel <- 1
number := <- intChannel

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ значСния Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ <-:

ch <- value // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° значСния Π² ΠΊΠ°Π½Π°Π»
result := <-ch // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°

ΠšΠ°Π½Π°Π»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ записи, ΠΏΠΎΠΊΠ° другая Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Π° для ΠΎΠ±ΠΌΠ΅Π½Π°. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ состояниС Π³ΠΎΠ½ΠΊΠΈ (race condition) ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ бСзопасной для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Go ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ срСдства синхронизации, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ (mutexes) ΠΈ условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (condition variables), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ доступа ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам ΠΈ согласованиС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½.

Π‘ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈ Π½Π΅Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π»

НСбуфСризованный ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π² сСбя ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°. Если Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС ΠΊΠΎΠ΄Π° Π½Π΅ ΠΏΡ€ΠΎΡ‡Ρ‚Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π½Π΅Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π½Π΅ Π½Π°Ρ‡Π½ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ

ch := make(chan int)

Π‘ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» Π² сСбС ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠΆΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π½Π°ΠΌΠΈ количСство ячССк ΠΏΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Π΅. Он Ρ‚Π°ΠΊ ΠΆΠ΅ блокируСтся, ΠΊΠΎΠ³Π΄Π° мСсто ΠΏΠΎΠ΄ значСния кончаСтся. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π½Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ, Ρ‚ΠΎ мСсто ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ освобоТдаСтся.

ch := make(chan int, 5)

ИспользованиС Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ ΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ²

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаём ΠΊΠ°Π½Π°Π» resultChan, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² сСбя всС просуммированныС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹. Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ· этого ΠΊΠ°Π½Π°Π»Π° ΠΌΡ‹ достаём ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    resultChan := make(chan int)
 
    for _, num := range numbers {
        go square(num, resultChan)
    }
 
    total := 0
    for i := 0; i < len(numbers); i++ {
        total += <-resultChan
    }
 
    fmt.Println("Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² чисСл:", total)
}
 
func square(num int, resultChan chan<- int) {
    square := num * num
    resultChan <- square
}

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

Ошибки

Errors: Π’ Go ошибки ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ интСрфСйсом error, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Он ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ Error() string, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ описаниС ошибки. ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² качСствС значСния послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибок (Error Checking): Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ошибок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ if ΠΈΠ»ΠΈ switch. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

result, err := SomeFunction()
if err != nil {
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибки
} else {
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°
}

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ошибок (Returning Errors): Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Go ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ значСниями. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ нСпосрСдствСнно. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

func SomeFunction() (int, error) {
    // ...
    if someCondition {
        return 0, errors.New("some error")
    }
    // ...
    return result, nil
}

Ошибки ΠΊΠ°ΠΊ значСния (Errors as Values): Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Go ошибки ΡΠ²Π»ΡΡŽΡ‚ΡΡ значСниями, Π° Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ. Они Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ явно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΠΊΠΎΠ΄ΠΎΠΌ.

Паники

Паника (Panic): Паника - это ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ошибка, которая ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ остановкС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Когда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠ°Π½ΠΈΠΊΠ°, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ останавливаСтся, ΠΈ выводится стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (stack trace). Паника ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ доступС ΠΊ nil-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π° ноль.

ВосстановлСниС (Recover): Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ остановку ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΠ°Π½ΠΈΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ восстановлСния (recover). Recover ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… функциях (deferred functions). Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° interface{} ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΏΠ°Π½ΠΈΠΊΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° управлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

func main() {
    defer func() {
        if r := recover(); r != nil {
            // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ°Π½ΠΈΠΊΠΈ
        }
    }()
    // ...
    panic("something went wrong")
    // ...
}

Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ восстановлСниС (Simplified Recovery): Π’ Go 1.13 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ восстановлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°Π½ΠΈΠΊΡƒ Π² ΠΎΠ΄Π½ΠΎΠΉ инструкции.

func main() {
    // ...
    if r := recover(); r != nil {
        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ°Π½ΠΈΠΊΠΈ
    }
    // ...
}

ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹

ВСстированиС

Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΡΠ΅Ρ‚ΡŒΡŽ

Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€ΠΎΡ‡Π΅Π΅

Π’Π΅Π±-сСрвСр Π½Π° Golang

Π‘Π°ΠΌΡ‹ΠΉ простой Π²Π΅Π±-сСрвСр:

package main
 
import (
	"log"
	"net/http"
)
 
func Handler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello world!\n"))
}
 
func main() {
	http.HandleFunc("/", Handler)
 
	log.Println("Start server on PORT:8081")
	log.Fatal(http.ListenAndServe(":8081", nil))
}

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΈ запуск Π²Π΅Π±-сСрвСра ΠΏΠΎΠ΄ Windows ΠΈ Linux

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ОБ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния GOOS ΠΈ GOARCH