рд▓рд░реНрдирд┐рдВрдЧ рдЧреЛ: рдПрдВрдб-рдЯреВ-рдПрдВрдб рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдкреА 2 рдкреА рдореИрд╕реЗрдВрдЬрд░ рд▓рд┐рдЦрдирд╛

рдлрд┐рд░ рднреА рдПрдХ рдФрд░ рдкреА 2 рдкреА рдореИрд╕реЗрдВрдЬрд░


рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рднрд╛рд╖рд╛ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдирд╛ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЙрдкрдпреЛрдЧреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред


рд╕рдореЗрдХрд┐рдд рд╣реЛрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред


рд░рд┐рдПрдХреНрдЯрдЬ рдЪреИрдЯ рдпреВрдЖрдИ рдЙрджрд╛рд╣рд░рдг


рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рднрд╛рд╖рд╛ рдФрд░ рдкреАрдпрд░-рдЯреВ-рдкреАрдпрд░ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред
рдФрд░ рдРрд╕реЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдореИрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЬрд╛рд╡рд╛, рдкреАрдПрдЪрдкреА, рдЬреЗрдПрд╕, рдЕрдЬрдЧрд░ рдореЗрдВ рд╡рд┐рд╕рд░реНрдЬрди рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдФрд░ рд╣рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдЪреНрдЫреА рд╣реИред


рдЧреЛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХреНрд╖реЗрддреНрд░ рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛рдУрдВ, рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд░рддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЛ рдЕрднреА рднреА рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдХреЛ рдЖрд╕рд╛рди рдФрд░ рджрд░реНрдж рд░рд╣рд┐рдд рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХреГрдд рдиреЗрдЯрд╡рд░реНрдХ рдСрдл рдкреАрдпрд░ (рдкреАрдпрд░-рдЯреВ-рдкреАрдпрд░) рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдПрдХ рдкреА 2 рдкреА рдореИрд╕реЗрдВрдЬрд░ рд╣реИ (рд╡реИрд╕реЗ, рдЗрд╕ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрд╕реА рдкрд░реНрдпрд╛рдп рд╣реИ?)ред


рдХреЛрдб рдореЗрдВ, рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЧреЛрд▓рдЧрдкреНрдкреЗ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо рдЙрдард╛рддрд╛ рд╣реВрдВ, рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред


рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВ?


рдкреАрдпрд░ (рд╕рд╣рдХрд░реНрдореА) - рдореИрд╕реЗрдВрдЬрд░ рдХрд╛ рдПрдХ рдЕрдиреВрдард╛ рдЙрджрд╛рд╣рд░рдгред


рд╣рдорд╛рд░реЗ рджреВрдд рдХреЛ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


  • рдЖрд╕-рдкрд╛рд╕ рдХреА рджрд╛рд╡рддреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
  • рдЕрдиреНрдп рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  • рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдПрдВ

рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рд╕рднреА рдХреЛ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рджреЗрдВред


рд╕рдВрджреЗрд╢рд╡рд╛рд╣рдХ рдХреА рд╕рд╢рд░реНрдд рдпреЛрдЬрдирд╛


рдпрджрд┐ рдЖрдк HTTP рдкрд░ рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЙрд╕реА рдкреЛрд░реНрдЯ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЛрд░реНрдЯ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмреИрдирд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред


рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╕рд╣рдХрд░реНрдореА рдЗрд╕ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рддреЛ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣рдо рдирдП рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред


net.ListenTCP("tcp", tcpAddr) 

рдирдП рдХрдиреЗрдХреНрд╢рди рдкрд░, рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗрдВред


рд╣рдо HTTP рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА 4 рдмрд╛рдЗрдЯреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред


рдЕрдм рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдПрдХ рдмреИрдирд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВред


  buf, err := readWriter.Peek(4) /*   */ if ItIsHttp(buf) { handleHttp(readWriter, conn, p) } else { peer := proto.NewPeer(conn) p.HandleProto(readWriter, peer) } /* ... */ if !strings.EqualFold(s, "127") && !strings.EqualFold(s, "[::") { response.Body = ioutil.NopCloser(strings.NewReader("Peer To Peer Messenger. see https://github.com/easmith/p2p-messenger")) } 

рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдиреАрдп рд╣реИ, рддреЛ рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд░реВрдк рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред


рддрдм рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред


  //   func processRequest(request *http.Request, response *http.Response) {/*    */} //     fileServer := http.FileServer(http.Dir("./front/build/")) fileServer.ServeHTTP(NewMyWriter(conn), request) 

рдпрджрд┐ рдкрде /ws рдбрдмреНрд▓реНрдпреВрдПрд╕ /ws рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред


рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рдмрд╛рдЗрдХ рдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ / рд╡реЗрдмрд╕реНрдХреЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрдмреНрд▓реНрдпреВрдПрд╕ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░реВрдВрдЧрд╛ ред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MyWriter рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ http.ResponseWriter рдФрд░ http.Hijacker рдЕрдиреБрд░реВрдк рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВред


  // w - MyWriter func handleWs(w http.ResponseWriter, r *http.Request, p *proto.Proto) { c, err := upgrader.Upgrade(w, r, w.Header()) /*          */ } 

рдкреАрдпрд░ рдбрд┐рдЯреЗрдХреНрд╢рди


рдПрдХ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпреВрдбреАрдкреА рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рд╣рдо рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рднреЗрдЬреЗрдВрдЧреЗред


  func startMeow(address string, p *proto.Proto) { conn, err := net.DialUDP("udp", nil, addr) /* ... */ for { _, err := conn.Write([]byte(fmt.Sprintf("meow:%v:%v", hex.EncodeToString(p.PubKey), p.Port))) /* ... */ time.Sleep(1 * time.Second) } } 

рдФрд░ рд╕рднреА рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдЖрдИрдкреА рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕реБрдиреЗрдВред


  func listenMeow(address string, p *proto.Proto, handler func(p *proto.Proto, peerAddress string)) { /* ... */ conn, err := net.ListenMulticastUDP("udp", nil, addr) /* ... */ _, src, err := conn.ReadFromUDP(buffer) /* ... */ // connectToPeer handler(p, peerAddress) } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдо рдЦреБрдж рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рджрд╛рд╡рддреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддреЗ рд╣реИрдВред


рдЖрдИрдкреА тАЛтАЛрд╕реНрддрд░ рдкрд░ рдЗрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдЖрдИрдкреАрд╡реА 4 рдкреИрдХреЗрдЬ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ, рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╕ рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдкреАрдпрд░ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓


рд╣рдо рдПрдХ рд▓рд┐рдлрд╛рдлреЗ (рд▓рд┐рдлрд╛рдлрд╛) рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рднреА рд╕рдВрдЪрд╛рд░ рдкреИрдХ рдХрд░реЗрдВрдЧреЗред


рдХрд┐рд╕реА рднреА рд▓рд┐рдлрд╛рдлреЗ рдкрд░ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░реЗрд╖рдХ рдФрд░ рдПрдХ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдХрдорд╛рдВрдб (рдЬреЛ рд╡рд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ) рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЕрдм рддрдХ рдпрд╣ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд╕рд╛рдордЧреНрд░реА рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рд▓рд┐рдлрд╛рдлреЗ рдХреА рд╕рд╛рдордЧреНрд░реА - рдПрдХ рд╕рдВрджреЗрд╢ рдпрд╛ рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░ред


рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ рдмрд╛рдЗрдЯреНрд╕


рдЖрджреЗрд╢, (рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкреНрд░рдХрд╛рд░) рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдлрд╛рдлреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдо 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ HTTP рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред


рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рджреМрд░рд╛рди рдкреВрд░реЗ рд▓рд┐рдлрд╛рдлреЗ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╣рд╛рде рдорд┐рд▓рд╛рдирд╛


рдЬрдм рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджрд╛рд╡рдд рддреБрд░рдВрдд рд╕рд╛рдЭрд╛ рд╕рддреНрд░ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдирд╛рдо, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдФрд░ рдкрдВрдЪрд╛рдЯ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рджреЗрддреЗ рд╣реБрдП, рдПрдХ рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред


рдЬрд╡рд╛рдм рдореЗрдВ, рд╕рд╣рдХрд░реНрдореА рдХреЛ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рди рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдкрдиреА рд╕реВрдЪреА рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рдХрд░реНрдореА рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрд░ рдХреБрдВрдЬреА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (CalcSedenSecret)ред


  func handShake(p *proto.Proto, conn net.Conn) *proto.Peer { /* ... */ peer := proto.NewPeer(conn) /*     */ p.SendName(peer) /*     */ envelope, err := proto.ReadEnvelope(bufio.NewReader(conn)) /* ... */ } 

рджрд╛рд╡рдд рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди


рдПрдХ рд╣рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдерд┐рдпреЛрдВ рдиреЗ рдЕрдкрдиреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ =)


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд┐рд╕реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рдПрдХ JSON рд╕реВрдЪреА рдХреЛ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрд╡рд╛рдм рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд▓рд┐рдлрд╛рдлрд╛ рдорд┐рд▓рддрд╛ рд╣реИред


рд╣рдо рдирдП рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рде рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рджрд╛рд╡рддреЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ ...


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢


рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдореВрд▓реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВрдЧреЗред


рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдХреНрд░рд┐рдкреНрдЯреЛ рдкреИрдХреЗрдЬ рд╕реЗ рдорд╛рдирдХ (Google) рдЧреЛрд▓рдВрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ (рдХреЛрдИ GOST рдорд╛рдирдХ рдирд╣реАрдВ рд╣реИрдВ)ред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ Ed25519 рд╡рдХреНрд░ рд╣реИред рд╣рдо рд╕рдВрджреЗрд╢ рд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ed25519 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ ed25519 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рди рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рддреНрд░ рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рдЖрдкрдХреЛ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 func CreateKeyExchangePair() (publicKey [32]byte, privateKey [32]byte) { pub, priv, err := ed25519.GenerateKey(nil) /* ... */ copy(publicKey[:], pub[:]) copy(privateKey[:], priv[:]) curve25519.ScalarBaseMult(&publicKey, &privateKey) /* ... */ } 

рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдкрдВрдЪрд╛рдВрдЧ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдпрд╣ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреБрдВрдЬреА рд▓реЗрдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИред


рдЧрдгрд┐рдд рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╡рд┐рдХрд┐ рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рдбрд┐рдлреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ - рдПрд▓рд┐рдкреНрдЯрд┐рдХрд▓ рдХрд░реНрд╡реНрд╕ рдкрд░ Hellman_
рдбрд┐рдЬрд┐рдЯрд▓ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдПрдбреАрдбреАрдПрд╕рдП


рдПрдХ рд╕рд╛рдЭрд╛ рдХреБрдВрдЬреА рдХреА рдкреАрдврд╝реА рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИ: рдкрд╣рд▓рд╛, рдПрдХ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрдВрдЪрд╛рдВрдЧ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред


рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖ рдПрдХ рд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ: рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреА рдЬреЛрдбрд╝реА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ рд╕реЙрдХреЗрдЯ рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред


рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдФрд░ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдкрдВрдЪрд╛рдВрдЧ рдХреБрдВрдЬреА рд╣реИред


рдЙрдиреНрд╣реЗрдВ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред


 //CalcSharedSecret Calculate shared secret func CalcSharedSecret(publicKey []byte, privateKey []byte) (secret [32]byte) { var pubKey [32]byte var privKey [32]byte copy(pubKey[:], publicKey[:]) copy(privKey[:], privateKey[:]) curve25519.ScalarMult(&secret, &privKey, &pubKey) return } 

рд╣рдо рдмреНрд▓реЙрдХ рдпреБрдЧреНрдорди рдореЛрдб (CBC) рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдПрдИрдПрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВрдЧреЗред


рдпреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреЛрд▓рдВрдЧ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдмреНрд▓реЙрдХ рдХреА рд▓рдВрдмрд╛рдИ (16 рдмрд╛рдЗрдЯреНрд╕) рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдкрд░рд┐рд╢реЛрдзрди рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢ рдХреЛ рдСрдЯреЛ-рдлрд┐рд▓рд┐рдВрдЧ рдПрдХрдорд╛рддреНрд░ рд╢реЛрдзрди рд╣реИред


  //Encrypt the message func Encrypt(content []byte, key []byte) []byte { padding := len(content) % aes.BlockSize if padding != 0 { repeat := bytes.Repeat([]byte("\x00"), aes.BlockSize-(padding)) content = append(content, repeat...) } /* ... */ } //Decrypt encrypted message func Decrypt(encrypted []byte, key []byte) []byte { /* ... */ encrypted = bytes.Trim(encrypted, string([]byte("\x00"))) return encrypted } 

2013 рдореЗрдВ рд╡рд╛рдкрд╕, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдИрдИрдПрд╕ (рд╕реАрдмреАрд╕реА рдХреЗ рд╕рдорд╛рди рдореЛрдб рдХреЗ рд╕рд╛рде) рдХреЛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╡реЗрд▓ рдбреБрд░реЛрд╡ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред


рдЙрд╕ рд╕рдордп, рд╕рдмрд╕реЗ рдЖрдо рдбрд┐рдлреА-рд╣реЗрд▓рдореИрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрд▓реАрдЧреНрд░рд╛рдореЛрдВ рдореЗрдВ рдПрдХ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ ред


рдФрд░ рдлрд░реНрдЬреА рдХрдиреЗрдХреНрд╢рди рд╕реЗ рд▓реЛрдб рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдореБрдЦ рдПрдХреНрд╕рдЪреЗрдВрдЬ рд╕реЗ рдкрд╣рд▓реЗ, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдиреЗ рдлреИрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред


рдЬреАрдпреВрдЖрдИ


рд╣рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд╣рдХрд░реНрдореА рдХреЗ рдирд╛рдо рдХреЗ рдЖрдЧреЗ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рдХрд░ рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рднреА рджреЗрдирд╛ рд╣реИред


рдпрд╣рд╛рдБ рдореБрд╕реАрдмрддреЛрдВ рдХреЗ рдмрд┐рдирд╛ - ReactJS + websocketред


рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рдВрджреЗрд╢ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рд▓рд┐рдлрд╛рдлреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕рд┐рдлрд░рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред


рд╡реЗ рд╕рднреА WsCmd рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╡рд╛рд░рд┐рд╕" рд╣реИрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкрд░ JSON рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реИрдВред


  //Serializable interface to detect that can to serialised to json type Serializable interface { ToJson() []byte } func toJson(v interface{}) []byte { json, err := json.Marshal(v) /*  err */ return json } /* ... */ //WsCmd WebSocket command type WsCmd struct { Cmd string `json:"cmd"` } //WsMessage WebSocket command: new Message type WsMessage struct { WsCmd From string `json:"from"` To string `json:"to"` Content string `json:"content"` } //ToJson convert to JSON bytes func (v WsMessage) ToJson() []byte { return toJson(v) } /* ... */ 

рддреЛ, рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рд░реВрдЯ ("/") рдкрд░ рдЖрддрд╛ рд╣реИ, рдЕрдм рд╕рд╛рдордиреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рд╕рд╛рдордиреЗ / рдирд┐рд░реНрдорд╛рдг" рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦреЗрдВ рдФрд░ index.html рджреЗрдВ


рд╡реИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ: рдЗрд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЪрд▓рд╛рдПрдВ - WebViewред


рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП zserge / webview рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛


  e := webview.Open("Peer To Peer Messenger", fmt.Sprintf("http://localhost:%v", initParams.Port), 800, 600, false) 

рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛


  sudo apt install libwebkit2gtk-4.0-dev 

рдЬреАрдпреВрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдореБрдЭреЗ рдЬреАрдЯреАрдХреЗ, рдХреНрдпреВрдЯреА рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд┐рд▓реАрдВ, рдФрд░ рдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╣реБрдд geeky рд▓рдЧреЗрдЧрд╛ - https://github.com/jroimartin/gocui - рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ред


рдореИрд╕реЗрдВрдЬрд░ рд▓реЙрдиреНрдЪ


рдЧреЛрд▓рд╛рдВрдЧ рд╕реНрдерд╛рдкрдирд╛


рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЧреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ golang.org/doc/install рдЕрдиреБрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЛрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢


GOPATH рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ


рдпрд╣ рдЗрддрдиреА рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рддрдерд╛рдХрдерд┐рдд GOPATH рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ $ HOME / рдЧреЛ рд╣реИред рдЧреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрд░реЛрдд рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


  go get github.com/easmith/p2p-messenger 

рдЕрдм, рдЖрдкрдХреЗ $HOME/go/src/github.com/easmith/p2p-messenger рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рд╕реЗ рд╕реНрд░реЛрдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛


Npm рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдлреНрд░рдВрдЯ рдЕрд╕реЗрдВрдмрд▓реА


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ GUI ReactJs рдкрд░ рдлреНрд░рдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЕрднреА рднреА рдЗрдХрдЯреНрдард╛ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


Nodejs + npm - рдпрд╣рд╛рдБ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ред


рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣рд╛рдБ ubuntu рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд╣реИ


рдЕрдм рд╣рдо рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдордиреЗ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


 cd front npm update npm run build 

рд╕рд╛рдордиреЗ рддреИрдпрд╛рд░ рд╣реИ!


рд▓рд╛рдВрдЪ


рдЖрдЗрдП рдЬрдбрд╝ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рджреВрдд рдХреА рджрд╛рд╡рдд рдХрд╛ рд╢реБрднрд╛рд░рдВрдн рдХрд░реЗрдВред


рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рд╣рдо рдЕрдкрдиреЗ рд╕рд╣рдХрд░реНрдореА рдХрд╛ рдирд╛рдо, рдкреЛрд░реНрдЯ, рдЕрдиреНрдп рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдФрд░ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЭрдВрдбреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рд╡реНрдпреВ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реИред


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, $USER@$HOSTNAME рдХрд╛ рдЙрдкрдпреЛрдЧ $USER@$HOSTNAME рдирд╛рдо рдФрд░ рдкреЛрд░реНрдЯ 35035 рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдФрд░ рдЪреИрдЯ рдХрд░рддреЗ рд╣реИрдВред


  go run app.go -name Snowden 

рдЧреЛрд▓рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛


  • рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдЬреЛ рдореИрдВ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛: рдЬрд╛рдиреЗ рдкрд░, рдпрд╣ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЗрд░рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ ред
    рд▓рдЧрднрдЧ рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реИред
  • рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдХрдард┐рдирд╛рдИ рдереА рдЬрдм рдореИрдВрдиреЗ GOPATH рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреАред
    рдореИрдВрдиреЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП GoLand рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдФрд░ рдкрд╣рд▓реЗ рддреЛ рдпрд╣ рд╕реНрд╡рддрдГ-рдЖрдпрд╛рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрдордирд╛рдХ рдерд╛ред
  • рдЖрдИрдбреАрдИ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╣реИрдВ , рдЬреЛ рд╣рдореЗрдВ рдХреЛрдб рд╕реЗрдЯ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдХрд╛рд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
  • рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрджрдд рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣рд╛рде-рдЪреЗрд╣рд░рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рд░ рдЙрд╕рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
     err != io.EOF 
  • рдУрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдмреЗрд╣рддрд░ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
     if os.IsNotExist(err) { /* ... */ } 
  • рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдареАрдХ рд╕реЗ рдкрдврд╝рд╛рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рддрд╛ рд╣реИред
    рдФрд░ рдХреБрдЫ рд╣реИрдВ рд▓реЗрдХрд┐рдиред рд╣рдордиреЗ ToJson() рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред
    рдЗрд╕рд▓рд┐рдП, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЬрдирд░реЗрдЯрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╡рд┐рдзрд┐ (рдкреНрд░реЛрдЯреЛ / mtypes.go) рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  • рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ log4j рдХреА рд╢рдХреНрддрд┐ рдХреА рдЖрджрдд рд╣реЛ рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреЛ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдЪреНрдЫрд╛ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд╣реИред
    рд╢рд╛рдпрдж рдкрд░рд┐рд╢рд┐рд╖реНрдЯреЛрдВ рдФрд░ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЧрд┐рддреВрдм рд╕реБрдВрджрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреА рд╡рд┐рд╢рд╛рд▓рддрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
  • рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд╛рдоред
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, append рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ copy рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдгред
  • switch-case рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ if-elseif-else - рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рд╣рд╛рде-рдЪреЗрд╣рд░рд╛:
    рдпрджрд┐ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп switch-case рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдкрд░ fallthrough рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
    рдЖрдк рднреА goto рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдирд╣реАрдВ, рдХреГрдкрдпрд╛!
  • рдХреЛрдИ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рддреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреАрд░-рдЯреВ-рдкреАрдпрд░ рдореИрд╕реЗрдВрдЬрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╢рдВрдХреБ crammed рд╣реИрдВ, рдЖрдЧреЗ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдлрд╛рдЗрд▓реЗрдВ, рдЪрд┐рддреНрд░, рдСрдбрд┐рдпреЛ, рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕, рдЖрджрд┐ рднреЗрдЬрдирд╛, рдЖрджрд┐ред


рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ Google рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
рдмреНрд▓реЙрдХрдЪреИрди рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдереЗрд░рдо рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕реНрдкреИрдо рд╕реЗ рдмрдЪрд╛рдПрдВред


рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдкрд░, рд╕рдореВрд╣ рдЪреИрдЯ, рдЪреИрдирд▓, рдПрдХ рдирд╛рдо рдкреНрд░рдгрд╛рд▓реА, рдЕрд╡рддрд╛рд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред


рд╕реАрдб рдкреАрдпрд░ рдЪрд▓рд╛рдирд╛, рдиреИрдЯ рдмрд╛рдИрдкрд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рд╕рд╣рдХрд░реНрдореА рд╕реЗ рд╕рд╣рдХрд░реНрдореА рддрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред


рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЯреЗрд▓реАрдЧреНрд░рд╛рдо / рдлреЛрди рдорд┐рд▓рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ рд╕рднреА рджреЛрд╕реНрддреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ =)


рдЙрдкрдпреЛрдЧрд┐рддрд╛


рдХреБрдЫ рд▓рд┐рдВрдХ

рдореИрд╕реЗрдВрдЬрд░ рдкрд░ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рд╢реБрд░реБрдЖрддреА рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧреЗред
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ:


golang.org/doc/ - рднрд╛рд╖рд╛ рдкреНрд░рд▓реЗрдЦрди, рд╕рдм рдХреБрдЫ рд╕рд░рд▓, рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдПрдХ рд╣реА рдкреНрд░рд▓реЗрдЦрди рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


 godoc -HTTP=:6060 

gobyexample.com - рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣


golang-book.ru - рд░реВрд╕реА рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдХрд┐рддрд╛рдм


github.com/dariubs/GoBooks Go рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреБрд╕реНрддрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред


рднрдпрд╛рдирдХ-go.com - рдЬрд╛рдиреЗ рдкрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд░реВрдкрд░реЗрдЦрд╛ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рд╡рд░реНрдЧреАрдХрд░рдг рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрд╛ рд╡рд░реНрдгрди рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ, рдЬреЛ Ctrl + F рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

Source: https://habr.com/ru/post/hi437686/


All Articles