🦫 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Go для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 8. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, Ρ€ΡƒΠ½Ρ‹, Π±Π°ΠΉΡ‚Ρ‹. ΠŸΠ°ΠΊΠ΅Ρ‚ strings. Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° (map)

Π Π°Π½Π΅Π΅ Π² ΡƒΡ€ΠΎΠΊΠ΅ ΠΏΡ€ΠΎ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ познакомились со строками, Ρ€ΡƒΠ½Π°ΠΌΠΈ ΠΈ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ наши знания ΠΎΠ± этих Ρ‚ΠΈΠΏΠ°Ρ…, рассмотрим ΠΏΠ°ΠΊΠ΅Ρ‚ strings ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

НСмного ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ…

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

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ стандартом являСтся ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Unicode ΠΈΠ· 1 114 112 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π½Π° 17 Π±Π»ΠΎΠΊΠΎΠ² ΠΏΠΎ 65 536 символов. ВсС ΠΎΠ½ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии с приставкой Β«U+Β». НапримСр, латинская Π±ΡƒΠΊΠ²Π° Β«aΒ» ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ΄ Β«U+0061Β», русская Π±ΡƒΠΊΠ²Π° «я» записана ΠΊΠ°ΠΊ Β«U+044FΒ».

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Go опрСдСляСтся ΠΊΠ°ΠΊ тСкст Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-8 (Unicode Transformation Format, 8-bit) – стандарт ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ³ΠΎ хранСния символов Unicode, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ с ASCII ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ символы Ρ€Π°Π·Π½Ρ‹ΠΌ количСством Π±Π°ΠΉΡ‚ΠΎΠ². К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² UTF-8 латинский Π°Π»Ρ„Π°Π²ΠΈΡ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ ΠΎΠ΄Π½ΠΈΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ, Π° ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π° – двумя. Данная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ вычислСнии Π΄Π»ΠΈΠ½Ρ‹ строк, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ ознакомлСния с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ «Как Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ тСкста».

πŸ‘¨β€πŸ’» Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Go Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Go Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Β»
πŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Go для собСса
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Go Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Go для собСса»
🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Go
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Go для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ GoΒ»

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ

Π‘Π°ΠΉΡ‚Ρ‹ ΠΈ Ρ€ΡƒΠ½Ρ‹

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… byte Π² Go прСдставляСт псСвдоним для Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ 8-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ цСлочислСнного Ρ‚ΠΈΠΏΠ° uint8. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ значСния ΠΎΡ‚ 0 Π΄ΠΎ 255, поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для прСдставлСния ASCII-символов. Блайсы Π±Π°ΠΉΡ‚ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π·Π° счСт своСй ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ гибкости.

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… rune опрСдСляСтся ΠΊΠ°ΠΊ псСвдоним для Ρ‚ΠΈΠΏΠ° int32. Π ΡƒΠ½Π° соотвСтствуСт ΠΊΠΎΠ΄Ρƒ символа Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Unicode. Π’Π°ΠΊ, Ρ‚ΠΈΠΏ символа Β΅ Π΅ΡΡ‚ΡŒ Ρ€ΡƒΠ½Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0x00b5.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ строк, рассмотрим понятиС строкового Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π» – это константа Ρ‚ΠΈΠΏΠ° string, которая являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ слияния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов. Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ² – ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ (ΠΈΠ»ΠΈ сырыС).

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ - это символы, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π²ΠΈΠ΄Π° "". ВСкст Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ прСдставляСт собой ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ UTF-8 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… символов. НапримСр, символ Β΅ ΠΈ Π΅Π³ΠΎ записи \xc2\xb5, \u00b5, \U000000B5 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° 0xc2 0xb5 символа U+00B5 (Β΅) Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ UTF-8:

symbol := "Β΅"
fmt.Println("\\xc2\\xb5") // Β΅
fmt.Println("\\u00b5") // Β΅
fmt.Println("\\U000000B5") // Β΅
fmt.Printf("%x", symbol) // c2b5

НСобработанныС (сырыС) Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ – это символы, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π²ΠΈΠ΄Π° ``. Π˜Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся строка ΠΈΠ· нСявно Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² UTF-8 символов. Π’ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°Ρ…, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки осущСствляСтся явно с использованиСм enter, Π° символ \n Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния.

Под строками Π² Go ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹. Π’ дальнСйшСм Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‡Π°Ρ‰Π΅ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ….

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² Go ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ². Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ строки Π΅ΡΡ‚ΡŒ Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ слайс Π±Π°ΠΉΡ‚ΠΎΠ² ([]byte). ИмСнно ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ индСксу строки Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π΅ символ, Π° Π΅Π³ΠΎ юникод-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² дСсятичной систСмС счислСния:

rusText := "тСкст"
fmt.Println(rusText[0], rusText[1]) // 209 130 
// 209 = D1 ΠΈ 130 = 82 Π² 16-Ρ€ΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии,
// D1 82 являСтся ΠΊΠΎΠ΄ΠΎΠΌ Π±ΡƒΠΊΠ²Ρ‹ "Ρ‚" Π² UTF-8

Π‘Ρ€Π΅Π· [i:j] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ строку, которая состоит ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ² исходной, начиная с индСкса i ΠΈ заканчивая индСксом j, Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Π΅Π³ΠΎ:

str := "тСкст"
fmt.Println(str[0:2]) // Ρ‚
fmt.Println(str[0:1]) // οΏ½

Π’ послСднСй строкС Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ странный символ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция fmt.Println пытаСтся Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ строки str[0:1], Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ СдинствСнный Π±Π°ΠΉΡ‚ 0xd1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ соотвСтствуСт Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ символу Π² UTF-8. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ символ с ΠΊΠΎΠ΄ΠΎΠΌ 0xfffd.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ сравнСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ производится ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ ΠΈ ΠΏΠΎ Π±Π°ΠΉΡ‚Π°ΠΌ:

str1 := "Π‘ΡƒΠΊΠ²Π°Ρ€ΡŒ"
str2 := "Π‘ΡƒΠΊΠ²Π°"
fmt.Println(str1 > str2) // true

str1 = "ΠšΠΎΡ‚"
str2 = "ΠΊΠΎΡ‚"
fmt.Println(str1 == str2) // false

str1 = "ΠΊΠΎΠ΄"
str2 = "ΠΊΠΎΡ‚"
fmt.Println(str1 > str2)  // false
fmt.Println([]byte(str1)) // [208 186 208 190 **208** 180]
fmt.Println([]byte(str2)) // [208 186 208 190 **209** 130]

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками – конкатСнация ΠΈ интСрполяция.

ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ – это опСрация слияния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Ρ‡Π°Ρ‰Π΅ всСго строк) Π² ΠΎΠ΄ΠΈΠ½.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡ – это опСрация Π·Π°ΠΌΠ΅Π½Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΉ строки ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями.

Как ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, конкатСнация строк Π² Go рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° +:

// ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строк Π² Go
str1 := "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, "
str2 := "ΠΌΠΈΡ€!"
fmt.Println(str1 + str2) // ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!

Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡ Π² Go Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Π² динамичСских языках. Она осущСствляСтся с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚Π° fmt:

// ΠΏΡ€ΠΈΠΌΠ΅Ρ€ интСрполяции строк Π² Go
hour := 12
minute := 35
second := 50
time := fmt.Sprintf("ВрСмя %d:%d:%d", hour, minute, second)
fmt.Printf("Π”Π°Ρ‚Π° %d-%d-%d\\n", 28, 12, 2023) // Π”Π°Ρ‚Π° 28-12-2023
fmt.Println(time) // ВрСмя 12:35:50

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ Ρ€ΡƒΠ½Π°ΠΌ

Π¦ΠΈΠΊΠ» for-range ΠΏΠΎ строкС Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ Ρ€ΡƒΠ½Ρƒ Π² UTF-8:

rusText := "тСкст"
for idx, char := range rusText {
	fmt.Printf("Π ΡƒΠ½Π°: %#U с индСксом %d\\n", char, idx)
}
fmt.Println("Π”Π»ΠΈΠ½Π° строки:", len(rusText))

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Unicode прСдставлСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа строки ΠΈ Π΅Π³ΠΎ индСкс:

Π ΡƒΠ½Π°: U+0442 'Ρ‚' с индСксом 0
Π ΡƒΠ½Π°: U+0435 'Π΅' с индСксом 2
Π ΡƒΠ½Π°: U+043A 'ΠΊ' с индСксом 4
Π ΡƒΠ½Π°: U+0441 'с' с индСксом 6
Π ΡƒΠ½Π°: U+0442 'Ρ‚' с индСксом 8
Π”Π»ΠΈΠ½Π° строки: 10

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ каТдая Ρ€ΡƒΠ½Π° здСсь Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π±Π°ΠΉΡ‚Π°, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ функция len() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Π±Π°ΠΉΡ‚ΠΎΠ², Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… строкой, Π° Π½Π΅ количСство символов, Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π° строки Π² Π΄Π²Π° Ρ€Π°Π·Π° большС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ – 10 вмСсто 5. Π’ Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² UTF-8 ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π±Π°ΠΉΡ‚Π°, Π° Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ язык Go ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ρ‚ΠΎ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ обоснованный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π‘ латинскими символами всё Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π°Ρ‡Π΅:

engText := "text"
for idx, char := range engText {
	fmt.Printf("Π ΡƒΠ½Π° %#U с индСксом %d\\n", char, idx)
}
fmt.Println("Π”Π»ΠΈΠ½Π° строки:", len(engText))

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ значСния индСксов ΠΈ Π΄Π»ΠΈΠ½Ρ‹:

Π ΡƒΠ½Π° U+0074 't' с индСксом 0
Π ΡƒΠ½Π° U+0065 'e' с индСксом 1
Π ΡƒΠ½Π° U+0078 'x' с индСксом 2
Π ΡƒΠ½Π° U+0074 't' с индСксом 3
Π”Π»ΠΈΠ½Π° строки: 4

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС для получСния ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ строки слСдуСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² слайс Ρ€ΡƒΠ½ ΠΈΠ»ΠΈ ΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ utf8.RuneCountInString() ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° unicode/utf8:

str := "тСкст"
ln := len(str) // 10
correctLen1 := utf8.RuneCountInString(str) // 5
correctLen2 := len([]rune(str)) // 5

Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строки Π² слайс Ρ€ΡƒΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ памяти, Ρ‡Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ utf8.RuneCountInString(). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ Π±Π°ΠΉΡ‚Π°ΠΌ (индСксам)

Как Π±Ρ‹Π»ΠΎ рассмотрСно Ρ€Π°Π½Π΅Π΅, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎ индСксам строки выдаст Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ΅ прСдставлСниС символов. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ сохраняСтся ΠΏΡ€ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ:

rusText := "тСкст"
for i := 0; i < len(rusText); i++ {
	fmt.Printf("%v ", rusText[i])
}
fmt.Println()
// Ρ†ΠΈΠΊΠ» для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° 10-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±Π°ΠΉΡ‚ΠΎΠ² Π² 16-Ρ€ΠΈΡ‡Π½Ρ‹Π΅
for i := 0; i < len(rusText); i++ {
	fmt.Printf("%x ", rusText[i])
}

Π’ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ строкС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ дСсятичноС прСдставлСниС Π½ΠΈΠΆΠ½ΠΈΡ… 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ символов строки Π² UTF-8:

209 130 208 181 208 186 209 129 209 130 
d1  82  d0  b5  d0  ba  d1  81  d1  82

Π§Ρ‚ΠΎΠ±Ρ‹ вывСсти ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ символы строки, Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ fmt.Printf ΠΈ спСцификатором %c:

str := "тСкст"
for _, sym := range str {
	fmt.Printf("%c ", sym) // Ρ‚ Π΅ ΠΊ с Ρ‚
}

ΠŸΠ°ΠΊΠ΅Ρ‚ strings

ΠŸΠ°ΠΊΠ΅Ρ‚ string стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ содСрТит ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…:

  • ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ символа Π² строку – strings.Count(s, substr string) int:
str := "ΠΏΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!"
strings.Count(str, "ΠΈ") // 2
  • Π—Π°ΠΌΠ΅Π½Π° символов – strings.Replace(s, old, new string, n int) string:
// послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - количСство Π·Π°ΠΌΠ΅Π½
// Ссли ΠΎΠ½ < 0, Ρ‚ΠΎ Π»ΠΈΠΌΠΈΡ‚Π° Π½Π° количСство Π·Π°ΠΌΠ΅Π½ Π½Π΅Ρ‚
str := "ΠΏΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!!!"
a := strings.Replace(str, "!", "?", -1) // "ΠΏΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€???"
b := strings.Replace(a, "?", "!", 2)    // "ΠΏΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!!?"
  • Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ символов ΠΏΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ sep – strings.Split(s, sep string) []string:
str := "ΠΏΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!!!"
a := strings.Split(str, ",") // [ΠΏΡ€ΠΈΠ²Π΅Ρ‚  ΠΌΠΈΡ€!!!]
fmt.Println(a[0]) // ΠΏΡ€ΠΈΠ²Π΅Ρ‚
  • БлияниС строк с Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ sep – strings.Join(elems []string, sep string) string:
str := []string{"01", "01", "2024"}
strings.Join(str, "-") // 01-01-2024
  • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ символов ΠΊ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ рСгистру – strings.ToLower(s string) ΠΈΠ»ΠΈ strings.ToUpper(s string):
str := "ΠŸΡ€ΠΎΡΡ‚ΠΎ Π‘Ρ‚Ρ€ΠΎΠΊΠ°"
strings.ToLower(str) // просто строка
strings.ToUpper(str) // ПРОБВО БВРОКА

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ strings ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠŸΡƒΡΡ‚ΡŒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ большого количСства строк. Π”Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° + нСэффСктивно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ новая строка. Π’ этой ситуации стоит Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ структурой Builder ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° strings:

// количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Ρ€Π°Π·Ρ‹ большС
sb := strings.Builder{}
for i := 0; i < 8; i++ {
	sb.WriteString("q")
}
sb.WriteString("end")
fmt.Println(sb.String()) // qqqqqqqqend

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°

ПослС знакомства со строками, Ρ€ΡƒΠ½Π°ΠΌΠΈ ΠΈ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π΅Ρ‘ поиск.

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° – это структура Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ интСрфСйс ассоциативного массива. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ½Π° выполняСт Ρ‚Ρ€ΠΈ основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ поиск ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ примСнСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту, которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡ Π² индСкс ячСйки для записи Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Доступ ΠΊ элСмСнту Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ производится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ вычислСния Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ индСксом ячСйки с искомым элСмСнтом.

Наглядная ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

Битуация, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ…Π΅Ρˆ-функция ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ индСкс, называСтся ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠ΅ΠΉ. Π§Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Ρ…Π΅Ρˆ-функция, Ρ‚Π΅ΠΌ мСньшС Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ возникновСния ΠΈ количСство ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ.

БущСствуСт Π΄Π²Π° основных ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ:

  • ΠœΠ΅Ρ‚ΠΎΠ΄ списков

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² связывании ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ-список. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС врСмя поиска Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π΄Π»ΠΈΠ½Π΅ списка. ΠΠ°ΠΈΡ…ΡƒΠ΄ΡˆΠ΅ΠΉ ситуациСй являСтся Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх n ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ячСйкС.

  • ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсации

Π’ этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ всС ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты хранятся Π² самой Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±Π΅Π· использования списков. ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ производится поиск свободной ячСйки для вставки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ элСмСнта.

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° (map) Π² Go

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ† Π² Go. Для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ погруТСния Π² Ρ‚Π΅ΠΌΡƒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹: исходный ΠΊΠΎΠ΄ map, Effective Go: Maps, ΠœΠ°ΠΏΡ‹ Π² Go: ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Pro.

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Go (Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‘ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ map, ΠΌΠ°ΠΏΠ°, ΠΊΠ°Ρ€Ρ‚Π°) опрСдСляСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом map ΠΈ создаСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… способов, Π³Π΄Π΅ keys_type – Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, values_type – Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

  • ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ способ – с использованиСм make:
mp := make(map[keys_type]values_type)
  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова var создаСтся nil-map:
var mp map[keys_type]values_type

Π‘ этим способом Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹ΠΌ. Если послС Ρ‚Π°ΠΊΠΎΠ³ΠΎ создания ΠΌΠ°ΠΏΡ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ panic:

var mp map[string]int
mp["key"] = 1 // panic: assignment to entry in nil map
  • Π‘ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ элСмСнтов Π² скобках:
mp := map[keys_type]values_type{
	key1: val1,
	key2: val2,
}

ΠŸΡ€ΠΈ этом стоит ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сравнимыС (comparable) Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…: числовыС (int, float, complex), string, bool, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, интСрфСйс, ΠΊΠ°Π½Π°Π» ΠΈ структуры ΠΈΠ»ΠΈ массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этих Ρ‚ΠΈΠΏΠΎΠ².

ΠΠ°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠ°ΠΏΡƒ, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π½Π΅ΠΉ:

  1. Вставка: mp[key] = value
  2. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅: delete(mp, key)
  3. Поиск: value := mp[key]

Если Π² ΠΌΠ°ΠΏΠ΅ Π½Π΅ окаТСтся искомого значСния, Ρ‚ΠΎ вСрнСтся Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°:

mp := map[int]string{
	1: "a",
}
value := mp[2]
fmt.Println(value) // ""

Но стоит ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ nil, Ссли Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΆΠ΅ являСтся nil.

Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия элСмСнта Π² ΠΌΠ°ΠΏΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ мноТСствСнноС присваиваниС. Π’ этом случаС возвращаСтся ΠΏΠ°Ρ€Π° – само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ булСвая пСрСмСнная. Если ΠΎΠ½Π° Ρ€Π°Π²Π½Π° true, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ присутствиС искомого элСмСнта Π² ΠΌΠ°ΠΏΠ΅, ΠΈΠ½Π°Ρ‡Π΅ – Π΅Π³ΠΎ отсутствиС:

mp := map[int]string{
	1:"a",
}
if _, ok := mp[2]; !ok {
	fmt.Println("НС найдСно") // НС найдСно
}

Мапа Π² Go являСтся нСупорядочСнной структурой Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΅Ρ‘ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ Π² Ρ†ΠΈΠΊΠ»Π΅ Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ запуска ΠΊ запуску. Π§Ρ‚ΠΎΠ±Ρ‹ Π² этом ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, запуститС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ нСсколько Ρ€Π°Π·:

mp := map[int]string{
	0: "a",
	1: "b",
	2: "c",
	3: "d",
}
for i := range mp {
	fmt.Println(mp[i])
}

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΌΠ°ΠΏΡ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΌΠ°ΠΏΡ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ changeMap, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠ°ΠΏΡƒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π½Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

func changeMap(map2 map[int]string) {
	map2[1] = "d"
}

func main() {
	mp := map[int]string{
		0: "a",
		1: "b",
		2: "c",
	}
	changeMap(mp)
	fmt.Println(mp) // map[0:a 1:d 2:c]
}

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ 1 ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎ своё Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

НС стоит Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ°ΠΏΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Π»Π°ΡΡŒ ΠΏΠΎ ссылкС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Go Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ отсутствуСт. Всё Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ°ΠΏΠ° Π² Go являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° структуру hmap:

// A header for a Go map.
type hmap struct {
	// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.
	// Make sure this stays in sync with the compiler's definition.
	count     int // # live cells == size of map.  Must be first (used by len() builtin)
	flags     uint8
	B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
	noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
	hash0     uint32 // hash seed

	buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
	oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
	nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)

	extra *mapextra // optional fields
}

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ map2 Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ changeMap объявлялась с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ make:

func changeMap(map2 map[int]string) {
	map2 = make(map[int]string)
	map2[1] = "d"
	fmt.Println("Мапа map2 в changeMap:", map2)
}

func main() {
	mp := map[int]string{
		0: "a",
		1: "b",
		2: "c",
	}
	changeMap(mp)
	fmt.Println("Мапа mp в main:", mp) // map[0:a 1:d 2:c]
}

Π’ Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ map2 Π² changeMap отличаСтся ΠΎΡ‚ mp Π² main:

Мапа map2 в changeMap: map[1:d]
Мапа mp в main: map[0:a 1:b 2:c]

Π’ этом случаС ΠΌΠ°ΠΏΠ° mp пСрСдаСтся ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² changeMap, поэтому Π½Π΅ мСняСтся. ВсС измСнСния коснутся Π΅Ρ‘ локальной ΠΊΠΎΠΏΠΈΠΈ map2, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ созданиС ΠΌΠ°ΠΏΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ make ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ hmap.

ΠŸΠΎΠ΄Π²Π΅Π΄Ρ‘ΠΌ ΠΈΡ‚ΠΎΠ³ΠΈ

Π’ этой части самоучитСля ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ… ΠΈ ΠΈΡ… особСнностях, Π½Π° основС этих Π·Π½Π°Π½ΠΈΠΉ довольно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ устройство строк Π² Go ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ strings, Π° Π² Π±Π»ΠΎΠΊΠ΅ ΠΏΡ€ΠΎ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ познакомились с эффСктивным способом хранСния ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ, рассмотрСли структуру Π΄Π°Π½Π½Ρ‹Ρ… map Π² Go.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования ΠΈ Π΅Π³ΠΎ основных ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ…: структур, интСрфСйсов ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

***

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ самоучитСля

  1. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ ΠΈ сфСра примСнСния Go, установка, настройка
  2. РСсурсы для изучСния Go с нуля
  3. ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π°. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π’Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ тСкста.
  4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… прСобразования. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
  5. УсловныС конструкции if-else ΠΈ switch-case. Π¦ΠΈΠΊΠ» for. Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΈ бСсконСчныС Ρ†ΠΈΠΊΠ»Ρ‹
  6. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ΠžΠ±Π»Π°ΡΡ‚ΠΈ видимости. РСкурсия. Defer
  7. ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΈ слайсы. Append ΠΈ сopy. ΠŸΠ°ΠΊΠ΅Ρ‚ slices
  8. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, Ρ€ΡƒΠ½Ρ‹, Π±Π°ΠΉΡ‚Ρ‹. ΠŸΠ°ΠΊΠ΅Ρ‚ strings. Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° (map)
  9. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП
  10. НаслСдованиС, абстракция, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, инкапсуляция
  11. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок. Паника. ВосстановлСниС. Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
  12. ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ
  13. Π Π°Π±ΠΎΡ‚Π° с Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. ΠŸΠ°ΠΊΠ΅Ρ‚ time
  14. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. БуфСризация. Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ io, bufio, os
  15. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ. Π“ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹. ΠšΠ°Π½Π°Π»Ρ‹
  16. ВСстированиС ΠΊΠΎΠ΄Π° ΠΈ Π΅Π³ΠΎ Π²ΠΈΠ΄Ρ‹. Table-driven ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ тСсты
  17. ΠžΡΠ½ΠΎΠ²Ρ‹ сСтСвого программирования. Π‘Ρ‚Π΅ΠΊ TCP/IP. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹. ΠŸΠ°ΠΊΠ΅Ρ‚ net
  18. ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» HTTP. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ HTTP-сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠŸΠ°ΠΊΠ΅Ρ‚ net/http

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
04 октября 2018

ΠŸΠΎΠΌΠ½ΠΈΡ‚ΡŒ всС: дСлимся Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠΎΠΉ ΠΏΠΎ Python

ΠœΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎ ΠΏΡ€Π°Π²Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
22 апрСля 2017

Английский язык для IT-спСциалистов

ВсСм людям, Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ связанным с IT сфСрой, прСкрасно извСстно, Ρ‡Ρ‚ΠΎ Ρ€Π°...
admin
29 января 2017

Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹: ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΠ½ΠΈΠ³ΠΈ, Π²Π΅Π±-сайты, ΠΎΠ½Π»Π°ΠΉΠ½-курсы ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

Π’ этой ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠ΅ прСдставлСн список ΠΊΠ½ΠΈΠ³, Π²Π΅Π±-сайтов ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½-курсов, Π΄Π°ΡŽΡ‰ΠΈΡ…...