概要
Rubyを学習して半年たちたまには別言語を学びたいなと思いGoを少し触ってみました。
RubyとGoの違い(FizzBuzz)
RubyでFizzBuzz問題をとく場合for,whileなど色々書き方がありますが今回はtimesメソッドで書きました。
1..100.times do |i|
if i%15==0
puts "FizzBuzz"
elsif i%3==0
puts "Fizz"
elsif i%5==0
puts "Buzz"
else
puts i
end
end
Goで書いた場合は下記のようになりました。
package main
import (
"fmt"
)
func main() {
for i := 0; i < 100; i++ {
if i%5 == 0 && i%3 == 0 {
fmt.Println("Fizz Buzz")
} else if i%3 == 0 {
fmt.Println("Fizz")
} else if i%5 == 0 {
fmt.Println("Buzz")
} else {
fmt.Println(i)
}
}
}
簡単なプログラムを組んだだけでも Rubyと比較して違う点がいくつかありましたので、自分なりにまとめてみました。
- packageについて
- importについて
- 繰り返し処理について
- := について
package
Goではプログラミングに関する要素は何かしらのパッケージというものに属しており 必ずパッケージの宣言をしなければいけません。
試しに空のファイルを作成しgo run test.go
を実行したところexpected 'package', found 'EOF'
といったエラーが出力されました。
そのため下記のコードのようにパッケージ、またmain関数がなければ、実行時にエラーとなってしまいます。
package main
func main() {
}
import
Goではmainパッケージの中に書かれていない関数を使う場合、その関数を持つパッケージ名を記載しなければなりません。
これはRubyのライブラリの中の標準ライブラリ
のようなイメージですね。
Rubyの場合
require 'Time'
p Time.strptime('2020-03-21T01:58:30+09:00', '%Y-%m-%dT%H:%M:%S%z')
# -> 2020-03-21 01:58:30 +0900
Goの場合
package main
import("fmt")
func main() {
fmt.Println("Hello World")
// -> Hello World
}
繰り返し処理
Rubyでは繰り返し処理を行う際,for,while,timesなど色々な書き方があります。
Goでは繰り返し処理にはfor文のみです。
しかし下記のようにforeachのように書くことも可能です。
package main
import (
"fmt"
)
func main() {
fruits := map[string]string{
"apple": "りんご",
"banana": "バナナ",
"pineapple": "パイナップル",
}
for key, value := range fruits {
fmt.Println("key:", key, " value:", value)
}
}
// key: apple value: りんご
// key: banana value: バナナ
// key: pineapple value: パイナップル
:=について
goで明示的に変数を定義する場合下記のように記載します。
package main
import ("fmt")
func main() {
var x,y,z int
x = 1
y = 2
z = 3
fmt.Println(x)
fmt.Println(y)
fmt.Println(z)
}
// 1
// 2
// 3
しかし、暗黙的に変数を定義することも可能でその場合は下記のようになります。
package main
import ("fmt")
func main() {
x := 1
y := 2
z := 3
fmt.Println(x)
fmt.Println(y)
fmt.Println(z)
}
// 1
// 2
// 3
型の指定を省略することができるためこちらで書いた方が開発効率をあげることができます。