πŸ’¬ НазовитС ΠΎΠ±Ρ‰ΠΈΠ΅ случаи использования ΠΈ злоупотрСблСния Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°ΠΌΠΈ Π² Go.



1️⃣ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ элСмСнта, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, связанный список ΠΈΠ»ΠΈ ΠΊΡƒΡ‡Ρƒ.

2️⃣ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ со срСзами, ΠΌΠ°ΠΏΠ°ΠΌΠΈ ΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ любого Ρ‚ΠΈΠΏΠ°. НапримСр, функция объСдинСния Π΄Π²ΡƒΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠ°Π½Π°Π»Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΊΠ°Π½Π°Π»Π°:



func merge[T any](ch1, ch2 <-chan T) <-chan T {

// ...

}





3️⃣ Ѐакторизация повСдСния вмСсто Ρ‚ΠΈΠΏΠΎΠ². ΠŸΠ°ΠΊΠ΅Ρ‚ sort, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, содСрТит интСрфСйс sort.Interface, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΈΜ† Π² сСбя Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:



type Interface interface {

Len() int

Less(i, j int) bool

Swap(i, j int

}





Π­Ρ‚ΠΎΡ‚ интСрфСйс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ функциями: sort.Ints ΠΈΠ»ΠΈ sort.Float64s. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ°, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ дСйствиС ΠΏΠΎ сортировкС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² структуру, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ срСз, ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния):



type SliceFn[T any] struct {

S []T // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°

Compare func(T, T) bool // Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° элСмСнта T

}



func (s SliceFn[T]) Len() int { return len(s.S) }

func (s SliceFn[T]) Less(i, j int) bool { return s.Compare(s.S[i], s.S[j]) }

func (s SliceFn[T]) Swap(i, j int) { s.S[i], s.S[j] = s.S[j], s.S[i] }





ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ структура SliceFn Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ sort.Interface, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прСдоставлСнный срСз с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort.Sort(sort.Interface):



s := SliceFn[int]{

S: []int{3, 2, 1},

Compare: func(a, b int) bool {

return a < b

},

}

sort.Sort(s)

fmt.Println(s.S)



[1 2 3]





πŸ“Œ Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π½Π΅ рСкомСндуСтся?



πŸ”ΈΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ°. Рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ io.Writer ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Write:



func foo[T io.Writer](w T) {

b := getBytes()

_, _ = w.Write(b)

}





Π’ этом случаС использованиС Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² Π½Π΅ принСсСт ΠΊΠΎΠ΄Ρƒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΈΜ† ΠΏΠΎΠ»ΡŒΠ·Ρ‹. НуТно Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° w Ρ€Π°Π²Π½Ρ‹ΠΌ io.Writer.



πŸ”ΈΠšΠΎΠ³Π΄Π° это Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ слоТным. Π”ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Go прСкрасно ΠΆΠΈΠ»ΠΈ Π±Π΅Π· Π½ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ дСсяти Π»Π΅Ρ‚.