RubyエンジニアのGo言語入門①
Goを学ぼうと思った背景
普段業務ではRubyを書いているのですが、製的型付け言語のGoに興味があったので、少しずつ学習してアウトプットできればと思います。
普段Rubyを書いているとあまり型を意識することは少ないのですが、もっとRubyで綺麗なコードを書けるようになりたいと思って、静的型付け言語は前々から学びたいと思っていました。
その中でもGoに興味を持った理由は、シンプルな言語ゆえに誰が書いても同じコードに近しくなり、保守性が良いという話を聞き、需要も高まっていることから学んでみようと思いました。
Goとは
Googleが開発した言語であり、正式名称はGoです。
Goで検索しても違う記事がヒットしたりするので、GolangやGo言語とも呼ばれます。
Goは静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、並行処理に強いという特徴を持ちます。
この記事では
無料で学べるGo Tourと呼ばれる公式チュートリアルがあるので、知識の整理も兼ねて、文法をまとめていきます!
Packages
Goのプログラムはパッケージ(package)で構成されます。
インポート(import)することで必要なパッケージを読み込むことができます。
プログラムはmainパッケージから開始されます。この辺りはGoのお作法みたいです。
以下のGoファイルをコンパイルしてから実行するとmain関数の処理が走ります。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { fmt.Println("Hello, world!!") //=> "Hello, world!!" } |
imports
括弧でパッケージのインポートをグループ化できます。
複数のインポートステートメントで1行ずつ書くよりは、グループ化の方がコードがすっきりします。
1 2 3 4 5 6 7 8 |
package main import ( "fmt" "math" ) |
Expoted names
GOでは、最初の文字が大文字で始まる名前は、
外部のパッケージから参照できるエクスポート(公開)された名前です。
(パッケージの中に定義されている定数や関数のこと)
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import ( "fmt" "math" ) func main() { fmt.Println(math.Pi) //=> 3.141592653589793 } |
Functions
関数は0個以上の引数を取ることができます。
Goでは変数名の後ろに型名を書きます。
関数の引数でも型を宣言して、関数の戻り値にも型を宣言してあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import "fmt" func add(x int, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) //=> 55 } |
Functions continued
関数の2つ以上の引数が同じ型である場合は、最後の型を残して省略して記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import "fmt" func add(x, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) //=> 55 } |
Multiple results
関数は複数の戻り値を返すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package main import "fmt" func swap(x, y string) (string, string) { return y, x } func main() { a, b := swap("hello", "world") fmt.Println(a, b) //=> world hello } |
Named return values
Goでの戻り値となる変数に名前をつけることができます。
名前をつけた戻り値の変数を使うと、returnステートメントには何も書かずに戻すことができます。これをnaked returnと呼びます。
naked returnは長い関数で使うと読みやすさ(readability)に悪影響を及ぼすので、短い関数でのみ使うようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import "fmt" func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum -x return } func main() { fmt.Println(split(17)) //=> 7 10 } |
Variables
varステートメントは変数(variables)を宣言します。
関数の引数リストと同じように、複数の変数の最後に型を書くことで、変数のリストを宣言できます。
varステートメントはパッケージ、または、関数で利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" var c, python, java bool func main() { var i int fmt.Println(i, c, python, java) //=> 0 false false false } |
Variables with initializers
var宣言では、変数ごとに初期化子(initializer)を与えることができます。
初期化子が与えられている場合、型を省略できます。その変数は初期化子が持つ型になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" var i, j int = 1, 2 func main() { var c, python, java = true, false, "no!" fmt.Println(i, j, c, python, java) //=> 1 2 true false no! } |
最後に
型宣言するのが新鮮で楽しかったです。
引き続きGoを学んでみようと思いました。
また記事書きます!