再帰処理してみた
2016/11/30
はじめに Go言語を使っているときに、「再帰処理できるのか?」と疑問に思ったので試してみました。 どういった問題が再帰処理に向いているのか分からないので、とりあえず素数判定の処理を作成しています。 素数判定 標準入力された数値が素数か判断するプログラムです。 これを元に、標準入力された数値以下の素数をすべて出力するプログラムも作ってみました。 おわりに 今回は、再帰処理が行えることの確認がメインテーマです。100万以下のすべての素数を求めたところ、2時間20分かかりました。効率とか速度とかは度外視しているので、その辺は何卒ご容赦下さい。 学生時代、再帰処理の課題に苦労し「全部while文でいいじゃねぇか」と思っていましたが、再帰処理が使えてよかったと思える場面が来るのでしょうか。
8進数のエラーについて
2016/11/30
はじめに Go言語を使っていたら見慣れないエラーが出てたので調べてみました。 エラーの内容 試験用にサンプルの日付データを作っていたら、以下のようなコンパイルエラーとなりました。 malformed octal constant malformed integer constant: 08 エラーとなった原因のコードはこちらです。 t = time.Date(2016, time.Month(11), 08, 00, 00, 00, 00, time.Local) 原因 Go言語は先頭に0が付いた数値を8進数だと認識します。08は8進数としては存在しない値のためエラーとなってしまうのでした。同様に、09も同じエラーとなります。 対策 単純に対策をするのであれば、以下のように08から0を除いてしまえばエラーは解消されます。 t = time.Date(2016, time.Month(11), 8, 00, 00, 00, 00, time.Local) どうしても08、09と記載したい、そんなときには、数値を"で囲って文字列として指定しておき、文字列から数値に変換させれば大丈夫です。ただし、標準で用意されているstrconv.Atoi関数は2つの戻り値を返すので、そのままでは使えません。以下のように、変換用の関数を用意する必要があります。 package main import ( "fmt" "os" "strconv" "time" ) func main() { t := time.Date(2016, time.Month(atoi("11")), atoi("08"), atoi("00"), atoi("00"), atoi("00"), atoi("00"), time.Local) fmt.Println(t) } func atoi(str string) int { num, err := strconv.Atoi(str) if err !…
Go言語で構造体のスライスを扱ってみる
2016/11/30
Go言語で構造体のスライスを扱おうとしたときに少し悩んだので、まとめておきます。 ここで構造体やスライスについて詳しく説明はしません。詳細はA Tour of Goなどに記載されているので、そちらをご確認下さい。 今回は、構造体を要素として持つスライスを扱う方法をまとめています。 いろいろな操作 要素にする構造体 今回の説明で使用する構造体は以下の通り定義されています。 社員番号(number)と名前(name)を持つ社員(employee)型です。スライスで複数人の社員情報をまとめて扱うようなイメージです。 type employee struct { number int name string } スライスの作成 以下のようにmake関数を使えば、要素数が0のemployee型のスライスを作成することが出来ます。 employees := make([]employee, 0) スライスの作成と初期化をまとめて行うこともできます。 employees := []employee{employee{1, "Taro"}} 複数の要素を持つスライスを1行で書くことも可能です。 employees := []employee{employee{1, "Taro"}, employee{2, "Jiro"}, employee{3, "Saburo"}} 要素の追加 既存のスライスに対して、要素を追加させるには以下のように記載します。 employees = append(employees, employee{4, "Shiro"}) 要素の削除 組込み関数にはスライスの要素を削除する仕組みは実装されていません。そのため、個別に関数を作成する必要があります。例としては、以下のような関数で要素の削除機能が実現できます。 func delete(employees []employee, n int) []employee { result := make([]employee, 0) for i, v := range employees { if i != n { result = append(result, employee{v.…