对象赋值给结构体

package main

import (
	"fmt"
	"log"
	"net"
	"sync"
	"time"
)
const(
	address = "localhost:502"
)
//方法的嵌套!!!!!!!!!!!!!!!!!!!!!!!!!
func main() {
	handler := NewTCPClientHandler(address) /*TCPClientHandler初始化一个  对象  的参数*/
	/*handler.Encode()*/
	fmt.Printf("%+v\n", handler)
	//&{tcpPackager:{transactionId:0 SlaveId:0} tcpTransporter:{Address:localhost:502 Timeout:10s IdleTimeout:1m0s Logger:<nil> mu:{state:0 sema:0} conn:<nil> closeTimer:<nil> lastActivity:{wall:0 ext:0 loc:<nil>}}}
	/*结构体*TCPClientHandler赋值给接口ClientHandler*/
	//指针对象赋值给接口,接口方法必须是指针对象方法
	NewClient(handler) /*初始化TCPClientHandler对象*/
	/*NewClient(handler).ReadHoldingRegisters()*/
}

type Packager interface {
	Encode() (adu []byte, err error)
	Decode(adu []byte) (err error)
	Verify(aduRequest []byte, aduResponse []byte) (err error)
}

// Transporter specifies the transport layer.
type Transporter interface {
	Send11(aduRequest []byte) (aduResponse []byte, err error)
}
type sclient struct {
	packager    Packager    //接口作为结构体参数
	transporter Transporter //
}

type ClientHandler interface {
	Packager    //编码解码接口
	Transporter //发送接口
}

func NewClient(handler ClientHandler) Client { /*对象赋值给接口*/
	//参数传递时对象赋值给接口,就可以调用对象的方法了
	/*handler 此时是ClientHandler的一个变量,一旦由外部对象调用,则变成了对象*/
	fmt.Println("_______",handler)
	fmt.Printf("ClientHandler接口转变成了%T对象\n",handler)
	/*对象赋值给接口----返回接口的指针对象*/
	return &sclient{packager: handler, transporter: handler} /*返回该接口对象*/
	/*将对象handler赋值给接口packager后,此时packager=对象了*/
	/*将结构体&sclient赋值给接口Client里面都是对读写方法的定义可以都不写*/
}

type Client interface {
}
func NewTCPClientHandler(address string) *TCPClientHandler {
	h := &TCPClientHandler{} //结构体是非引用传递,需要指针对象
	h.Address = address      //IP地址+端口
	h.Timeout = tcpTimeout
	h.IdleTimeout = tcpIdleTimeout
	return h
}
const (
	tcpProtocolIdentifier uint16 = 0x0000
	// Modbus Application Protocol
	tcpHeaderSize = 7
	tcpMaxLength  = 260
	// Default TCP timeout is not set
	tcpTimeout     = 10 * time.Second
	tcpIdleTimeout = 60 * time.Second
)

// tcpPackager implements Packager interface.
type tcpPackager struct {
	// For synchronization between messages of server & sclient
	transactionId uint32 /*用于服务器和客户端消息之间的同步*/
	// Broadcast address is 0
	SlaveId byte /*??0为广播*/
}

// tcpTransporter implements Transporter interface.
type tcpTransporter struct {
	// Connect string
	Address string
	// Connect & Read timeout
	Timeout time.Duration
	// Idle timeout to close the connection
	IdleTimeout time.Duration
	// Transmission logger
	Logger *log.Logger

	// TCP connection
	mu           sync.Mutex
	conn         net.Conn
	closeTimer   *time.Timer
	lastActivity time.Time
}

// TCPClientHandler implements Packager and Transporter interface.
type TCPClientHandler struct {
	//结构体嵌套。
	tcpPackager    //编码+解码+检查序列号3个方法
	tcpTransporter //下发数据1个方法
}

猜你喜欢

转载自blog.csdn.net/weixin_42544051/article/details/85264998
今日推荐