Как выполнить действие через промежуток времени, который может измениться?
Можно использовать функцию time. AfterFunc для запуска функции после определенного промежутка. Она возвращает таймер. Если произошел еще один запрос, то текущий таймер останавливать с помощью Stop и создавать такой же новый.
Было решено сделать сессию полноправным объектом (до этого было просто поле с временем последнего действия) с методом Close:func (s *Session) Close(timeout time.Duration) {

	d := s.LastActionTime.Add(timeout).Sub(time.Now())
	for d > 0 {
		time.Sleep(d)
		d = s.LastActionTime.Add(timeout).Sub(time.Now())
	}
	// Closing the Session
}