| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | package tcpimport (	"io"	"net")type VFreeConnection struct {	network string	address string}func NewVFreeConnection(network string, address string) *VFreeConnection {	conn := new(VFreeConnection)	conn.network = network	conn.address = address	return conn}func (vconn *VFreeConnection) Start(input <-chan []byte) chan<- []byte {	output := make(chan []byte, 128)	conn, err := net.Dial(vconn.network, vconn.address)	if err != nil {		panic(err)	}	finish := make(chan bool, 2)	go vconn.DumpInput(conn, input, finish)	go vconn.DumpOutput(conn, output, finish)	go vconn.CloseConn(conn, finish)	return output}func (vconn *VFreeConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {	for {		data, open := <-input		if !open {			finish <- true			break		}		conn.Write(data)	}}func (vconn *VFreeConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {	for {		buffer := make([]byte, 128)		nBytes, err := conn.Read(buffer)		if err == io.EOF {			finish <- true			break		}		output <- buffer[:nBytes]	}}func (vconn *VFreeConnection) CloseConn(conn net.Conn, finish <-chan bool) {	for i := 0; i < 2; i++ {		<-finish	}	conn.Close()}
 |