トラック
/
Go
Go
/
演習
/
パーティーロボット
パーティーロボット

パーティーロボット

学習演習

はじめに

パッケージ

Goでは、アプリケーションはパッケージという単位で構成されます。 パッケージとは、同じフォルダーにあるソースファイルをまとめたものです。 1つのフォルダーにあるソースファイルは、すべてファイルの先頭で同じパッケージ名にする必要があります。 慣習として、パッケージ名はそれが置かれているフォルダーと同じ名前にします。

package greeting

Goには、標準ライブラリとして多数のパッケージが用意されており、importキーワードを使うと自分のプログラムで利用できます。 標準ライブラリのパッケージは、その名前を使ってインポートします。

package greeting

import "fmt"

インポートしたパッケージは、パッケージ名で参照します。

world := "World"
fmt.Sprintf("Hello %s", world)

Goでは、ある要素を他のパッケージのコードから呼び出せるかどうかは、その宣言の仕方で決まります。 関数、型、変数、定数、構造体のフィールドを外部から見えるようにする(これを_エクスポート_と呼びます)には、名前を大文字で始める必要があります。

package greeting

// Hello is a public function (callable from other packages).
func Hello(name string) string {
    return "Hello " + name
}

// hello is a private function (not callable from other packages).
func hello(name string) string {
    return "Hello " + name
}

文字列のフォーマット

Goにはfmtという組み込みパッケージがあります(フォーマットパッケージ)。 入出力の書式を操作するための、さまざまな関数が用意されています。 最もよく使われるのはSprintfで、%sのような動詞を使って値を文字列に埋め込み、その文字列を返します。

import "fmt"

food := "taco"
fmt.Sprintf("Bring me a %s", food)
// Returns: Bring me a taco

Goでは、浮動小数点数の値はSprintfの動詞を使うと手軽にフォーマットできます。%g(コンパクトな表現)、%e(指数)、%f(指数なし)です。 3つの動詞はどれも、フィールドの幅と数値の位置を制御できます。

import "fmt"

number := 4.3242
fmt.Sprintf("%.2f", number)
// Returns: 4.32

利用できる動詞の一覧は、フォーマットパッケージのドキュメントにあります。

fmtには、文字列を扱う他の関数もあります。たとえばPrintlnは受け取った引数をそのままコンソールに出力し、PrintfはSprintfと同じように入力をフォーマットしてから出力します。

説明

むかしむかし、格子窓のある奇妙な家に、風変わりなプログラマーが住んでいました。ある日、そのプログラマーはオンラインの求人サイトから、パーティーロボットを作る仕事を引き受けました。ロボットは、人々にあいさつをして、席へ案内するはずでした。最初のバージョンはとても機械的で、プログラマーに人づきあいの経験が足りないことがあらわれていました。そのうちのいくつかは、次のバージョンにもそのまま受け継がれてしまいました。

1. パーティーに来た新しいゲストを歓迎する

Welcome関数を実装して、与えられた名前を使った歓迎のメッセージを返すようにしましょう。

Welcome("Christiane")
// => Welcome to my party, Christiane!

2. 今日が誕生日の新しいゲストを歓迎する

HappyBirthday関数を実装して、その人の名前と年齢を使った誕生日のメッセージを返すようにしましょう。残念ながら、このプログラマーは少し見栄っ張りなので、ロボットはゲスト全員の誕生日を知っていることを披露しなければなりません。

HappyBirthday("Frank", 58)
// => Happy birthday Frank! You are now 58 years old!

3. 道案内をする

AssignTable関数を実装して、道案内ができるようにしましょう。この関数は5つの入力を受け取ります。

  • 迎える新しいゲストの名前(string)
  • テーブル番号(int)
  • 隣に座る人の名前(string)
  • テーブルのある方向(string)
  • テーブルまでの距離(float64)

正確な結果の形式は、下の例で確認できます。

ロボットは、テーブル番号を3桁の形式で伝えます。桁数が3桁に満たない場合は、先頭に0を補って3桁にします(例:3は003になります)。ロボットはテーブルまでの距離も伝えます。幸いなことに、その精度は1桁までに限られています。

AssignTable("Christiane", 27, "Frank", "on the left", 23.7834298)
// =>
// Welcome to my party, Christiane!
// You have been assigned to table 027. Your table is on the left, exactly 23.8 meters from here.
// You will be sitting next to Frank.
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Go Exercism

パーティーロボットを始める準備はできましたか?

Exercismに登録すれば、34個のコンセプト165個の演習、そして本物の人間によるメンタリングとともに、Goを学んでマスターできます。すべて無料です。