Go モジュールの編成

先日バズってた Go のプロジェクトディレクトリの正式見解というか本家の推奨記事. 気になってたので、読んでみた 以下翻訳結果 ファイルやフォルダのレイアウトに関して、Go を初めて使う開発者によくある質問は「Go プロジェクトをどのように整理すればいいのか」というものです。このドキュメントの目的は、この質問に答えるためのガイドラインを提供することです。このドキュメントを最大限に活用するために、チュートリアルを読み、モジュールソースを管理することで、Goモジュールの基本に精通していることを確認してください。 Go プロジェクトには、パッケージ、コマンドライン・プログラム、またはその 2 つの組み合わせがあります。このガイドはプロジェクトの種類別に構成されています。 基本パッケージ 基本的なGoパッケージは、すべてのコードがプロジェクトのルートディレクトリにあります。プロジェクトは1つのモジュールで構成され、1つのパッケージで構成されます。パッケージ名はモジュール名の最後のパスコンポーネントと一致します。単一のGoファイルを必要とする非常に単純なパッケージの場合、プロジェクトの構造は次のようになります: project-root-directory/ go.mod modname.go modname_test.go [この文書中、ファイル名/パッケージ名は完全に任意です]。 このディレクトリが github.com/someuser/modname のGitHubリポジトリにアップロードされていると仮定すると、 go.mod ファイルのモジュール行には、 module github.com/someuser/modname と書かれているはずです。 modname.go のコードでパッケージを宣言します: package modname // ... パッケージのコードはここ ユーザーは、Goのコードでこのパッケージをインポートすることで、このパッケージに依存することができます: import "github.com/someuser/modname" Goパッケージは複数のファイルに分割することができます: project-root-directory/ go.mod modname.go modname_test.go auth.go auth_test.go hash.go hash_test.go ディレクトリ内のファイルはすべてmodnameパッケージを宣言している。 基本コマンド 基本的な実行可能プログラム(またはコマンドラインツール)は、その複雑さとコードサイズに応じて構成されます。最も単純なプログラムは、 func main が定義された1つのGoファイルで構成されます。より大きなプログラムでは、コードが複数のファイルに分割され、すべて main パッケージを宣言します: project-root-directory/ go.mod auth.go auth_test.go client.go main.go ここで main.go ファイルには func main が含まれているが、これは単なる慣例である。main ファイルは、modname.go(modnameの適切な値に対して)とか、他の名前にすることもできる。 このディレクトリが github.com/someuser/modname のGitHubリポジトリにアップロードされていると仮定すると、 go....

2023-09-24 ·  2023-09-24 · 2 分 · 244 文字

slices.Contains について少し調べた

slices.Contains を使用しようとして、コンパイルエラーになったので、少し中身を追ってみた 以下が、実際の実装部分 slices.go func Contains[S ~[]E, E comparable](s S, v E) bool { return Index(s, v) >= 0 } Genericsを使用していて、E は comparable で S はその E の Sliceかー。 では、S ~[]E の ~ とはなんだろうか? 以下 ChatGPT さんの回答 S ~[]E の表記は、Goの新しいジェネリクス機能において、型Sが型Eのスライスであるという制約を示します。この制約は、ジェネリクス関数やジェネリクス型を定義する際に使用されます。 ~ 演算子は、“型の等価性"を示すために使用されます。具体的には、S が []E という具体的な型であるか、それに等価な型(例えば、型エイリアスなど)である必要があります。 例えば、以下のような型があるとします: type MyInt int type MySlice []MyInt この場合、Contains[MySlice, MyInt] のように関数を呼び出すことができます。なぜなら、MySlice は []MyInt に等価であり、MyInt は int に等価だからです。 この ~ 演算子と型制約は、Goのジェネリクスが提供する強力な型安全性を維持する一方で、柔軟性も提供します。それによって、コンパイル時に型の不一致や他の型関連のエラーを防ぐことができます。 ~ は それに等価な型という制約 comparable な 型の Slice のようなものは許す みたいな感じか...

2023-09-14 ·  2023-09-23 · 1 分 · 74 文字

SQLAlchemy で Flake8 error: E712 comparison to True should be 'if cond is True:' or 'if cond:' の lint エラーに対応する

発生したのは、以下のような sqlalchemy での条件文が flake8 の lint エラーになったので、対応したかった。 Flake8 error: E712 comparison to True should be 'if cond is True:' or 'if cond:' 実装していた処理は以下 ExampleModel.sa.delete_flag == True これが lint エラーになるからって、以下にすると、解消するけど、うまく動かない(条件判定がおかしくなる) 落とし穴!!! ExampleModel.sa.delete_flag is True # または ExampleModel.sa.delete_flag # 上記や、上記の否定など not ExampleModel.sa.delete_flag 結論としては、sqlalchemy.sql.expression.true, sqlalchemy.sql.expression.false あるからそれ使う # import from sqlalchemy import false, true # ussage ExampleModel.sa.delete_flag == true() いやいやいや… Refs python - Flake8 error: E712 comparison to True should be ‘if cond is True:’ or ‘if cond:’ - Stack Overflow python - SQLAlchemy Core select where condition contains boolean expression is False - Stack Overflow Column Elements and Expressions — SQLAlchemy 2....

2023-08-16 ·  2023-09-22 · 1 分 · 100 文字

GoReleaser を GitHub workflow で設定する最低限の方法

手っ取り早くリポジトリの WorkFlow つかって Go の リリースを実装する為の設定をメモしておく v0.0.1 みたいな形式のタグを打てばリリースされる こんな感じのヤツ 1. goreleaser init で .goreleaser.yaml を生成する デフォルトでこんな感じで生成される # This is an example .goreleaser.yml file with some sensible defaults. # Make sure to check the documentation at https://goreleaser.com before: hooks: # You may remove this if you don't use go modules. - go mod tidy # # you may remove this if you don't need go generate - go generate ./... builds: - env: - CGO_ENABLED=0 goos: - linux - windows - darwin archives: - format: tar....

2023-08-09 ·  2023-09-24 · 2 分 · 274 文字

Docker mysql 5.7 イメージで初期化処理に失敗して、ログインできない

発生したエラー MySQL 5.7 のイメージ を使用して単純に起動しても下記エラーが発生して、初期化処理に失敗していた。 厳密には初期化時に上記エラーが出て、初期化SQLまでたどり着かなかった。 初期化処理に失敗すると、mysql userの設定や admin パスワードの設定がうまくできないようで、どうしようもない状態になるようで、、これをなんとかしたかった… /usr/local/bin/docker-entrypoint.sh: line 137: 126 Killed "$@" --skip-networking --default-time-zone=SYSTEM --socket="${SOCKET}" ログをみると怪しい部分は上記のみで、どうもプロセスがいきなり Kill されているように見える 原因はリソースの使いすぎ 以下のようなコメントにたどり着いた 1708115 – Running mysql container in moby-engine results in 100% memory usage Really high memory usage · Issue #579 · docker-library/mysql Thank you so much @evolbug! The bug you found put me on the right tracks. The issue is caused by the ulimit nofile. By default, on arch, the value is too low I guess....

2023-08-04 ·  2023-09-24 · 2 分 · 305 文字