Go言語は、シンプルさとスピードにフォーカスを充てた静的型付け言語です。
Go言語には以下のこだわりがあります。
・ コンパイルの高速化
・ 簡潔なプログラミング文法
・ ガーベージコレクション(メモリリリース)
・ 並列プログラミングの書きやすさ
・ マルチコアプロセッサーのサポート
・ マルチプラットフォーム(Mac, Windows, Linux)上での動作
javaScript, Python などの動的型付け言語を学んできた人の次の習得言語として、私は、Go言語を推します。
<目次>
Goのインストール
以下の手順で、Goをインストールしましょう。
- ブラウザからGoのサイトにアクセスする
- ダウンロードリンクを押下する
- OSの種類を選択して、installation packageダウンロードする
- installation instructionsにアクセスし、インストール方法を確認する(各自のOS)
- 新しくterminalか、コマンドプロンプトを開く
- Go言語がインストールされたか確認するために、「go version」を入力し、Goバージョンが表示されるか確認する
Go Playground
Goをインストールする以外に、Goを簡単に試せる方法があります。
その方法とは、「Go Playground」を活用することです。
Go Playground は、Web上で動く簡易のエディタで、簡単なコードならここで試せます。

Goのファイルは、全て「package」句から始まります。
packageは、コードの集合体で、package句で指定した名前で一つの塊になります。
ちなみに「main」となるパッケージ名は特別で、Go言語はこのパッケージに記載された 「func main()」から最初の処理を実行します。
次の「import」句は、他のパッケージのソースコードをインポートする役割を持っています。使いたい機能を読み込んでいるわけですね。
Goのソースファイルが読み込まれる時、このimport句が他のソースファイルを読み込みに行くため、不要なソースはimportしない方がよいとされています。読み込みに時間がかかってしまうからです。
繰り返しになりますが、main関数は特別な関数です。Go言語はシステム起動時、最初にこの関数を読み込みます。
複数のパッケージを読み込む
前述の通り、「import」句を利用して他パッケージから使いたい機能をインポートできます。
複数のパッケージを読み込むときは、以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import ( "fmt" "math" "strings" ) func main() { fmt.Println(math.Floor(2.75)) fmt.Println(strings.Title("Hello Golang")) } |
Go言語のクラス
他の言語と同様、Go言語には様々な組み込みクラスが用意されています。
Stringsクラス
strings は、テキスト文字を扱うクラスです。Go言語では、””(ダブルクォーテーション)でくくって、扱います。
1 2 3 4 5 6 7 8 9 10 |
package main import ( "fmt" ) func main() { // stringsを扱うときは、""でかこむ fmt.Println("I am IT programmer!") } |
また、改行やタブ、文字のエスケープを表す表記があります。
エスケープシーケンス | 意味 |
---|---|
\n | 文字列を改行する |
\t | タブを追加する |
\” | “をエスケープする |
\\ | \をエスケープする |
サンプルを載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" ) func main() { fmt.Println("I am \nIT programmer!") fmt.Println("I am \tIT programmer!") fmt.Println("I am \"IT\" programmer!") fmt.Println("I am \\IT\\ programmer!") } |
1 2 3 4 5 6 |
# 実行結果 I am IT programmer! I am IT programmer! I am "IT" programmer! I am \IT\ programmer! |
Runesクラス
Stringsクラスが文字列を表すクラスである一方、Runesクラスは、シングル文字を表すクラスです。通常、文字をシングルクォートで囲みます。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { fmt.Println('A') fmt.Println('B') fmt.Println('C') } |
上記のプログラムを実行してみましょう。
1 2 3 4 5 |
go run main.go 65 66 67 |
数値が出力されましたね。
Go言語は、Runesクラスをユニコードとして扱います。A=>65、B=>66, C=>67の値は、それぞれのユニコードに紐づくコードを表しており、Runesが保持しています。それを出力しているわけです。
Booleansクラス
Booleanクラスが保持する値は、trueかfalseしかありません。この値は条件判定によく使われます。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" func main() { flag := true if flag { fmt.Println("Flag is ", flag) } else { fmt.Println("Flag is ", flag) } } |
Numbersクラス
Numbersクラスは、数値を扱うクラスです。
1 2 3 4 5 6 7 |
package main import "fmt" func main() { fmt.Println(1000) } |
実行結果は、「1000」と表示されます。
Types
Go言語の扱う値には、それぞれタイプがあります。stringタイプ、boolタイプ、intタイプなどですね。
Go言語は、期待されるタイプではない値を渡した場合は、エラーを出力します。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" "math" "strings" ) func main() { fmt.Println(math.Floor("Test")) fmt.Println(strings.Title(300)) } |
1 2 3 4 5 |
go run main.go # command-line-arguments ./main.go:10:25: cannot use "Test" (type string) as type float64 in argument to math.Floor ./main.go:11:28: cannot use 300 (type int) as type string in argument to strings.Title |
タイプを確認したければ、「reflect」パッケージを使うと便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import ( "fmt" "reflect" ) func main() { fmt.Println(reflect.TypeOf(100)) fmt.Println(reflect.TypeOf(3.14)) fmt.Println(reflect.TypeOf(true)) fmt.Println(reflect.TypeOf("Hi, everyone!")) } |
1 2 3 4 5 6 |
go run main.go int float64 bool string |
Type | 説明 |
---|---|
int | 数値を保持するタイプ |
float64 | 浮動小数点までの数値を保持するタイプ(64は、64bitを指す) |
bool | boolean値を保持するタイプ |
string | 文字列を保持するタイプ |
変数の宣言
変数宣言を学びましょう。変数は値を保持する入れ物であり、いくつかの宣言方法があります。
varキーワード
varキーワードを使った変数宣言を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// var 変数名 タイプ var average int // 複数の変数を同時に宣言 var length, width float64 // 一旦宣言をしてしまえば、次からはvarキーワードは不要 average = 30 length, width = 10.20, 20.30 // 変数宣言と値の格納 var personName string = "Harry" var age, born int = 30, 1988 # 変数宣言後、違うタイプを格納しようとするとエラーになる age = "30" => エラー // タイプの省略(GO言語が自動で判断する) var quantity = 4 var length, width = 1.2, 2.4 |
ちなみに各タイプには、初期値が存在します。
1 2 3 4 |
var myInt int => 初期値 0 var myFloat float64 => 初期値 0 var myString string => 初期値 " "(空文字) var myBool bool => 初期値 false |
Short variable declaration
変数宣言のもう一つの方法は、「short variable declaration」と呼ばれる手法で、変数宣言時に「:=」を使用して宣言します。
1 2 3 |
// varキーワードとタイプは不要 average := 30 age, born := 30, 1988 |
short variable declarationは、簡潔で便利なのでよく利用されます。
この二つの変数宣言の使い分けについては、また別の機会に紹介します。
命名規則
変数、関数、typeなどに付ける名前には、命名規則があります。
・名前の先頭は文字で始め、その後は数値や文字を続ける
・先頭文字が大文字の場合は、他のパッケージからの参照が可能
・先頭文字が小文字の場合は、他のパッケージからの参照は不可
1 2 3 4 5 6 7 8 |
// ok length width2 money.Amount // ng 3person // 数値から始めることはできない money.amount // 先頭大文字でないと他のパッケージからアクセスできない |
また、Go言語のコミュニティでは、以下の書き方が推奨されています。
・キャメルケース(topSecret, anotherThingなど)で記載する
・簡潔な名前(index -> i, maximum -> maxなど)
型変換
実行できそうで意外とできないコードがこれです。
1 2 3 4 5 6 7 8 9 10 |
package main import "fmt" func main() { var length float64 = 30.3 var width int = 2 fmt.Println("The Space is ", length*width) } |
Typeが、float64とintの2つの変数を掛け合わせて出力しようと思ったのですが、以下のエラーが出ました。
1 2 3 4 |
$ go run main.go # command-line-arguments ./main.go:9:37: invalid operation: length * width (mismatched types float64 and int) |
float64とintだとTypeが違うので、「mismatched types」が発生するようです。
この事象を解決するためには、型変換を行う必要があります。型変換とは、とあるTypeの値を別のTypeの値に変換することを指します。
先ほどの例のwidth(int)をfloat64に変えてみましょう。変換方法は簡単で、変更したい変数名をfloat64()囲むだけです。
1 2 3 4 5 6 7 8 9 10 |
package main import "fmt" func main() { var length float64 = 30.3 var width int = 2 fmt.Println("The Space is ", length*float64(width)) } |
1 2 3 |
$ go run main.go The Space is 60.6 |
ただし、float64をintに変更すると小数点以下を切り捨てるので注意が必要です。
1 2 3 4 5 6 7 8 9 10 |
package main import "fmt" func main() { var length float64 = 30.3 var width int = 2 fmt.Println("The Space is ", int(length)*width) } |
1 2 3 |
$ go run main.go The Space is 60 |
ソースコードのコンパイル
コンピューターがGOのソースコードを実行する時、直接ソースコードを解析して実行するのではなく、ソースコードをコンパイルして作成したバイナリファイルを実行しています。バイナリファイルに変換することで、CPUはプログラムを実行できるようになります。
ソースコード ===> compiler ===> バイナリファイル(コンパイル済のファイル)
サンプルで確かめてみましょう。main.goファイルを作成し、適当な場所に保存してください。
1 2 3 4 5 6 7 8 9 |
main.go package main import "fmt" func main() { fmt.Println("Hello, World") } |
main.goファイルを格納したディレクトリまでterminalで移動し、以下のコマンドを実行してください。
1 2 3 4 5 6 7 8 |
# コードを綺麗に整形する(フォーマットを整える) go fmt main.go # コンパイルする go build main.go $ ls main main.go |
Macの場合なら拡張子なしのmainファイルが生成されます(windowsであれば、main.exeになります)。
このmainを実行してみましょう。
1 2 3 |
./main Hello, World |
実行できました。
他に実行する方法としては、「go run コマンド」があります。こちらは、コンパイルファイルを生成せずにプログラムを実行してくれます。
1 2 3 |
go run main.go Hello, World |
Go tools
Goをインストールした時、go コマンドが実行できるようになっています。このコマンドには、様々な種類があります。
コマンド | 説明 |
---|---|
go build | ソースコードをバイナリファイルへコンパイルする |
go run | コンパイルと実行を同時に行う(バイナリファイルの保存はしない) |
go fmt | Goのコーディングスタイルに則って、ファイルを整形する |
go version | Goのバージョンを確認する |
まとめ
・package は、関連する関数とコードの集合体である
・packageの関数を実行する前には、importする必要がある
・stringは、テキスト文字列を表す
・runeは、シングル文字を表す
・numberには、intとfloat64のタイプが存在し、float64は、浮動小数点数が入る
・boolは、true/falseのboolean値が入る
・変数は、指定したタイプの値を格納する
・変数に値が格納されていない場合は、それぞれのタイプの初期値が入る
・short variable declaration(:=)で、変数宣言を行うことができる
・変数、関数、typeの先頭の名前を大文字にすることで、他パッケージからのアクセスを可能にする
・go fmtコマンドにて、ソースコードのフォーマットができる
・go build コマンドにて、ソースコードをバイナリファイルにコンパイルできる
・go runコマンドにて、カレントディレクトリのソースファイルをバイナリファイルの保存なしで実行できる
参考書籍
次回
次回は、条件判定とループを学びましょう^^
コメントを残す
コメントを投稿するにはログインしてください。