Pythonで作成したものをGoに移植する上で調査したメモ
Visual Studio CodeのGo Extensionを使用している。
GO開発用ダウンロード Microsoft Windows版1.18.1 https://go.dev/dl/
【2022年最新版】VSCodeをPython超特化型にする、最高の拡張機能20選まとめ。 【VisualStudio Code】【プラグイン】
下記の拡張機能をインストール
VSCodeのターミナル上でbuildコマンドを入力する。
複数ファイルはある場合、スペース区切りでgoファイルを指定する。
「-o」オプションで実行ファイル名を指定する。
> go build -o executename.exe main.go test.go
powershellでenvを設定する。この環境変数設定方法は、powershellのセッション内だけで有効。
GOOSやGOARCHの一覧は下記コマンドで取得できる。
>go tool dist list linux/arm linux/arm64
ラズパイ用の実行ファイル生成コマンド
> $env:GOOS = "linux" > $env:GOARCH = "arm" > go build -o executename main.go test.go
環境変数を取り除く場合
> rm env:GOOS > rm env:GOARCH
Go公式のインデントの指定はスペースではなく「タブ」
go用のコメントのいいのがなかったので、今回はC#版のドキュメント コメント方式を採用した。
https://www.tairax.com/entry/Csharp/Document-Comment
スラッシュ3つは、Goでは分割されてしまうので2つとする。
// <summary> // イヌの飼い主のメッセージを取得 // </summary> // <param name="ownerAge">年齢</param> // <param name="ownerName">名前</param> // <returns>メッセージ</returns> public string GetDogMessage(int ownerAge, string ownerName)
Go 言語の定数は、const キーワードを使用して定義します。
型の指定も可能であるが、通常は型を指定せずに記述する。
定数の命名規則はないが、定数は先頭のみ大文字またはすべて大文字を使用し、単語を区切るにはアンダースコアを使用する。
スコープを考慮して、先頭が大文字ならパッケージ外からもアクセス可能、英小文字ならプライベート扱いとする。
const ( DATE_FORMAT = "20060102" TIME_FORMAT = "15:04:05.000" )
文字列の囲みは、二重引用符(ダブルクォーテーション)を使う。
複数行にまたぐ文字列はバッククォート (backquote) で囲む
Golang にて複数行にまたぐ文字列を簡単に扱う方法
C#の用に文字列のメソッドになっていない。
✕ "abc".Length ◯ len("abc")
普通にある。
パッケージ fmtを使用する。改行コードは“\n”
https://xn--go-hh0g6u.com/pkg/fmt/
import ( "fmt" ) str := "Go" fmt.Printf("文字列 = %s\n", str)
Fprint, Sprintln, Printf…などいろいろある。
【Go】print系関数の違い
標準 | 標準出力に出力します。 |
---|---|
接頭辞 F | 書き込み先を明示的に指定 |
接頭辞 S | 結果を文字列で返す |
接尾辞 f | フォーマットを指定 |
接尾辞 ln | オペランド間にスペース、最後に改行を追加 |
Goのtimeパッケージのフォーマットは独特だ。普通のUnixのstrftimeとかだとフォーマット文字列は%Yとか%mといった文字列なのだけど、Goの場合はそのかわりにある種の「サンプル文字列」を与えるという仕組みになっている。
アメリカ式の時刻の順番なのだ。“1月2日午後3時4分5秒2006年”(つまり「自然な順番」で1, 2, 3, 4, 5, 6)
n := time.Now() fmt.Println(n) // 2016-03-25 19:05:54.785208 +0900 JST fmt.Println(n.Format("2006-01-02")) // 2016-03-25 fmt.Println(n.Format("2006-01-02 15:04:05")) // 2016-03-25 19:05:54
Goの日付フォーマットでミリ秒、マイクロ秒、ナノ秒を取得するには
t := time.Date(2020, 2, 3, 14, 26, 31, 123456700, time.Local) fmt.Println(t.Format("2006/01/02 15:04:05.000")) // ミリ秒 2020/02/03 14:26:31.123 fmt.Println(t.Format("2006/01/02 15:04:05.000000")) // マイクロ秒 2020/02/03 14:26:31.123456 fmt.Println(t.Format("2006/01/02 15:04:05.000000000")) // ナノ秒 2020/02/03 14:26:31.123456700
Go言語にはtry~catch~finallyの例外処理は存在しません。
http://golang.jp/go_faq#exceptions
例外(exception)がない理由は?
我々は、処理構造を制御するためのtry-catch-finally形式の例外処理機構によって、コードが入り組んでしまうと考えています。
なぜGo言語はエラー返却に例外機構を使わないのか
Go言語ではエラーを処理するためにerrorインタフェースが用意されています。
defer へ渡した関数の引数は、すぐに評価されますが、その関数自体は呼び出し元の関数がreturnするまで実行されません。
C#やJava の finally よりも go の defer のほうが筋が良さそうだ
または私は如何にして例外するのを止めて golang を愛するようになったか
Defer を使って、ある関数を確実に後で呼ばせることができる。 これは後片付けにしばしば使われる機能だ。 他の言語だと ensure や finally といったキーワードを使う場面で、Go では defer を使う
サンプルで学ぶ Go 言語:Defer
osパッケージのArgsを使用する。
args[0]には実行内容が入りますので、実際の内容はargs[1]から入ります。
【Go】コマンドライン引数を扱う。flagとos.Args
VSCodeからデバッグ実行した場合、args[0]には“__debug_bin.exe”が入る。
ファイル名までのフルパスが exe に格納される。
exe, err := os.Executable() file_path = filepath.Base(exe)
path/filepathパッケージを使用する。
package main import ( "path/filepath" ) func main() { name := "/path/to/dir/filename.txt" extname := filepath.Ext(name) println(extname) // .txt basename := filepath.Base(name) println(basename) // filename.txt dirname := filepath.Dir(name) println(dirname) // /path/to/dir dirname, basename = filepath.Split(name) println(basename) // filename.txt println(dirname) // /path/to/dir/ (Dir と違って最後に / が付いてる) }
ioパッケージを使用する。
フォルダ名は、フルパスで指定すればいい。
if _, err := os.Stat(new_path); err != nil { os.Mkdir(new_path, 0777) }