package main import ( "net" "log" "fmt" ) type Client struct { c * net.TCPConn w chan []byte r chan []byte } func NewClient() * Client { client := new(Client) wch := make(chan []byte, 2048) rch := make(chan []byte, 2048) client.w = wch client.r = rch addr, err := net.ResolveTCPAddr("127.0.0.1:4730") if err != nil { log.Panic(err.String()) } c, err := net.DialTCP("tcp", nil, addr) client.c = c if err != nil { log.Panic(err.String()) } go client.ReadLoop() go client.WriteLoop() return client } func (client * Client) ReadLoop() { for { buf := make([]byte, 2048) _, err := client.c.Read(buf) if err != nil { client.c.Close() break; } client.r <- buf } } func (client * Client) WriteLoop() { for { select { case buf := <- client.w: client.c.Write(buf) } } } func (client * Client) Write(data []byte) { client.w <- data } func (client * Client) Read() []byte{ var buf []byte select { case buf = <- client.r: } return buf } func main() { client := NewClient() client.Write([]byte("TEST\r\n")) for { fmt.Println(client.Read()) } }