π¬ ΠΠ°Π·ΠΎΠ²ΠΈΡΠ΅ ΠΎΠ±ΡΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠ°ΠΌΠΈ Π² Go.
1οΈβ£ Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ, ΡΡΠΎΠ±Ρ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΠΈΠΏ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΈΜ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ»ΠΈ ΠΊΡΡΡ.
2οΈβ£ Π€ΡΠ½ΠΊΡΠΈΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ ΡΠΎ ΡΡΠ΅Π·Π°ΠΌΠΈ, ΠΌΠ°ΠΏΠ°ΠΌΠΈ ΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π΄Π²ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌ ΡΠΈΠΏΠΎΠΌ ΠΊΠ°Π½Π°Π»Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ°, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΈΠΏ ΠΊΠ°Π½Π°Π»Π°:
3οΈβ£ Π€Π°ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΠΏΠΎΠ². ΠΠ°ΠΊΠ΅Ρ
ΠΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΈΜΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ:
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΡΡΠΊΡΡΡΠ°
π ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ?
πΈΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠΈΠΏΠ°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄Π΅ io.Writer ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Write:
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΎΠ² Π½Π΅ ΠΏΡΠΈΠ½Π΅ΡΠ΅Ρ ΠΊΠΎΠ΄Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΈΜ ΠΏΠΎΠ»ΡΠ·Ρ. ΠΡΠΆΠ½ΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°
πΈΠΠΎΠ³Π΄Π° ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ. ΠΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ, ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ 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 ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΆΠΈΠ»ΠΈ Π±Π΅Π· Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΡΡΠΈ Π»Π΅Ρ.