hakeの日記

Windows環境でプログラミングの勉強をしています。

golang

Go言語 - データベースを使用する - sqlite3

go言語でsqlite3を使用してみる。 Windows 64bitで下記の方法だと、コンパイル時に何故かgccを要求されます。コンパイルに通常よりも時間がかかるのでgccを利用した何かを行っている? なお作成されたexeファイルの実行はgcc環境がなくてもOKでした。 入手先…

Go言語 - ファイルの存在確認

Packagesドキュメントに、そのものの機能が見つからなかったのでメモ package main import ( "fmt" "os" ) func Exists(filename string) bool { _, err := os.Stat(filename) return err == nil } func main() { if b := Exists("sample.txt"); b { fmt.Pri…

Go言語 - 式の構文解析 - 演算子順位法

再起下降法と比較してのメリットは、演算子の優先度に応じてparse関数を作成する必要がなく、演算子の優先順位・結合方向をデータとして与えるだけで良いということ。 ident1 op1 ident2 op2 ident3 op3 ……上記のような並びの式の場合、演算子op1とop2の優先…

Go言語 - 構造体の埋め込みをクラスの継承っぽく使用

埋め込んだ構造体の初期化を、その構造体の初期化関数で初期化するにはどうすれば良いのかわからなかったけれども、レシーバ.埋め込んだ構造体名.関数名()で埋め込んだ構造体に定義した関数を呼べるみたいなので初期化用関数Super()を作ってテスト。 ただし…

Go言語 - 平行処理

平行処理を行うゴルーチンの確認。フィボナッチ数列の10万項までの計算を2回行う処理にかかる時間を計ってみる。 ゴルーチン側で処理が終了したタイミングでチャンネル送信して、メイン側を受信したのち終了させる。結果はゴルーチンを使用した方が半分強く…

Go言語 - PEGで構文解析 - 構文木の作成

PEGで構文木を作成するプログラムを書いてみました。 簡易化の為に、識別子(ident)と代入演算子(=)と加算演算(+)のみ解析して、ポーランド表記で出力します。 構文 root <- expression EOT / expression <.+> EOT / エラー用 <.+> EOT エラー用 EOT <-…

Go言語 - PEGで構文解析 - 字句解析

Go言語でPEGによる構文解析方法があることを知ったので、簡単な字句解析部分のみのプログラムを書いてみました。ruleの書き方はgoyaccよりも融通が利いて便利そうです。 参考サイト GolangとPEGで作る言語処理系 vol.1 入手先および構文の書き方 GitHub - po…

Go言語 - データのランダムシャッフル

ライブラリにシャッフルがなさそうだったので作成。Fisher-Yates shuffleというアルゴリズムを使用しました。 package main import "fmt" import "time" import "math/rand" func shuffle(list []int){ for i := len(list); i > 1; i-- { j := rand.Intn(i) …

Go言語 - 巨大な数を扱う

math/bigライブラリを使用することで巨大な整数や有理数を扱うことができます。 フィボナッチ数列を表示するプログラム。 package main import ( "fmt" ) func main() { var f0 uint64 = 1 var f1 uint64 = 1 for i := 1; i < 100; i++ { fmt.Println(i,f0) …

Go言語 - 無名関数とクロージャ

ある関数foo内で定義された無名関数は、foo内のローカル変数にアクセスできる。 package main import "fmt" func foo() { var s string = "hello foo" f := func(){ fmt.Println(s) } f() } func main() { foo() //-> hello foo } 関数fooの戻り値として返さ…

Go言語 - EXCELファイル操作

xlsx形式のエクセルファイルを読んだり、新規作成したりできます。 ただし、xlsxファイルを開いて、そのファイルを変更保存する。あるいは変更した内容を別名保存すると、その保存したファイルをExcelで開くときに内容を修復する旨のメッセージがでます(Exc…

Go言語 - goyaccで構文解析

Go言語にはgoyaccという構文解析ツールがあるので一番単純な整数の四則演算を行うプログラムを作成してみました。 以下は作成のポイントとなるメモです。 参考サイト goyaccで構文解析を行う lex.Lexer(lex/lexer.go) 先日作成した字句解析プログラムを少…

Go言語 - Set(集合)

本日からGo言語の使用環境は、go version go1.5.1 windows/amd64 です。 Goでsetを扱う方法を見てSet型を作成してみました。

Go言語 - WALKでGUI - ListBox

ListBoxの使用例。ウィンドウ上がListBox。 表示項目をstringのスライスにしてModelフィールドに置くことで表示させます。各項目はクリックおよびダブルクリックでイベントが発生します。 ボタンクリックで項目を追加しています。方法はListBox.Model()で項…

Go言語 - 字句解析プログラム

勉強がてら字句解析プログラムを作成してみました。 Lexser.Scan()を実行する毎に、sample.txtから一文字(rune)ずつ読み込み、1トークンを読み込んだら、そのトークンの書かれている行、桁、トークン種類、トークンリテラル文字列を表示します。 数字はNUM…

Go言語 - WALKでGUI - DialogBox

DialogBoxの使用例。 DialogBoxで入力した文字列をMain Windowに表示させています。 Main側と同様にDialogのレイアウトと実体用の構造体を用意します。一点だけ追加として、DefaultButtonとCancelButtonフィールドに各々対応するPushButtonの実体を割り当て…

Go言語 - WALKでGUI - MessageBox

MessageBoxの使用例。 ボタンクリックでMessageBoxを作成し表示させています。 4番目の引数でメッセージボックスのスタイルを指定しています。また各々のスタイルのボタン種類で戻り値が変わるので、戻り値に応じた処理が必要になります。

Go言語 - break先のラベルの位置

二重のforループからの脱出先として、forブロックの下にラベルを書いたらエラーになりました。どうやらforブロックの上に書くのが正解みたい。 感覚的にはブロックの下の方が正しいように思えます。何故上なのだろう? package main import "fmt" func main(…

Go言語 - WALKでGUI - FileDialog

FileDialogの使用例。 ボタンクリックでFileDialogを作成し表示させています。 walk.FileDialog構造体を作成して、ShowOpenメソッドで表示させます。ダイアログがキャンセルで閉じられた場合には戻り値のokがfalseになり、trueの場合はFilePathフィールドか…

Go言語 - WALKでGUI - 単独起動する実行ファイルの作成

WindowsでWALKライブラリを使用したGUIアプリケーションの起動には、マニフェストファイルを同じ場所に置いておく必要がありましたが、rsrcというツールでマニフェストファイル(とアイコンファイル)を実行ファイル内に取り込むことで単独起動するファイル…

Go言語 - WALKでGUI - Menu

Menuの使用例。以下の構造のメニューを作成しました。 File Else ├ Open └ About ├ SubMenu | └ SubItem1 └ ExitMainWinsdowのMenuItemsフィールドにMenuウィジェットを階層的に置いていき末端の項目にはActionウィジェットを置いています。 各ActionのOnTr…

Go言語 - WALKでGUI - RadioButton

RadioButtonの使用例。起動時にRadioButtonを選択してある状態にする方法がわからない。。。 RadioButtunをRadioButtonGroupBoxの中に配置することで、そのグループ内で排他選択ができるようになります。各RadioButtonウィジェットから、そのボタンが選択さ…

Go言語 - WALKでGUI - CheckBox

CheckBoxの使用例。 CheckBoxも状態を保持するので、MyMainWindow構造体に変数を追加し、実体としてアサインします。 二つのCheckBoxをGroupBoxの下に配置して、LayoutフィールドをHBoxにすることでCheckBoxを水平に並べています。また、Check1のCheckedフィ…

Go言語 - WALKでGUI - ComboBox

ComboBox(プルダウンメニュー)の使用例。 ComboBoxは状態を保持するので、MyMainWindow構造体に変数を追加し、実体としてアサインします。 Modelフィールドで表示する項目を、CurrentIndexフィールドで初期値を設定しています。 選択項目を変更すると、OnC…

Go言語 - 省略書式の変数宣言とスコープで悩んだ点(Go1.5)

以下のプログラムでは、forブロックの中で関数hogeの戻り値を取得しています。 このとき変数 err が初めて登場したため ' = ' ではなく ' := ' を使用したのですが、こうすると変数aもforブロック内のローカル変数と判断されてしまいます。このため、ループ…

Go言語 - WALKでGUI - 部品を並べる

とりあえずPushButtonを並べてみる。 縦に並べる MainWindowのLayoutフィールドにVBoxを指定して、Childrenフィールドの[]Widgetに部品を入れていく。 ちなみにLayoutをHBoxにすると横に並びます。 package main import ( "github.com/lxn/walk" . "github.c…

Go言語 - エラー時の戻り値

Go言語にはerror型インターフェースが定義されているので、これに適合するエラー用構造体を作成して、エラー時にはこの構造体をerror型として返す。 正常終了時には、nil リテラルを返すようにする。 package main import ( "fmt" ) /* Goで定義されているer…

Go言語 - WALKでGUI - 何もないウィンドウ

ネット上に(日本語の)情報がほとんど無いのでドキュメントを見ながら勉強。 環境は、Windows8.1(32bit)上のGo言語1.5+WALKライブラリです。 ドキュメントは、GoDocServerを起動した状態で、 http://localhost:6060/pkg/github.com/lxn/walk/を参照。walk直…

Go言語 - 複数ファイルのコンパイル

同packageの場合 他ファイル中の小文字で始まる関数や変数も参照可能。 同じフォルダに置きソースファイル名を指定しないでコンパイルする。実行ファイル名はフォルダ名になる。 \add\main.go \add.go main.go package main import ( "fmt" ) func main() { …

Go言語 - 正規表現

日本語も一文字として認識してくれるみたい。 でも、文字の位置を返すメソッドはバイトスライスの位置なのでで注意。 package main import ( "fmt" "regexp" ) func main() { s := "aあbいcうdえeおf" // 正規表現にマッチするかの有無 fmt.Println(regexp.M…