Создайте сетку, на которой может передвигаться марсоход, для этого имплементируйте тип MarsGrid
. Чтобы безопасно использовать несколько горутин за раз, вам понадобится задействовать мьютекс. Код должен делать нечто подобное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// MarsGrid представляет сетку какой-то поверхности // Марса. Может использовать конкурентно другой // горутиной. type MarsGrid struct { // Сделано. } // Occupy занимает ячейку в данной точке сетки. Он // возвращает nil, если точка уже занята или точка // за пределами сетки. В противном случае возвращается значение, что // можно переместить в другое место сетки. func (g *MarsGrid) Occupy(p image.Point) *Occupier // Occupier представляет занятую клетку сетки // Может использоваться конкурентно другой сеткой type Occupier struct { // Готово } // Move перемещает occupier на другую клетку сетки // Сообщает, было ли перемещение успешным // Может не получиться, если пытается выйти за пределы // сетки или потому что пытается перместиться в клетку, что // уже занята. Если проваливается, occupier остается на прежнем месте func (g *Occupier) Move(p image.Point) bool |
Теперь измените пример с марсоходом из урока про конкурентность. Вместо только локального обновления координат, марсоход будет использовать объект MarsGrid
, переданный в функцию NewRoverDriver
. Если марсоход доходит до границ сетки или до какого-то препятствия, он должен двинуться в какое-то другое случайное направление.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Теперь вы можете запустить несколько марсоходов через вызов NewRoverDriver
и посмотреть, как они перемещаются по сетке.
Сообщение об открытиях
Нам нужно обнаружить жизнь на Марсе, поэтому отправим несколько марсоходов вниз для поиска, они должны будут сообщить нам, когда жизнь будет найдена. Каждой клетке сетки присваивается вероятность жизни, то есть случайное число между 0 и 1000. Если марсоход находит клетку со значением выше 900, возможно, это жизнь, и он должен отправить радио сообщение обратно на Землю.
К несчастью, не всегда можно отправить сообщение сразу, потому что спутники не всегда в нужном положении. Имплементируйте горутину буфера, что получает сообщение, отправленное из марсохода и сохраняет срез в буфер, пока не получится отправить что-то на Землю.
Имплементируйте Земплю (Earth) как горутину, что получает сообщения только периодически (в реальности несколько часов каждый день, но вы можете сделать интервал короче этого). Каждое сообщение должно содержать координаты клетки, где жизнь может быть найдена, а также само значение жизни.
Возможно, вы также захотите назвать каждый марсоход и включить название в сообщение, чтобы было видно, откуда пришло сообщение. Может быть полезно включить название в лог сообщений, выводимых марсоходом, чтобы вы могли отследить прогресс каждого марсохода.
Установите ваши марсоходы так, чтобы они могли свободно заниматься поиском. Посмотрите, что получится!
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»