2009年11月14日土曜日

Google GoでFizzBuzz

新しい言語に触れるときは,ループや条件分岐が必要なのでFizzBuzzを書いてみることにしている。

switchを使ったものと配列を使ったもの、それをメソッドとして呼び出すものの2+1パターンを書いた。

package main
import "fmt"

//switchを使ってみる
func fizzbuzz1(limit int)
{
for n:=1; n<=limit; n++{
switch{
case n%15==0:
fmt.Print("FizzBuzz");
case n%5==0:
fmt.Print("Buzz");
case n%3==0:
fmt.Print("Fizz");
default:
fmt.Print(n);
}
fmt.Printf("\n");
}
}

//配列を使ってみる
func fizzbuzz2(limit int)
{
var arr [15]string =
[15]string{"Fizzbuzz","","","Fizz","","Buzz","Fizz","","","Fizz","Buzz","","Fizz","",""};
for i := 1; i <= limit; i++{
if str := arr[i%15]; len(str) == 0{
fmt.Printf("%d\n",i);
}else{
fmt.Printf("%s\n",str);
}
}
}

//メソッドらしきもの
//Hoge型
type Hoge int
func (limit Hoge)fizzbuzz_hoge()
{
fizzbuzz1(int(limit));
}

func main()
{
fmt.Printf("**fizzbuzz1**\n");
fizzbuzz1(15);
fmt.Printf("**fizzbuzz2**\n");
fizzbuzz2(15);
fmt.Printf("**fizzbuzz_hoge**\n");
//明示的にHoge型だと指定しないとintだと思われてコンパイルエラー
var hoge Hoge = 15;
hoge.fizzbuzz_hoge();
}

switchはcaseの部分に色々書ける。if-elseif-elseをswitchとして書ける、ということなのだろう。

配列の要素数は型の前に書く。配列内の""のところにnilと書こうとしたけどコンパイラに怒られた。残念。

メソッドらしきもののところは、最初は(limit int)と書いて、3.fizzbuzz_hoge()で呼び出せるようにしたかったけど、intはnon-local typeじゃないので新しいメソッドを定義できないと言われる。仕方ないのでHoge型を作って呼び出すようにした。

0 件のコメント:

コメントを投稿