ユーザ用ツール

サイト用ツール


it技術:go

Go

Pythonで作成したものをGoに移植する上で調査したメモ

開発環境

Visual Studio CodeのGo Extensionを使用している。
GO開発用ダウンロード Microsoft Windows版1.18.1 https://go.dev/dl/

拡張機能

実行ファイル作成

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")

switch case文

フォーマット書式

パッケージ fmtを使用する。改行コードは“\n”
https://xn--go-hh0g6u.com/pkg/fmt/

import (
    "fmt"
)
 
str := "Go"
fmt.Printf("文字列 = %s\n", str)

print系関数

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

defer へ渡した関数の引数は、すぐに評価されますが、その関数自体は呼び出し元の関数がreturnするまで実行されません。

C#やJava の finally よりも go の defer のほうが筋が良さそうだ
または私は如何にして例外するのを止めて golang を愛するようになったか
Defer を使って、ある関数を確実に後で呼ばせることができる。 これは後片付けにしばしば使われる機能だ。 他の言語だと ensure や finally といったキーワードを使う場面で、Go では defer を使う
サンプルで学ぶ Go 言語:Defer

配列およびリスト処理

  • スライス(slice)が他の言語でいうところの「配列」みたいなもの
  • マップ(map)が他の言語でいうところの「連想配列」みたいなもの

コマンドライン引数の処理

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)

Go で実行ファイルのパスを取得

ファイル関連

パス操作

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 と違って最後に / が付いてる)
}

ファイル読み書き

フォルダ未存在時作成

フォルダ名は、フルパスで指定すればいい。

if _, err := os.Stat(new_path); err != nil {
    os.Mkdir(new_path, 0777)
}

HTTP クライアント

it技術/go.txt · 最終更新: 2023/07/19 21:59 by yajuadmin