🦫 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Go для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 12. ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ

Π’ этой части самоучитСля ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования ΠΈ Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² языкС Go, Π½Π° практичСском ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ рассмотрим Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΈ ΠΈΡ… основныС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ€Π΅ΡˆΠΈΠΌ нСсколько интСрСсных Π·Π°Π΄Π°Ρ‡ для закрСплСния ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°.

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (ОП) прСдставляСт собой ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, которая позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, способный Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π”ΠΎ вСрсии 1.18 Π² Go Π±Ρ‹Π»ΠΎ нСсколько способов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования:

  1. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйсов, конструкций switch-case ΠΈ привСдСния Ρ‚ΠΈΠΏΠΎΠ².
  2. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° reflect, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ runtime-рСфлСксии, позволяя Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². РСфлСксия – это ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ структуру, Π² частности, Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΈΠΏΡ‹.
  3. ΠŸΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ.

На протяТСнии Π΄ΠΎΠ»Π³ΠΈΡ… Π»Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ самим Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ОП Π² Go. Волько Π² вСрсии 1.18, Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ Π² ΠΌΠ°Ρ€Ρ‚Π΅ 2022 Π³ΠΎΠ΄Π°, Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ОП, Ρ‡Ρ‚ΠΎ стало самым Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° выпуска языка. Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ, ΠΊΠ°ΠΊ ΠΈ прСдставлСнныС Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‚ свои прСимущСства ΠΈ нСдостатки ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌΠΎΠΉ споров Π² сообщСствС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

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

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ

ΠžΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ ОП ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ – это способ написания ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ сущностям ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ основныС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Допустим, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ нас попросили Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ суммирования цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠ°ΠΏΡ‹ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° string. ПослС освоСния всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… частСй самоучитСля это Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ особого затруднСния:

func SumMapValues(mp map[string]int) int {
	var sum int
	for _, val := range mp {
		sum += val
	}
	return sum
}

Бпустя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» прилоТСния Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠ»ΡΡ, ΠΈ появилась Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для суммирования Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° float64 ΠΌΠ°ΠΏΡ‹ с цСлочислСнными ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ. НС Π±Π΅Π΄Π°, Π½ΡƒΠΆΠ½ΠΎ всСго лишь ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ SumMapValues, ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Но Π² дальнСйшСм ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция SumMapValues ΠΌΠΎΠ³Π»Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со значСниями ΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², поэтому примСняСмый Π½Π°ΠΌΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ лишь ΠΊ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ошибкам. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΠΎ, ΠΎΠ½ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ПО ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ DRY (don`t repeat yourself – Π½Π΅ повторяй сСбя).

Π‘Π°ΠΌΠΎΠ΅ врСмя ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с использованиСм Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° Π½Π΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

func SumMapValues[K comparable, V int64 | float64](mp map[K]V) V {
	var sum V
	for _, val := range mp {
		sum += val
	}
	return sum
}

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ нСсколько ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ. Π‘Π°ΠΌΠΎΠ΅ явноС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Β«Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹Β» ΠΈΠ»ΠΈ Β«Ρ‚ΠΈΠΏΡ‹ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹Β» (type parameters). Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚ΠΈΠΏ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ type parameters прСдставлСны символами K ΠΈ V ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π° comparable ΠΈ int64 | float64 соотвСтствСнно, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ type constraint.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово comparable – это ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ интСрфСйс для описания Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… сравнСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² == ΠΈ !=. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ comparable Ρ‚ΠΈΠΏΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ bool, int, float, string ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Comparable Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ слайсы, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠ°ΠΏΡ‹ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ условиями.

Π’ вСрсии 1.18 ΠΏΠΎΠΌΠΈΠΌΠΎ comparable Π±Ρ‹Π» Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ интСрфСйс any – псСвдоним для interface{}, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ любой Ρ‚ΠΈΠΏ.

Type constraint

Π’ Go type constraint Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ· сСбя интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π½Π°Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΎΠ² (type set), Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΈΠΏΡ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ этого интСрфСйса.

Π§Ρ‚ΠΎΠ±Ρ‹ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ type constraints, Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ нашС прСдставлСниС ΠΎΠ± интСрфСйсах. Π”ΠΎ ввСдСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ОП Π² спСцификации Go ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π»ΠΎΡΡŒ ΡƒΠΆΠ΅ извСстноС Π½Π°ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: Ρ‚ΠΈΠΏ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ интСрфСйса, удовлСтворяСт Π΅ΠΌΡƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ вмСсто ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ принято ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ соглашСниС: Ρ‚ΠΈΠΏ, входящий Π² Π½Π°Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΎΠ² интСрфСйса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ этот интСрфСйс. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ T удовлСтворяСт интСрфСйсу Inter ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· условий:

  1. Type set T являСтся подмноТСством type set Inter, ΠΏΡ€ΠΈ этом T являСтся интСрфСйсом.
  2. T содСрТится Π² type set Inter, ΠΏΡ€ΠΈ этом T Π½Π΅ являСтся интСрфСйсом.

Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС элСмСнт интСрфСйса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСн трСмя способами: ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ T, Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ~T ΠΈ объСдинСниСм Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΈΠ΄Π° type1 | type2 | … | typeN. Рассмотрим ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· этих ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:

  • НазначСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° T понятно ΠΈΠ· Π΅Π³ΠΎ названия, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ любой Ρ‚ΠΈΠΏ. Π‘ Π½ΠΈΠΌ ΠΌΡ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SumMapValues.
  • Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ~T содСрТит Ρ‚ΠΎΠΊΠ΅Π½ Ρ‚ΠΈΠ»ΡŒΠ΄Π° ("~"), Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π² вСрсии 1.18, ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΎΠ², Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся T. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅ Ρ‚ΠΈΠΏ int являСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ для Ρ‚ΠΈΠΏΠ° ImplementSome, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс SomeInterface:
// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ для обозначСния всСх Ρ‚ΠΈΠΏΠΎΠ² с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ int, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ SomeMethod()
type SomeInterface interface {
	~int
	SomeMethod()
}

type ImplementSome int

func (is ImplementSome) SomeMethod() {
	// рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
}
  • ОбъСдинСниС Ρ‚ΠΈΠΏΠΎΠ² опрСдСляСт ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ всСх Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌ интСрфСйсом. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс Values с объСдинСниСм Ρ‚ΠΈΠΏΠΎΠ² int64 ΠΈ float64, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выступит Π² качСствС type constraint Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠ°ΠΏΡ‹ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ запись int64 | float64:
type Values interface {
	int64 | float64
}

func SumMapValues[K comparable, V Values](mp map[K]V) V {}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ записи ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ прСдставлСнным Π½ΠΈΠΆΠ΅, нСдопустимы:

type CustomFloat float64

type InvalidInterface interface {
	T                      // ошибка: T - type parameter
	string | ~T            // ошибка: ~T - type parameter
	~float64 | CustomFloat // ошибка: ~float64 Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ CustomFloat
	~error                 // ошибка: error являСтся интСрфСйсом
}

var FloatVar Float           // ошибка
var comparableVar comparable // ошибка

type FloatType Float         // ошибка

type FloatStruct struct {
	flt Float // ошибка
}

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ интСрфСйс Float являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° constraints, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ языка собрали часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ограничСния. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…:

// // Float допускаСт любой вСщСствСнный Ρ‚ΠΈΠΏ
type Float interface {
	~float32 | ~float64
}

// Integer допускаСт любой цСлочислСнный Ρ‚ΠΈΠΏ
type Integer interface {
	Signed | Unsigned
}

// Ordered допускаСт любой Ρ‚ΠΈΠΏ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния (<, <, <=, >=)
type Ordered interface {
	Integer | Float | ~string
}

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ type inference

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ рассмотрСниС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ОП Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SumMapValues. Π’Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π΅Ρ‘ для Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ°ΠΏ, явно ΡƒΠΊΠ°Π·Π°Π² Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…:

func main() {
	mapFloat := map[string]float64{
		"1": 1.5,
		"2": 2.5,
	}

	mapInt := map[string]int64{
		"1": 10,
		"2": 20,
	}

	sumMapFloat := SumMapValues[string, float64](mapFloat)
	sumMapInt := SumMapValues[string, int64](mapInt)

	fmt.Println("mapFloat:", sumMapFloat) // mapFloat: 4
	fmt.Println("mapInt:", sumMapInt)     // mapInt: 30
}

Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Β«Ρ‚ΠΈΠΏΠ° Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Β» (type argument), ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ [string, float64] , принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ инстанцированиСм. ΠŸΡ€ΠΈ этом процСссС компилятор замСняСт всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ провСряСт, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ соотвСтствуСт Π΅Π³ΠΎ type constraint.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² вСрсии 1.18: ΠΏΡ€ΠΈ инстанцировании Π½Π΅Ρ‚ нСобходимости явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². АвтоматичСскоС сопоставлСниС Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² производится компилятором ΠΈ носит Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Β«Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ» (type inference). ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ позволяСт Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ [string, float64] ΠΈ [string, int64] ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SumMapValues:

sumMapFloat := SumMapValues(mapFloat)
sumMapInt := SumMapValues(mapInt)

Type inference распространяСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° type parameters, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² Π΅Ρ‘ Ρ‚Π΅Π»Π΅ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… значСниях.

Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Go

Π’ вСрсии 1.18 стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±Ρ‹Π»Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° трСмя ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, основанными Π½Π° Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°Ρ…: slices для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со слайсами, maps для взаимодСйствия с ΠΌΠ°ΠΏΠ°ΠΌΠΈ ΠΈ constraints для задания распространСнных ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² slices ΠΈ maps, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ рассмотрСнныС Ρ€Π°Π½Π΅Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ:

  • slices.Equal сравниваСт Π΄Π²Π° слайса ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ ΠΈ значСниям:
func Equal[S ~[]E, E comparable](s1, s2 S) bool {
	if len(s1) != len(s2) {
		return false
	}
	for i := range s1 {
		if s1[i] != s2[i] {
			return false
		}
	}
	return true
}
  • maps.Equal провСряСт, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ ΠΌΠ°ΠΏΡ‹ содСрТат ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:
func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
	if len(m1) != len(m2) {
		return false
	}
	for k, v1 := range m1 {
		if v2, ok := m2[k]; !ok || v1 != v2 {
			return false
		}
	}
	return true
}

Π—Π°Π΄Π°Ρ‡ΠΈ

ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Ρ‚Π΅ΠΎΡ€ΠΈΡŽ Π½Π° практичСских Π·Π°Π΄Π°Ρ‡Π°Ρ…. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ послСдниС ΡΠ²Π»ΡΡŽΡ‚ΡΡ довольно ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹ΠΌΠΈ, Π·Π°Ρ‚ΠΎ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°Ρ…. Π’ случаС возникновСния трудностСй Π²Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ слайса

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Filter для ΠΎΡ‚Π±ΠΎΡ€Π° элСмСнтов слайса ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΡƒ. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ слайс ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ predicate с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° bool. Если элСмСнт удовлСтворяСт Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π΅ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, Ρ‚ΠΎ predicate Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, ΠΈΠ½Π°Ρ‡Π΅ – false. Ѐункция Filter Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ слайс с ΠΎΡ‚ΠΎΠ±Ρ€Π°Π½Π½Ρ‹ΠΌΠΈ элСмСнтами.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Filter:

slc := []int{1, 2, 3, 4}
predicate := func(val int) bool {
	return val%2 == 0
}
fmt.Println(Filter(slc, predicate)) // [2 4]

РСшСниС

func Filter[T any](slc []T, predicate func(T) bool) []T {
	var result []T
	for _, value := range slc {
		if predicate(value) {
			result = append(result, value)
		}
	}
	return result
}

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ²

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ RemoveDuplicates для удалСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· слайса comparable Ρ‚ΠΈΠΏΠ°. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° слайс ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ слайс Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RemoveDuplicates:

func main() {
	slc := []int{1, 2, 1, 3, 2, 9, 5}
	fmt.Println(RemoveDuplicates(slc)) // 1 2 3 9 5
}

РСшСниС

func RemoveDuplicates[T comparable](slc []T) []T {
	var result []T
	checked := make(map[T]bool)
	for _, val := range slc {
		if _, ok := checked[val]; !ok {
			checked[val] = true
			result = append(result, val)
		}
	}
	return result
}

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ кэш

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ…. Он состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

  1. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Cache, содСрТащая ΠΌΠ°ΠΏΡƒ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° string ΠΈ значСниями ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° T, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² качСствС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ….
  2. ΠœΠ΅Ρ‚ΠΎΠ΄-конструктор NewCache для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° кэша.
  3. ΠœΠ΅Ρ‚ΠΎΠ΄ Set для добавлСния значСния Π² кэш ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.
  4. ΠœΠ΅Ρ‚ΠΎΠ΄ Get для получСния значСния ΠΈΠ· кэша ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ. Если Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ элСмСнта Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² ΠΌΠ°ΠΏΠ΅, Ρ‚ΠΎ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ значСния ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ false.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

func main() {
	cache := NewCache[int]()
	cache.Set("1", 1)
	fmt.Println(cache.Get("1")) // 1 true
	fmt.Println(cache.Get("2")) // 0 false
}

РСшСниС

type Cache[T any] struct {
	storage map[string]T
}

func NewCache[T any]() *Cache[T] {
	return &Cache[T]{
		storage: make(map[string]T),
	}
}

func (c *Cache[T]) Set(key string, value T) {
	c.storage[key] = value
}

func (c *Cache[T]) Get(key string) (T, bool) {
	value, found := c.storage[key]
	if !found {
		return value, false
	}
	return value, true
}

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ мноТСство

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ мноТСства – структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² нСупорядочСнном Π²ΠΈΠ΄Π΅. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… частСй:

  1. Π’ΠΈΠΏ ΠΌΠ°ΠΏΡ‹ с comparable ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ значСниями Ρ‚ΠΈΠΏΠ° struct{}. ВмСсто пустой структуры, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ bool, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΅ эффСктивСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ bool Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС памяти, Ρ‡Π΅ΠΌ struct{}.
  2. ΠœΠ΅Ρ‚ΠΎΠ΄-конструктор NewSet для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΌΠ°ΠΏΡ‹. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ comparable Ρ‚ΠΈΠΏΠ°.
  3. ΠœΠ΅Ρ‚ΠΎΠ΄ Add для добавлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² мноТСство. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ comparable Ρ‚ΠΈΠΏΠ°.
  4. ΠœΠ΅Ρ‚ΠΎΠ΄ Contains для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия значСния Π²ΠΎ мноТСствС. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true ΠΈΠ»ΠΈ false.
  5. ΠœΠ΅Ρ‚ΠΎΠ΄ GetElements для получСния всСх элСмСнтов мноТСства. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ слайс comparable Ρ‚ΠΈΠΏΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

func main() {
	set := NewSet(1, 2)
	fmt.Println(set.Contains(9)) // false
	set.Add(3, 4)
	fmt.Println(set.GetElements()) // числа 1 2 3 4 Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС
}

РСшСниС

type Set[E comparable] map[E]struct{}

func NewSet[E comparable](values ...E) Set[E] {
	set := Set[E]{}
	for _, value := range values {
		set[value] = struct{}{}
	}
	return set
}

func (set Set[E]) Add(values ...E) {
	for _, val := range values {
		set[val] = struct{}{}
	}
}

func (set Set[E]) Contains(value E) bool {
	_, found := set[value]
	return found
}

func (set Set[E]) GetElements() []E {
	var elements []E
	for value := range set {
		elements = append(elements, value)
	}
	return elements
}

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ познакомились с ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠΎΠΉ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования, рассмотрСли Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΈ ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹: type parameter, type constraint ΠΈ type inference. Π’ ΠΊΠΎΠ½Ρ†Π΅ Π·Π°ΠΊΡ€Π΅ΠΏΠΈΠ»ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… практичСских Π·Π°Π΄Π°Ρ‡Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ наглядно Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ².

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΡƒΠ·Π½Π°Π΅ΠΌ ΠΎ способах хранСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΈ Π² языкС Go, ΠΈΠ·ΡƒΡ‡ΠΈΠΌ основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° time ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π΅ΡˆΠΈΠΌ ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΡƒ нСслоТных Π·Π°Π΄Π°Ρ‡

***

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

  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

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

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

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

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

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

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

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

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