
αααα’αααααΆααα‘αΆαααΆ α§αααα·ααααααΆααααααΉαα’αααΈαααααΆα αα·ααα·ααΈααΆαα
αααααα
α’ααααααα·ααΆααααΆα’αααΈααΌαααααΆαααααΉαααααΆααααααΌααα·αααααααααα’αΆα αα»αα α·αααααΆα α’αα»ααααα§ααΆα ααααα ααΎ αα½αααΆαα UDP αα·α TCP α α’αΆαααααβααΎ , , αα·αααααα "αααααΆααα»αααααΌαααα αα·ααΈααΆαααααααΈααΎα α»αααααα" ααΎαα·αααΌα ααααααα’ααααααααααααΆαααα»ααα·ααΆααααΆαα Tannenbaum αα·α Oliferov ααα»αααααα
αα·ααΈααΆααααααΆααααΉααααααΌα
αααααααΌαααΆααααααΆααα‘αΌααΈαααααΆαααααΎαααΆααααααα·ααΈααααααα»αααααΎαααΆαααΎαααΆαααΈαααααααααααΆα ααΆααααααααααααα·ααΈ ααΆααααααΆααα‘αΌααΈααααΎααα ααΌα ααΆααΆααααααααααΆααααααΎαααΆααααααααΆααα

ααααΌαααΆαααΆααααααααααααααααααα αα ααα»αααααα·αααααααααααααααααααΆααα (ααΎαααααα - ) αα αααααα’αααααααΎ αααααΆααααΉααααααΌαααααααααα·αααααααααααΆαααααααα·ααΈαααααΆααα½αααΆαααΈααααΎαααΆααααααΌααααααα·ααΈαα ααΆαααα ααααΉααααααΌαα α ααΆ segments α

αααααααΌαααΆαααααΎαααααΆαααααα (ααΎα αΆαααΆα α) ααΆααααααΆαααααααα·ααΈαα ααΆααααα α αΎαααααααααααααΆαααααΆααααΉααααααΌααα αα½αααΆααΈαα½ααα

αααααΆαααα αααααΆααααΉααααααΌαααααααΆααααααααα αααααΆαααααααΆαααααα’αααααααΎ ααααααααααααΌαααΆααα»αααααααααα»ααααα αααα·αααααααααααΆαααααααΆα (datagram) α αΎαααααΎα αα α α»ααααα ααααααΆαααα½α αααααΆαααααααΆαααΆαααααααααααααΆααααΉααααααΌαα ααααΈ datagram α αΎααααααΌαααΆα‘αΎααα αααααΆααααΉααααααΌαα αααααΆαααα αααααΆααααΉααααααΌαααααΎαααΆαααααααααααΆαααα½α ααΌα αααααα·ααααααααααααΆααΆααααααΆαααααααα·ααΈααα½αα

αααααΆαααααααΆααααααΌααα·αααααααααα’αΆα αα»αα α·αααααΆαα
ααΆααααααΌααα·αααααααααα’αΆα αα»αα α·αααααΆαααΎααα»αααα·ααααααΆααα»ααααα·ααΆαααΆαααααα»α
ααααΈααΆαααααααα»αα ααααααααααΌαααααΆααααααα½ααα·ααααααααΈαααααΆααααΆαααΎ αααααΎααααα ααααααααΆααααααΆαααΆ α αΎααααααΌαααΆαα ααΆαααα
αααΆαααΈααα
package main
import (
"log"
"net"
)
func main() {
// IP-Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΏΠΎΡΡ
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ Ρ ΠΏΠΎΡΡΠΎΠΌ
serverConn, err := net.ListenUDP("udp", serverAddr)
if err != nil {
log.Fatal(err)
}
// ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
defer serverConn.Close()
// ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π±ΡΡΠ΅Ρ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ
buf := make([]byte, 1024)
// ΠΆΠ΄Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
for {
// ΡΠΈΡΠ°Π΅ΠΌ Π·Π°ΠΏΡΠΎΡ
n, addr, err := serverConn.ReadFromUDP(buf)
// ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΠΠ Π₯ΠΠΠ ΡΡΠΎΠ²Π΅Π½Ρ: Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ stdout
println(string(buf[0:n]), " form ", addr.IP.String())
if err != nil {
log.Fatal(err)
}
// ΠΎΡΠ²Π΅ΡΠ° Π½Π΅Ρ, Ρ.ΠΊ. ΡΡΠΎ UDP + Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ ΠΊΠ°Π½Π°Π»
}
}α’αα·αα·αα
package main
import (
"fmt"
"log"
"net"
"time"
)
func main() {
// IP-Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΏΠΎΡΡ
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ IP-Π°Π΄ΡΠ΅Ρ ΠΈ ΠΏΠΎΡΡ
localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
// ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
conn, err := net.DialUDP("udp", localAddr, serverAddr)
if err != nil {
log.Fatal(err)
}
// ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π·Π°ΠΊΡΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
defer conn.Close()
for {
// ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΎΡ ΠΠΠ Π₯ΠΠΠΠ ΡΡΠΎΠ²Π½Ρ
fmt.Print("ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΡΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ > ")
var msg string
_, err := fmt.Scanf("%s", &msg)
if err != nil {
log.Fatal(err)
}
// ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊ Π±Π°ΠΉΡ, Π° Π½Π΅ ΡΡΡΠΎΠΊΠ°
buf := []byte(msg)
// Π·Π°ΠΏΠΈΡΡ (ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ°) Π² ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
// 1 ΡΠ΅ΠΊΡΠ½Π΄ΠΎΡΠΊΡ
time.Sleep(time.Second * 1)
}
}ααΆααααααΌααα·αααααααααα’αΆα αα»αα α·αααααΆαααΎααΆααααααααΆαααα α»ααααα’αΆα ααΎαααΆα
ααα αΆααααααΆααααΊααααΌαααααααααΆαααα ααααααααΆααααααΆααααααΌαααΆααα’ααααααΌαααΆαααα½αααΆαααααΆαααααααααααα½αααααααΌαααΆαααααΎ ααα»αααααααΈααα αααα»ααα½αααΆα’αΆα ααΉαααααΌαααΌα αααααΆααααααααααααΆααααααααΌααα·ααααααααΆαα½αααΉαααΆααααααΌα αααααααααΆαα

αααα»αααααΈαααααααααΆαααΆααααααααααΌαααΆαααααΎα
- ααΆαααααΎαααα α»α;
- ααα·αααααα’;
- ααΆααααααΌαααααα
αα·ααΈααΆαααααααα·αααααααααα’αΆα
αα»αα
α·αααααΆααααααΆαααααααΆαααααααααααΆαααααΆααααΆααααααΌααααααααα
αααΎαααααααΌαααΆαααα α
ααΆ αα·ααΈααΆα reQuest αααααααααααααααα· (ARQ) α
ααΎαααΈααααααααΆααΆαααααααα·α
αΆαααΆααΈααααααΆαααααα α»ααα
αααα»ααααααΆαααααα
ααααααααΆααΈααα½αααΉααα·αααα½αααΆαααααααΆαααΆαα½αα’αααΈααααααααααΆαααααααααα
ααααααααΆαα
α»ααααααα
αααααααααΆαα
αααααααα αΆααα αααααααΌαααΆαααααΎααααααα
αααα»α TCP ααΊααΎααααΈααααααααΆαααααΈαα½ααα
αααα
αααα·αααααααααααΆααααααααΆαααααααα
ααααααααΆαα

ααΆααααααΌααα·αααααααααα’αΆα αα»αα α·αααααΆαααΎααΆαααααααα·ααα½αα±αααα»αα α·ααααααααα½αααααΆααααααΌα αααααααααΆααα·αααΆαααΆααααααααα ααααααααΆα
αα½αααΆαα½αααΉαααΆααααααΌα
αααααααααΆα ααΆα’αα»αα ααΆαααΆαααΆααααααααα
ααααααααΆααα
αααα»ααααααΆαα
α αΎαααΎααααΈαααααααΆααααα αΆααα ααααααΆαααααΌαααΆαααΆαααΆαα
- αααααααΆααα·αααααΆαααΆααααααααα ααααααααΆα;
- ααΆααααααΌαα‘αΎααα·αααΌααααα ααα―αααΆααααααΆαααα ααΆααΈααα½αα
ααΎαααΈααααααααααααααΈααΎααΆαααΆααααααααα ααααΆα αΆαααΆα αααααΌααααααααααααΆαααααΆαααΆααααααααααΆααααα¬ααααα·αααΎααααΆαα’αααΈααααΌαααΆαααΆααααααααααΆαααΉααααααΌαααααααΆααΆαα½αααΉαααΆααααααΆαααααα½αα±ααααααααααΆααα αααα»ααααααααααΈααΆααα’αα αα·α αα ααΆαααΌα ααααΆαααααααΌαααΆαααααΎα αααα ααααααααΆαααααΌαααΆααααααΌαα‘αΎααα·αα ααΎααααΈααααααααααααααααΆ ααααααΆααααααααΎαααααα·ααΈααααααααααααΆααΆααααααααα αααα’αα»ααααΆαα±ααα’ααααααααα α»ααααα ααααα αααααααααααα αΆαα ααΌα αααααα αααα»ααααα αα TCPKeepAlive ααααΌαααΆαααααααα 15 αα·ααΆααΈααΆαααααΆαααΎαα
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)ααααααααααΌαααααΌαα αΆααααααΎααααααα·ααΈααααααααααααΆααΆαααααααααααα ααααααααΆαααααΌαααΆααααααΌα (ααΆααααΎαααΈαα½α αα·αααΎαααΈααΈα) αααααααΆαααΆαααααΆαααΈαααααα·ααΈααααααααα α αΎαααααααααΆα
ααΌα αααα ααΎαααΆαααααΆααααΈααααααα·αααααΆααααααα·ααΈααΆαααααααα·αααααααααα’αΆα αα»αα α·αααααΆαα
- ααΌααααααΆαααααα;
- αααααααΆαααααααα αα;
- αααααα·ααΈααααααααα;
- αα·αααααααααα·αααααΆααα·αα’αα·αααααΆαα
ααα»ααααααααα·ααααααΆααα’αααα!
αα·ααΈααΆαααααααα·αααααααααα’αΆα αα»αα α·αααααΆαααΆαα½αααΉαααααααααα αΌα
αα αααα»ααααΆαααααααααααΎαααΆααα·α αΆαααΆαα½α α αΎα αα·ααΈααΆαα ααα αΆααααα’αΆα αα»αα α·αααααΆαααΊααααΆαααααα·αααααΆαααααΆααα ααΆα αΆααααααΎα "ααααα" ααΆααααααΌαααααααααααααααααΆαααααΆαααααααα αααααα RTT ααΎαα‘αΎαα ααΎααααΈαααααΎαααααα·αααααΆαααααααΆ αα·αααααΎααααΆαααααααααΆααααααΆαααααΆααααααααΆαααααααααΎα ααααααααα αΌααααααααααΌαααΆαααααΎααααΆααα

ααΆαααααΎααααΆααααααααααα αΌααααααααΆαα±ααααΆαα
- ααΆααααααΎααα½ααααααααααΆαα α αΆααααΆααααΈαααα αααααααΆαααααΎααΆααα’αα (ααΎααααααααΆααααααΌαα‘αΎααα·α) ααααΌααααααααα’ααααααααΆααααα½ααααα
- αααααΌαααΆαααΎααααΈαααααΎαααα·ααααααα’αΆαααααα ααΎααααααααααΌα αα·αααα½αα
αα½ααααααααΆαα αα·ααααααΌαααΆαααα αααα·ααααααα’αΆααααα’αΆαααααααΎαααααααΆαααααα·ααΈααΆαααααΌαααααΎα‘αΎααααα»αααΆαααααΎααααα ααΉαααΆαααΌα ααΆααααα ααααααααΆα ααΆαααΆααααα αα·αααΆααααααΆααααα αα αααα»αααααΈααααααααααα αΌααααααααΆααα·ααΈααΆαααααααΈααααααΆααααΆαααααα α»α:
- αααα‘αα N αααα αααααα‘αααααα·α;
- ααΆααααααααααααΎαααΎαα
αααα‘αα N packets - αα·ααΈααΆααααα’α½α αα’α·α

α’αααααααΎααααΌαααααΆααααααααΉαααα·ααΆαααααΈααααααα
- α α ααΆααα·ααΈααΆαααααα·ααααααα αα αααααααα»αααΆααααααΌααα·ααααααααααΌαααΆαααα α ααΆ "ααΈααΆαααΎ" ααΆααΈααααΎααααΌααα·αα·αααααΎαααααα·αααααΆαααααααααα’α½α (αααααΊααααααΆααααα N ααΆαααααΎααΆαααααααα»ααααα αΆαααΆαααα½ααααααΆαααα) α ααααα·αααΎαααα’α½α ααα αααα ααααααααΆαααααΈααααΌαααΆααααααΎα αα·ααααααΌα α αΎααααααα’αααααααΌαααΆαααααΎαα αα α»ααααααααΆαα ααΎαα·αααΌα αααααα ααΆααΈαααααΌααααα‘αααα·αααααααα αααααΆααααΆαααΎ α αΎααααααΊααΆααΆαα ααα’α»ααααα αΆαααΆ αααα’α½α αααα αΎαα ααΆααααααΆαααααΆααααΆαααΎααΉαααααΆααΆααααααΌααα·ααααααααααααααααααΆααααΈαααααααα αα αααα»ααααααα·ααΈαα·α α’αααααααΎααααααΆααΉαααΆααΆαααα·αααααα (αααα½αα±ααααΆαααααΎααααΆαα) α¬ααΆαααααααΆαααααΎααααΆααααα (ααΌα ααΆ semaphore α¬ααα) αααααΉαα’αα»ααααΆαα±αααααααΆααααΆαααΎα α αα»αααΆαααααΎαααα αααααααααα’α½α αααα .
- ααα½αααΆαααΆααααααΆααα αα αααα»ααα·ααΈααΆα αααααΆαααααα ααααααααΆααααααΆααααααααΆαα N ααΆαααα½αααααΆααααΆααΌαα ααααΌαααΆαα ααααααααα αΆαααΆαααα ααααααααΆαααΆααα’αααααααΆααααααααΆαααα»α N ααααΌαααΆαααα½ααααααααααα
- α αααααααααααα αΆαααΆααα»ααααααα αΎαα ααΎααααΈαααααααΆααα·αααααΆαααΆααααα αα·αααΆααααααΆαααααααααα ααααααααΆα αα·ααααααΆαααα αα·ααΈααΆαααααΎαααααα·ααΈαααααααααα ααααα·αααΎα ααααααααα’ααααααα»αααααα ααΆααΈααααΎααΉααααααΌααααα ααααααααΆαααααα·αααΆαααα½αααααΆααααΆααα’αααααααΆαααααΎα‘αΎααα·αα
ααΆααααααααααααΎαααΎα
αα ααααααααα ααααα’α½α αα·αααα·ααααααααΆαααΆααααααΌαααααααΆαααα ααα αααα αααα½αα ααα½αααα’αΆα αααα·ααα αααα»αααααααααα αΌαα αααα»αααααΈαααααα ααα α»ααααα αααααα½αα’αΆα αααααΆαα±αααααα ααααααααΆααα½αα ααα½αααααααΌαααΆααααααΌαα‘αΎααα·α αααααΆαα αααΎααα·αααααΌαααΆαααΆαααΆαα
α§ααΆα ααα:
ααα’αααα»αα ααΆαα’αα»ααααααααΌαααΆααααααΌααα αααα»αααΆαα’αα»ααααααΆααααααα . α αΎαααααα·αααΎααααΆααααΆααααΉαααΈαααααααααα’αααα»α - .
αααΆαααΈααα
package main
import (
"bufio"
"fmt"
"log"
"net"
"strings"
)
func main() {
// ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ Ρ ΠΏΠΎΡΡΠΎΠΌ
ln, err := net.Listen("tcp", ":8081")
if err != nil {
log.Fatalln(err)
}
// ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Π°
conn, _ := ln.Accept()
for {
// ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// Π²ΡΠ²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² stdout
fmt.Print("Message Received:", string(msg))
// ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ Π² Π²Π΅ΡΡ
Π½ΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ
newMsg := strings.ToUpper(msg)
// ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π΄Π°Π½Π½ΡΡ
conn.Write([]byte(newMsg + "n"))
}
}α’αα·αα·αα
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
)
func main() {
// ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
conn, err := net.Dial("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatalln(err)
}
for {
// ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
Ρ stdin
reader := bufio.NewReader(os.Stdin)
fmt.Print("Text to send: ")
// ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ
text, err := reader.ReadString('n')
if err != nil {
log.Fatalln(err)
}
// ΠΎΡΠΏΡΠ°Π²ΠΊΠ°
fmt.Fprintf(conn, text+"n")
// ΠΏΡΠΈΠ΅ΠΌ
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// Π²ΡΠ²ΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ°
fmt.Print("Msg from Server: " + msg)
}
}ααα ααααΈααααα·ααααΆα
ααααααΆαααΎααααΈααΆααΆααΆαααΌαααΆαααααααα·αααααα αα·αααΆαααααΎααααΆαααααα’αΆα αα»αα α·αααααΆαα
ααααααΆα
ααΆαααααααΎαα»α, ααααα
αα·αα·αααααααΌα
ααααΎααΎααααΈααααΎαααα α»ααααΈααα
αααα»ααααα
ααααααααΆααααααΆααααααΌα
αααααααΆ
ααΆααβα
αααααβαααβα’ααβααα α αΎαβαααα αΆαβααΆβαααβααΆβααΆβαα»αβαααααα ααααααααααααΆααααααΆ ααΆαα½αααΉαααααα·ααααααααααααΌααΆαααΈααΈαα αααα
ααααααααΆα α¬αααααΆααααααααααΆααααΌαααΆαααΆαααααααα‘α»αααααααααΌαα ααααα·αααΎαααα
ααααααααΆαααααΌαααΆαααΉααααααΌααααααΆαααΆααααααΆααα ααα»αααααα·αααΆααααα (ααΆααα»αααααααα»αααα
αααααααααααααααααΆ) α¬αααααΆααααααααΌαααΆαααΆααααα ααΆααααααΌαα‘αΎααα·αααΆααα
ααααααα
ααααααααΆααααα½ααα
αααααααα½αα
αααβαααααΆαα
ααααΎαααααΆαααααααααααααααααΆαααααααα
αααα·αααααααααααΆααααααΌαααΈα’αααααααΎαα
α’αααααα½αα αααααΆααα
αααα»ααααααααΆαααααααα
ααααααααΆααααααα½αααΆαα’αα»ααααΆαα±ααα’αααααα½αααααΎαααΆαααΆααααααααα
ααααααααΆαα αααααααΆαααααααα
ααααααααΆαααΌα
ααααΆααΆααααααΆ αααα
ααααααααΆααααα½αααααΆαα
αα·ααα
αα
ααΆααααααΆαα
αααααΎαβαααβα
α»αβααα½α αα·αβαααα αΆαβαααβα
α»αβααααΎβααΆβαααα
ααβααααααΆαβαααβααααΌαβααααΆβα¬βαααα»αβαααα
ααβααααΌαβααΆαβααα½αβαααβααααααα ααΆααααααΆ ααΆαααα½αααααΆααααΆααααααααΆαααααααα
ααααααααΆααααααΆαααα½ααααααααααα α’αΆαααααααΎαα·ααΈααΆα ααΆααααααΆαααα»αααα αα·ααααα»αααααΌαααΆααααααΆαα
ααΆααααααΆααα’αα·αααααΆα
ααααΎαααα’αααααα½α ααΎααααΈααΌαααααΉααααα’αααααααΎααΆ αααα
ααααααααΆαααααΌαααΆαααα½ααα·αααααΉαααααΌαα ααΆαααα½αααααΆααα’αα·αααααΆαααΆααααααΆαα½ααααα
αΌααααααααΆαααααααα
ααααααααΆαααααα·αααααΌαααΆαααα½αααααΉαααααΌαα
αααα’α½α
, ααΆααααααΌα
ααααααα½ααααααααααΆαααααα’αΆα
ααααΌαααΆαααααΎααΎααααΈαααααΌααααα
ααααααααΆαα Multicast αα·αααΆαα
αΆααααα’αΆα
αααααΎαααααΎαααΆααα·ααΈααΆααααΆαααααΆααααΎαααααααααα
ααΉαααΆααααα
αΆαααΆαααα½αααααΆααα ααΌα
αααααΎαααΉαααΎα ααα ααααα’α½α
α’αΆα
ααααΌαααΆαααααΆαααααα’ααααΎαααααααΆαααα½α αα·αααα·ααααααα’αΆααααααα
α»αααα½α ααααΌα
ααΆααααα·ααααα»ααααααΆα
α§ααΆα ααααααααααααααααΆαααααΎααααΆαα Go αααααΆαααααααΆα
Π .
ααααα: www.habr.com
