Skip to content

Latest commit

 

History

History
160 lines (109 loc) · 7.58 KB

2.02.md

File metadata and controls

160 lines (109 loc) · 7.58 KB

2.2 Hello World

Goプログラムがどう動くのか見ていきましょう。Go Playgroundを使っていきます。Goプログラムにはmainパッケージが必要です。さらに、mainパッケージの中にはmain関数が必要です。main関数はプログラムの入口かつ出口になります。つまり、main関数が終わるときはプログラムが終了するということです。

package main

import (
	"fmt"
)

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

そしてpackage(パッケージ)はキーワードです。どの言葉がキーワードとして定義されているかどうかは、 Golang Specを見ましょう。 Lexical ElementsKeywordsという項目があります。キーワードは多くはありません。

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

packageimportfuncが見つかると思います。

繰り返しになりますが、package mainのようなパッケージ宣言が必要です。Goの基本ライブラリから"fmt"パッケージをインポートし、main関数内でPrintln関数を呼び出しています。

基本ライブラリや第三者のライブラリからのインポートは頻繁にあることです。インポートのためのコードはワンライナーで書くことができます。

import "fmt"

複数のパッケージをインポートするときは丸括弧を使って書くのが慣習的です。

import (
  "fmt"
)

今回で言うとfmtパッケージのようなGoパッケージについてのドキュメントを読みたいときは、golang.orgdocumentsをクリックし、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はきれいなコードのために無駄な努力をしないで済むのです。

コードが汚くなるのを防ぐ方法の一つは、使わない変数を持たないことです。今回のケースではn2err2は使っていないので捨ててしまいましょう。しかしこのコードを実行するとエラーが起こります。

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{}型(どの型でも良い)の引数を取ることができます。

次のビデオではフォーマット出力を見ていきます。