Serhioromano
@Serhioromano
Web Developer

Как узнать есть ли у переменной структуры метод?

У меня есть программа. Вот небольшой кусок кода.

type ModbusTCP struct {
	Device Device
	Client modbus.Client
	Handler *modbus.TCPClientHandler 
}

// Connect connect to the device
func (m *ModbusTCP) Connect(d Device) (err error) {
	m.Device = d

	cs := d.DParams.(map[string]interface{})["ip"].(string) +
		":" + fmt.Sprintf("%.0f", d.DParams.(map[string]interface{})["port"].(float64))
	
	handler := modbus.NewTCPClientHandler(cs)
	handler.Timeout = 10 * time.Second
	handler.SlaveId = 0xFF

	err = handler.Connect()
	if err != nil {
		return errors.New("Fail to connect (" + cs + ") " + err.Error())
	}

	m.Handler = handler
	return nil
}

// End connect to the device
func (m *ModbusTCP) End() {
	LogDev("End connection", logrus.Fields{"id": m.Device.ID})
	m.Handler.Close()
}


Это подготовка подключения к устрйсту по Модбас. Так что все работает, я открываю и закрываю соединение когда нужно. Но бывает такая ситуация что я могу вызвать End() а m.Handler уже пуст к тому времени.

Как мне проверить есть ли такой метод .Close() на хендлере перед тем как его вызвать?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
// Вводим интерфейс с методом Close
// Можем даже использовать готовый io.Closer
type Closer interface {
    Close()
}

// Проверяем, удовлетворяет ли Handler интерфейсу
if casted,ok := m.Handler.(Closer); ok {
    // Если удовлетворяет, вызываем метод
    casted.Close()
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
27 нояб. 2024, в 18:19
2000 руб./за проект
27 нояб. 2024, в 17:41
2000 руб./за проект
27 нояб. 2024, в 17:26
1 руб./за проект