Goプログラムがどう動くのか見ていきましょう。Go Playgroundを使っていきます。Goプログラムにはmainパッケージが必要です。さらに、mainパッケージの中にはmain
関数が必要です。main
関数はプログラムの入口かつ出口になります。つまり、main
関数が終わるときはプログラムが終了するということです。
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
}
そしてpackage
(パッケージ)はキーワードです。どの言葉がキーワードとして定義されているかどうかは、 Golang Specを見ましょう。 Lexical ElementsにKeywordsという項目があります。キーワードは多くはありません。
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
package
、import
、func
が見つかると思います。
繰り返しになりますが、package main
のようなパッケージ宣言が必要です。Goの基本ライブラリから"fmt"
パッケージをインポートし、main
関数内でPrintln
関数を呼び出しています。
基本ライブラリや第三者のライブラリからのインポートは頻繁にあることです。インポートのためのコードはワンライナーで書くことができます。
import "fmt"
複数のパッケージをインポートするときは丸括弧を使って書くのが慣習的です。
import (
"fmt"
)
今回で言うとfmt
パッケージのようなGoパッケージについてのドキュメントを読みたいときは、golang.orgでdocumentsをクリックし、package documentationで読むことができます。また、godoc.orgも有用です。今回で言うとgodoc.org/fmtですし、[godoc.org/het/http)(http://godoc.org/net/http)、 godoc.og/html/templateのような感じでドキュメントを読むことができます。
ではgodoc.org/fmtのドキュメントを見ていきましょう。読み進めていくとindexがありますね。私はまずこの部分を見ることにしています。大文字で始まるものはパッケージから_エクスポート_されているものです。パッケージの外から_見える_と言っても良いかもしれません。
Goではpublic/privateとは言いません。これからの言葉は他の言語で使われるものです。Goではエクスポートされている/エクスポートされてない、見える/見えないと言います。大文字で始まっていれば、パッケージの外から見えます。
ここではfmt
パッケージからfmt.Println
を使っています。 fmt.Printlnのドキュメントを見てみましょう。
func Println(a ...interface{}) (n int, err error)
原文
"Println formats using the default formats for its operands and writes to standard output. Spaces are always added between operands and a newline is appended. It returns the number of bytes written and any write error encountered."
訳
「Printlnはデフォルトのフォーマットを使いオペランドをフォーマットし標準出力に出力します。オペランド間にはスペースが常に追加され、行末に改行が付加されます。出力されたバイト数と起こった出力エラーを返します。」
一般的に言って、常に返り値を返すべきでしょう。そうしなくていい場合もありますが、どのような場合か完全に説明するのは難しいことです。Println
はintとエラーを返しています。
intとエラーの内容を確認したい場合はこの様にします。
package main
import (
"fmt"
)
func main() {
n, err := fmt.Println("Hello, playground")
fmt.Println(n, err)
}
返り値を使って何かしたいと考えてこんな風にしてみました。 (このコードをコンパイルできません。)
package main
import (
"fmt"
)
func main() {
n, err := fmt.Println("Hello, playground")
n2, err2 := fmt.Println(n, err)
}
普通このようにしてintとエラーを捕捉することはありません。無限ループに陥ってしまうからです。
返り値を使わない方法として、そのまま返り値を捨てることができます。Goはきれいなコードのために無駄な努力をしないで済むのです。
コードが汚くなるのを防ぐ方法の一つは、使わない変数を持たないことです。今回のケースではn2
とerr2
は使っていないので捨ててしまいましょう。しかしこのコードを実行するとエラーが起こります。
package main
import (
"fmt"
)
func main() {
n, err := fmt.Println("Hello, playground")
_, _ := fmt.Println(n, err)
}
tmp/sandbox214796246/main.go:9: no new variables on left side of :=
といったエラーが起こると思います。これは9行目で新しい変数を宣言してないという意味です。ここでは:=
を=
にしてください。:=
については後で学習します。では実行してみましょう。
package main
import (
"fmt"
)
func main() {
n, err := fmt.Println("Hello, playground")
_, _ = fmt.Println(n, err)
}
以下のように出力されます。
Hello, playground
18 <nil>
"Hello, playground"とn
(18)、そしてerr
(nil
)が出力されています。
振り返りましょう。fmt
パッケージからどの型の引数でも受け付けるPrintln
を呼び出します。もしコード中に3連続のドットと型が書かれているときは、その型の引数をいくつでも受け付けることを意味します。ここではinterface{}
がその型で、これは空のinterface
です。空のinterface
はどの型でも実装することができ、コンマで分割していくつでも値を入れることができます。
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground", 42, "something else", true)
}
これらは問題なく出力されます。
fmt
パッケージのPrintln
はこんな感じです。このビデオで一番言いたかったことは、Goのプログラムはmain
パッケージのmain
関数からスタートすることです。なのでmain
パッケージにはmain
関数が必要です。main
関数はプログラムの入口で、これが終わるとプログラムも終わります。
プログラム中ではpackage.Identifier
のようなドット記法を使います。identifierは変数、定数、関数になります。大文字で始まるidentifierはすべてエクスポートされます/パッケージの外から見える状態になります。Println
は大文字で始まっているので私達も使うことができます。この関数は3連続のドットとinterface{}
があるのでいくつでもinterface{}
型(どの型でも良い)の引数を取ることができます。
次のビデオではフォーマット出力を見ていきます。