Следующая статья является выдержкой из 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>
}
- Объявите пакет, которому принадлежит следующий код
- Сделать
fmt
пакет (формат) доступным для использования - Объявите функцию с именем main
- Распечатать Привет, площадка на экран
Хотя короткие, предыдущие листинг представляет три ключевые слова: 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.")
}
- Комментарий для читателей-людей
- Печать 79,443
- Печать 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>
}
- Печать 186 секунд
- Печать 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)
}
- Импорт нескольких пакетов с круглыми скобками
- 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>
}
}
- Повторите код между {}, пока счетчик меньше 10
- Счетчик приращений, иначе он будет повторяться вечно
эксперимент
- Напишите программу, которая отсчитывает от 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")
}
}
- Генерация случайного числа от 0 до 2
- Если случайное число равно 0
- В противном случае, если num равно 1
- Или, если что-нибудь еще
СОВЕТ: 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>
- Распечатать
$ 94
- Распечатать
$ 100
Собираем все вместе: генератор билетов
Случайные числа, циклы, сравнения и форматированная печать: у вас есть все, что вам нужно для генерации списка заявок. Следующая программа использует табличный формат с красивым заголовком, чтобы сделать его более необычным.
Билеты перечисления 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
Расчет должен быть основан на соответствующем расстоянии.
Дата |
Расстояние (км) |
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
.