Go

golang логотип

Язык программирования Go - это проект с открытым исходным кодом, призванный сделать программистов более продуктивными.

Go выразителен, краток, чист и эффективен. Его механизмы параллелизма позволяют легко писать программы, которые максимально используют возможности многоядерных и сетевых машин, а его новая система типов обеспечивает гибкое и модульное построение программ. Go быстро компилируется в машинный код, но при этом обладает удобством сборки мусора и мощью отражения во время выполнения. Это быстрый, статически типизированный, компилируемый язык, который ощущается как динамически типизированный, интерпретируемый язык.

пакет main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

Введение

Go поддерживает функции первого класса, функции высшего порядка, определяемые пользователем типы функций, литералы функций, закрытия и множественные возвращаемые значения. Такой богатый набор функций поддерживает функциональный стиль программирования на сильно типизированном языке. В этом обзоре мы рассмотрим простую программу, которая моделирует игру в кости под названием Pig и оценивает основные стратегии.

Обзор игры

Pig - это игра для двух игроков, в которую играют шестигранным кубиком. Каждый ход вы можете бросать или оставаться.

  • Если выпадает 1, вы теряете все очки за свой ход и игра переходит к вашему противнику. Любой другой бросок добавляет свое значение к вашему счету хода.
  • Если вы остаетесь, то ваш счет за ход прибавляется к общему счету, а игра переходит к вашему противнику.

Побеждает тот, кто первым наберет 100 очков. Тип score хранит очки текущего игрока и игрока противника, в дополнение к очкам, накопленным за текущий ход.

Определяемые пользователем типы функций

В Go функции можно передавать так же, как и любые другие значения. Подпись типа функции описывает типы ее аргументов и возвращаемых значений. Тип action - это функция, которая принимает счет и возвращает полученный счет, а также информацию о том, закончился ли текущий ход. Если ход закончен, поля игрока и противника в результирующем счете должны поменяться местами, так как теперь ход другого игрока.

Множественные возвращаемые значения

Функции Go могут возвращать несколько значений. Функции roll и stay возвращают по паре значений. Они также соответствуют сигнатуре типа action. Эти функции действия определяют правила Pig.

Функции высшего порядка

Функция может использовать другие функции в качестве аргументов и возвращаемых значений. Стратегия - это функция, которая принимает на вход оценку и возвращает действие, которое нужно выполнить.

Литералы и замыкания функций

В Go можно объявлять анонимные функции, как в этом примере. Литералы функций являются замыканиями: они наследуют область видимости функции, в которой они объявлены.

Одна из базовых стратегий в игре Pig заключается в том, чтобы продолжать бросать, пока не наберется не менее k очков за ход, а затем остаться. Аргумент k заключен в этот литерал функции, который соответствует сигнатуре типа стратегии.

Моделирование игр

Мы моделируем игру "Свинья", вызывая действие для обновления счета, пока один из игроков не наберет 100 очков. Каждое действие выбирается путем вызова функции стратегии, связанной с текущим игроком.

Моделирование турнира

Функция roundRobin имитирует турнир и подсчитывает выигрыши. Каждая стратегия играет с другой стратегией gamesPerSeries раз.

Объявление вариативных функций

Вариативные функции, такие как ratioString, принимают переменное количество аргументов. Эти аргументы доступны в виде фрагмента внутри функции.

Результаты моделирования

Основная функция определяет 100 базовых стратегий, моделирует круговой турнир, а затем выводит результаты выигрыша/проигрыша каждой стратегии. Среди этих стратегий лучше всего придерживаться стратегии 25, но оптимальная стратегия для Pig гораздо сложнее.

Источники