Статьи

Готовься, Готовься, Иди

Следующая статья является выдержкой из Learn Go , доступной в Manning Publications.

Представляем игровую площадку Go

Самый быстрый способ начать работу с Go — это перейти на play.golang.org . Go Playground позволяет редактировать, запускать и экспериментировать с Go без необходимости что-либо устанавливать. Когда вы нажимаете кнопку « Выполнить» , игровая площадка скомпилирует и выполнит ваш код на серверах Google и отобразит результат.


Рисунок 1 Игровая площадка Go

Go Playground действительно имеет некоторые ограничения. Например, единственный способ сохранить свою работу — нажать кнопку « Поделиться» и сохранить список закладок. Большинство сусликов предпочитают использовать текстовый редактор и командную строку, работающие на их собственном компьютере, но вы можете освоиться с Go только с помощью своего веб-браузера.

Пакеты и функции

Когда вы посещаете игровую площадку Go, вы увидите следующий код, который является хорошей отправной точкой, как и любой другой.


Привет, перечисление 1, площадка: plays.go
package main //<1>

import "fmt" //<2>

func main() { //<3>
fmt.Println("Hello, playground") //<4>
}

  1. Объявите пакет, которому принадлежит следующий код
  2. Сделать fmtпакет (формат) доступным для использования
  3. Объявите функцию с именем main
  4. Распечатать Привет, площадка на экран

Хотя короткие, предыдущие листинг представляет три ключевые слова: package, importи func. Каждое ключевое слово зарезервировано для специальной цели.

packageКлючевое слово объявляет пакет этот код принадлежит, в этом случае пакет с именем main. Весь код в Go организован в пакеты . Go предоставляет стандартную библиотеку, состоящую из пакетов для математики, сжатия, криптографии, управления изображениями и многого другого. Каждый пакет соответствует одной идее. Следующая строка использует importключевое слово, чтобы указать, какие пакеты будет использовать этот код.

Пакеты содержат любое количество полезных функций, например, mathпакет предоставляет такие функции , как Sin, Cos, Tanи Sqrt(квадратный корень). fmtПакет предоставляет функции для форматного ввода и вывода. Отображение текста на экране является частой операцией, поэтому это название пакета сокращается до fmt.

funcКлючевое слово объявляет функцию, в этом случае функции с именем main. Тело каждой функции заключено в фигурные скобки {}, поэтому Go знает, где каждая функция начинается и заканчивается.

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

Чтобы напечатать строку текста, вы можете использовать Printlnфункцию. Printlnс префиксом, fmtза которым следует точка, потому что он предоставляется fmtпакетом. Каждый раз, когда вы используете функцию из импортированного пакета, перед функцией ставится имя пакета и точка. Когда вы читаете код, написанный на Go, сразу становится ясно, из какого пакета пришла каждая функция.

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

эксперимент

Внесите следующие изменения в код на игровой площадке Go:

  • Измените текст, напечатанный на экран, изменив то, что появляется между кавычками.
  • Попробуйте напечатать текст на китайском, японском, русском или испанском языках. Go поддерживает символы каждого языка.

Если вы застряли, вы можете обновить свой браузер, чтобы вернуться к первому примеру.

Выполнение расчетов

Бывают дни, когда я думаю, что было бы неплохо быть моложе и весить немного меньше. В этом отношении Марс может многое предложить. Марсу требуется 687 земных дней, чтобы облететь вокруг Солнца, а более низкая гравитационная сила означает, что все весит примерно 38% от того, что он делает на Земле.

Следующая программа помогла мне рассчитать, насколько молодым и легким я был бы, если бы жил на Марсе. Введите и запустите его на игровой площадке Go.


Перечисление 2 Привет Марс: mars.go
// My weight loss program. //<1>
package main

import "fmt"

// main is the function where it all begins. //<1>
func main() {
fmt.Print("My weight on the surface of Mars is ")
fmt.Print(210.0 * 0.3783) //<2>
fmt.Print(" lbs, and I would be ")
fmt.Print(38 * 365 / 687) //<3>
fmt.Print(" years old.")
}

  1. Комментарий для читателей-людей
  2. Печать 79,443
  3. Печать 20

Этот код начинается с комментария. Когда Go видит двойную косую черту, он игнорирует все до конца строки. Компьютерное программирование — это общение. Кодекс передает ваши инструкции на компьютер, а когда он написан правильно, он передает ваши намерения другим людям. Комментарии только для нас.

Предыдущий листинг вызывает Printфункцию несколько раз, чтобы отобразить предложение в одной строке. Как вы видели в листинге 1 , текст помещается между двойными кавычками. Эта программа также отображает результат математических выражений.

эксперимент

Прежде чем строить планы путешествий, используйте Go, чтобы узнать немного больше о жизни на Марсе:

  • Сколько бы вы весили на Марсе? Сколько тебе было бы лет? Замените мой возраст (38) и вес (210,0) на свой собственный. Попробуйте членов семьи, домашних животных и друзей.

    Примечание. В листинге 2 отображается вес в фунтах, но единица измерения не влияет на расчет веса. Какой бы единицей вы ни пользовались, вес на Марсе составляет 37,83% от предоставленного веса. С другой стороны, масса на 100% одинакова.

  • Вы заметили, что ваш возраст на Марсе отображается целым числом, а ваш вес — десятичным? Что произойдет, если вы укажете, что у земного года ровно 365,2425 дня?
  • Что произойдет, если вы используете Printlnфункцию вместо Print?
  • Чтобы отобразить текст, числа и математические выражения, вы можете передать Printфункции список аргументов, разделенных запятыми:

    fmt.Print("I am ", 38*365/687, " years old on Mars.")

    Измените листинг 2, чтобы отобразить тот же вывод, используя только один вызов Printфункции.

СОВЕТ:  После изменения кода нажмите кнопку « Формат» на игровой площадке Go. Он автоматически переформатирует отступы и интервалы в вашем коде без изменения того, что он делает.

Константы и переменные

Теперь, когда я вижу выгоду от поездки на Марс, мой следующий вопрос — сколько времени займет поездка. Путешествие со скоростью света было бы действительно идеальным. Свет движется с постоянной скоростью в космическом вакууме, что облегчает математику. С другой стороны, расстояние между Землей и Марсом значительно варьируется в зависимости от того, где каждая планета находится на своей орбите вокруг Солнца.

Следующий листинг вводит два новых ключевых слова, constи varдля объявления констант и переменных соответственно.


Перечисление 3, Путешествующее со скоростью света: travel.go
// How long does it take to get to Mars?
package main

import "fmt"

func main() {
const lightSpeed = 299792 // km/s
var distance = 56000000   // km

fmt.Println(distance/lightSpeed, "seconds") //<1>

distance = 401000000
fmt.Println(distance/lightSpeed, "seconds") //<2>
}

  1. Печать 186 секунд
  2. Печать 1337 секунд

Первый расчет основан на том, что Марс и Земля находятся рядом, с distanceобъявленным и назначенным начальным значением в 56 000 000 км. Затем distanceпеременной присваивается новое значение 401 000 000 км, причем планеты находятся на противоположных сторонах Солнца.

lightSpeedКонстанта не может быть изменена. Если вы попытаетесь присвоить ему новое значение, компилятор Go сообщит об ошибке «невозможно присвоить lightSpeed».

СОВЕТ:  Переменные должны быть объявлены до их использования. Go сообщит об ошибке, если вы назначите переменную, которая не была объявлена var, например, с speed = 16. Это может помочь выявить ошибки, например, случайно назначить значение, distantкогда вы собираетесь использовать distance.

эксперимент

Введите Листинг 3 в Go Playground и нажмите Run . Скорость света довольно удобна; Я не слышал, чтобы кто-нибудь спрашивал «мы уже там?»

К сожалению, эти расчеты не самые реалистичные. Построение курса прямо под солнцем может быть проблематичным, и, несмотря на то, что было бы неплохо путешествовать со скоростью света, самые быстрые космические корабли сегодня развивают скорость всего 16 км / с. Вы можете перенести эту программу на Землю с этими изменениями:

  • Объявите новую speedпеременную и используйте ее вместо, lightSpeedчтобы рассчитать продолжительность поездки при 16 км / с.
  • Напечатайте продолжительность поездки как количество дней вместо секунд. СОВЕТ: В один день Земли есть 86400 секунд.
  • Марс и Земля будут находиться на расстоянии 57 600 000 км в июле 2018 года. Рассчитайте продолжительность поездки для этого окна запуска.

Подделка со случайными числами

Найти доступный билет на Марс может быть проблемой. Если бы только был агрегатор тикетов, который перечислял тикеты на каждой пробел, но поиск в Google ничего не дал. Похоже на возможность!

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

IntnФункция в randпакете будет генерировать псевдослучайное целое число. Передача 10 Intnвозвращает число от 0 до 9. В следующем примере отображаются два случайных числа от 1 до 10.


Случайные числа перечисления 4: rand.go
package main

import ( //<1>
"fmt"
"math/rand" //<2>
)

func main() {
var num = rand.Intn(10) + 1
fmt.Println(num)

num = rand.Intn(10) + 1
fmt.Println(num)
}

  1. Импорт нескольких пакетов с круглыми скобками
  2. math / rand — путь импорта для пакета rand

ПРИМЕЧАНИЕ.  Каждый раз, когда вы запускаете программу, отображаются одни и те же два псевдослучайных числа. Время на игровой площадке Go стоит на месте, и результаты кэшируются, но эти цифры достаточно хороши для наших целей.

эксперимент

В следующие несколько лет представьте, что некоторые космические корабли могут лететь со скоростью 30 км / с, но более медленные корабли все еще находятся в эксплуатации. Напишите программу, которая генерирует случайную скорость от 16 до 30.

Повторение с для циклов

Вместо того, чтобы вводить один и тот же код несколько раз, как в листинге 4 , Go предоставляет forключевое слово для повторения одного и того же кода. forЦикл может быть использован для генерации 10 случайных чисел. Позже, forцикл будет использоваться для генерации 10 случайных билетов.


Перечисление 5 Loop it: loop.go
package main

import (
"fmt"
"math/rand"
)

func main() {
var count = 0

for count < 10 { //<1>
var num = rand.Intn(10) + 1
fmt.Println(num)

count = count + 1 //<2>
}
}

  1. Повторите код между {}, пока счетчик меньше 10
  2. Счетчик приращений, иначе он будет повторяться вечно

эксперимент

  • Напишите программу, которая отсчитывает от 10, а затем отображает "Liftoff!"
  • Сделайте вашу программу обратного отсчета более реалистичной, сделав паузу на одну секунду после каждого числа. Для этого в timeпакете предусмотрена функция с именем Sleep.
    time.Sleep(time.Second)

СОВЕТ:  При использовании нового пакета, вроде time, он должен быть указан как import. Go Playground может сделать это для вас. Убедитесь, что установлен флажок «Импорт», и нажмите кнопку « Формат» . Go Playground определит, какие пакеты используются, и добавит пути их импорта.

Сравнение с If и Switch

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


Перечисление 6, Сравнивающее числа: if.go
package main

import (
"fmt"
"math/rand"
)

func main() {
var num = rand.Intn(3) //<1>

if num == 0 { //<2>
fmt.Println("Space Adventures")
} else if num == 1 { //<3>
fmt.Println("SpaceX")
} else { //<4>
fmt.Println("Virgin Galactic")
}
}

  1. Генерация случайного числа от 0 до 2
  2. Если случайное число равно 0
  3. В противном случае, если num равно 1
  4. Или, если что-нибудь еще

СОВЕТ:  Go сообщает об ошибке, если вы случайно используете метод assign ( =), когда ==подразумевается равенство ( ).

эксперимент

При вводе листинга 6 на игровую площадку Go помните, что фигурные скобки {}должны быть расположены, как показано на рисунке.

  • Измените объявление, numчтобы инициализировать его значениями 0, 1 или 2, а не случайным числом.
  • Создайте 10 случайных пробелов, комбинируя листинг 6 с циклом из листинга 5 .

Сравнивая одно и то же значение для равенства, Go предоставляет немного более чистое switchутверждение. Следующий код может заменить тело функции main в листинге 6 .


Перечисление 7 Оператор switch: switch.go
switch rand.Intn(3) {
case 0:
fmt.Println("Space Adventures")
case 1:
fmt.Println("SpaceX")
case 2:
fmt.Println("Virgin Galactic")
default:
fmt.Println("This was not foreseen")
}

эксперимент

Введите листинг 7 в текст mainфункции Go Playground. Обязательно импортируйте и то, fmtи другое, math/randкак в листинге 6 .

  • Расширьте оператор case дополнительными пробелами, реальными или вымышленными. Не забудьте обновить вызов до Intnобщего количества пробелов.
  • caseКлючевое слово может оценить запятыми список значений. Вы можете использовать эту функцию, чтобы разместить больший вес на выбранных космических линиях. Например:
    case 0, 1, 2:
        fmt.Println("Eagle 5")

Отформатированная печать

Чтобы правильно оформить тикеты, Printfфункция дает больше контроля над выводом, чем Printили Println, но сначала простой пример.


Перечисление 8 Printf: fmt.go
var weight = 210.0 * 0.3783
var age = 38 * 365 / 687

fmt.Printf("My weight on the surface of Mars is %v lbs,", weight)
fmt.Printf(" and I would be %v years old.\n", age)

Первый аргумент Printf— это текст, содержащий глагол формата%v . %vЗамещает значения в weightпеременной, и также для age.

PrintlnФункция автоматически переходит к следующей строке, но Printfи Printэтого не делают. Всякий раз, когда вы хотите перейти к следующей строке, поместите \nв текст.

Если указано несколько глаголов формата, функция Printf подставит несколько переменных в следующем порядке:

fmt.Printf("weight %v, age %v\n", weight, age)

Возможность заменять переменные в любом месте предложения — это здорово, но Printfдаже позволит вам настроить отображение значений. В %4vглагольных колодках значения на ширину 4 -х символов, полезных для выравнивания текста:

fmt.Printf("$%4v\n", 94)  //<1>
fmt.Printf("$%4v\n", 100) //<2>
  1. Распечатать $  94
  2. Распечатать $ 100
СОВЕТ.  См.
Онлайн-документацию по глаголам других форматов (например
%v).

Собираем все вместе: генератор билетов

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


Билеты перечисления 9: tickets.go
package main

import (
"fmt"
"math/rand"
)

func main() {
fmt.Println("Spaceline Company Days Round-trip Price")
fmt.Println("=======================================")

var distance = 57600000
var count = 0

for count < 10 {
var speed = rand.Intn(15) + 16          // 16-30 km/s
var duration = distance / speed / 86400 // days
var price = 20.0 + speed                // $ millions

switch rand.Intn(3) {
case 0:
fmt.Print("Space Adventures  ")
case 1:
fmt.Print("SpaceX            ")
case 2:
fmt.Print("Virgin Galactic   ")
}

fmt.Printf("%4v ", duration)

if rand.Intn(2) == 1 {
fmt.Print("Round-trip ")
price = price * 2
} else {
fmt.Print("One-way    ")
}

fmt.Printf("$%4v", price)
fmt.Println()

count = count + 1
}
}

Когда вы запустите листинг 9 в Go Playground, результат будет выглядеть примерно так:

Spaceline Company Days Round-trip Price
=======================================
Space Adventures    24 Round-trip $  94
SpaceX              22 One-way    $  50
Virgin Galactic     25 One-way    $  46
Virgin Galactic     41 Round-trip $  72
Virgin Galactic     23 One-way    $  48
Space Adventures    22 Round-trip $ 100
Virgin Galactic     37 Round-trip $  76
Virgin Galactic     30 One-way    $  42
SpaceX              23 Round-trip $  96
Space Adventures    22 Round-trip $  98

эксперимент

Добавьте столбец с датой отправления, где в каждом билете случайным образом отображается одна из дат в таблице 1 . durationРасчет должен быть основан на соответствующем расстоянии.


Таблица 1 Расстояние от Земли до Марса

Дата

Расстояние (км)

22 мая 2016 г.

75300000

27 июля 2018 г.

57600000

13 октября 2020 г.

62100000

Резюме

Эта статья знакомит со структурой базовой программы Go. Оттуда вы создали генератор билетов на космическую линию, используя игровую площадку Go с переменными, псевдослучайными числами, циклами и условиями. По пути вы:

  • Использовали стандартную библиотеку для печати текста и чисел на экране и для генерации псевдослучайных чисел.
  • Объявлены константы и переменные и назначены новые значения переменных.
  • Используются математические выражения для расчета возраста, веса, продолжительности и вымышленных цен на билеты.
  • Стал знаком с синтаксисом Go для ветвления и повторения с if, switchи for.
  • Используется 11 Go ключевых слов из общих 25: package, import, func, const, var, for, if, else, switch, case, и default.