- 1. はじめてのGO のメモ
- 2. Goを始める時に役立つ資料
- 3. Go開発入門 静的チェックツール編
- 4. Goのポインタを図解で理解する。
- 5. Go言語の「zserge/lorca」で「Microsoft Edgeは自動テスト ソフトウェアによって制御されています」を消したい
- 6. go generics の練習
- 7. GO言語 インストール Windows10
- 8. Go + MySQL + React のDocker開発環境を作成する
- 9. 【Golang】Base62 に標準ライブラリで変換する
- 10. [Go/gin] GETリクエストに配列でパラメータを渡す方法
- 11. Go開発入門 テーブル駆動テストと並列実行
- 12. 【Go】Go 1.16以降のバージョンで「go get」でのdelveインストール時に「dlv: not found」になる
- 13. AWS Distro for OpenTelemetryのCollectorとGo SDK on Traces Instrumentation
- 14. GoでGitHubへpushする前にmakeコマンドでprecommitする方法
- 15. Golang GitHubトレンドデイリーランキング!!【自動更新】
- 16. 【Go】パスパラメータを使用するときの注意点やエラーハンドリングなど
- 17. 【Golang / Gorm】URLのクエリパラメータでレコードをフィルタして取得するにはどうすればいいの?
- 18. 【Go】Hexagonal Architectureに関するまとめと実装例
- 19. GORMを使ったDockerのPostgreSQLへの接続方法
- 20. 外部コマンドのstdout/stderrをzapに送る
はじめてのGO のメモ
# はじめに
何となくGOを使ってみたいなと思い、linux に環境をインストールしてtutorial を行ったので、メモしておきます。
インストールについては、GOのページに書いてある情報で全く困らなかったので、tutorial のところだけメモしておきます。https://go.dev/learn/
https://go.dev/doc/tutorial/getting-started
全くGOについて知識がないので、間違えがあるかもしれませんがご容赦ください。
# メモ
### Module file
以下のファイルがあり “`go run . “` とするとHello world ができるか、と思いきや、できませんでした。
“`golang:hello.go
package mainimport “fmt”
func main() {
fmt.Println(“Hello, World!”)
}
“`“`
$ go run .
go: go.mod file not found in current directory or any
Goを始める時に役立つ資料
何か言語を学びたいので、学びながら良かった記事をまとめていきます。
学んで何か作ってみないと、言語の良し悪しはわからないのでガンガンいきましょう。まだ全然マスター出来てませんが、特別に良いなーと思ったのは
1位 Haskell
2位 Rust
3位 OCaml, F#
4位 C++
5位 JavaScript
6位 Pythonでした。
難易度が高い言語が上位ですが偶然です。
学習コストは低ければ低いほど良いと思ってるので
Goにかなり期待✨学びながらまとめていきます。随時更新
※ 基礎的な文法を一通り見ました。シンプルな良さって感じで良い言語です。
Rustと同位でHaskellの次に好きな言語になりそうです。
ジェネリクスも導入されメッチャ良い言語✨## 日本語リンク集
[A Tour of Go](https://go-tour-jp.appspot.com/list)
[はじめてのGo―シンプルな言語仕様,型システム,並行処理](https://gihyo.jp/dev/feature/01/go
Go開発入門 静的チェックツール編
## はじめに
Goの静的チェックのためのツール群をコマンドとともにいくつか紹介します。
## gofmt
goのコード整形ツールです。
“`
gofmt -l -w main.go
“`## golint
goらしくない書き方を指摘するツールです。
“`
golint .
“`## go vet
goのバグを指摘するツールです。
“`
go vet main.go
“`## errcheck
エラーチェック漏れを指摘するツールです。
“`
errcheck github.com/foo
“`例えば、下記のようなエラーチェックを行っていないと指摘されます
“`
if err := router.Run(); err != nil {
log.Fatalf(“server cant start :%v”, err)
}
“`
https://github.com/kisielk/errcheck## おまけ
フォーマットはエディターで自動化すると良いです。
vscodeの場合は次のような設定をします。
1.
Goのポインタを図解で理解する。
下記のような式があるとします。
“`go
package main
import “fmt”func main() {
var name = “taro”
}
“`
メモリ上では下記のような概略図となっています。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/dbe1e3d1-7b54-ee4a-d953-36556d710f95.png)
型の前に*がついている場合「ポインタ変数」となります。
ポインタ変数には、メモリのアドレスが格納されています。
“`go
var pv *string
“`上記の場合のpvに格納されたアドレスのメモリにはstring型のデータが格納されているという意味となります。
イメージは下記の図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547556/3aa394e4-a7a0-e32b-15bb-73
Go言語の「zserge/lorca」で「Microsoft Edgeは自動テスト ソフトウェアによって制御されています」を消したい
# はじめに
go言語の「zserge/lorca」の実行時、Windows上部に以下の記述が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/e6b05519-56ff-a4ce-e4b8-6cb4347ccde3.png)
非常にうっとうしい。
PythonのSeleniumでも同一事象が起きていて、ネットで消す方法を検索できるが、Go言語で見つからなので、ソースファイルを探ってみた。
# 結論
「github.com\zserge\lorca」のファイル「ui.go」内の以下の記述の「–」を消せばよい。
– “–no-first-run”, → ”no-first-run”,
– “–enable-automation”, → ”enable-automation”,## 「ui.go」の修正箇所
“`Go
var defaultChromeArgs = []string{
“–disable-background-networking”,
“-
go generics の練習
# これは何?
go 1.18 が正式リリースになり。
以前から無くて困っていた generics がようやく入ったので、その練習# 最大値関数
`math.Max` が `float64` しか受け入れない厳しい世界からようやく脱却。
“`go:go1.18
package mainimport (
“fmt”
“time”“golang.org/x/exp/constraints”
)func Max2[T constraints.Ordered](x, y T) T {
if x < y { return y } return x } func main() { fmt.Println(Max2(1, 2)) //=> 2
fmt.Println(Max2(1.11, 2.22)) //=> 2.22
fmt.Println(Max2(“hoge”, “fuga”))
GO言語 インストール Windows10
# 自分のメモ代わりに
# 検証環境
OS:Windows 10 HOME
Visual Studio Code# Go言語のダウンロード
公式サイトへアクセスし、msiファイルをダウンロードする。
https://go.dev/dl/インストーラーを開き、基本的に「Next」→ 「Next」→ と押していけば問題ありません。
※保存先については、あとでパスの設定で必要になる恐れがあるで、メモしておく。# インストールの確認
インストールが終了したら再起動をする。
再起動しないとパスが反映されない場合があるため。
※自分は反映されなかった。再起動したら
コマンドプロンプトを起動してインストールした階層まで移動し以下を入力
“`
go version“`
バージョンが表示されればOK。
※表示されない場合は環境変数を設定## プログラム作成
テキストエディタでプログラム作成し、任意のフォルダー内に置く。
コマンドプロンプトでgo run hello.goと入力し「Hello!」と表示されれば成功。hello.go
“`
package ma
Go + MySQL + React のDocker開発環境を作成する
# はじめに
GoとMySQLとReact(&TypeScript)を使ったポートフォリオ作成をしようと思い、最初に勉強も兼ねてDocker開発環境を作成しました。
そこでQiitaやZennなどで書かれている記事を参考にしていましたが、最終的に他の方とは違う構成になったので自分も記事を執筆しようと思いました。# 作成したもの
ディレクトリ構成
“`
.
├── README.md
├── db
│ ├── data
│ └── my.cnf
├── docker-compose.yml
├── go-app
│ ├── Dockerfile
│ └── main.go
├── react-ts-app
│ ├── .dockerignore
│ ├── Dockerfile
│ ├── README.md
│ ├── node_modules
│ ├── package-lock.json
│ ├── package.json
│ ├── public
│ ├── src
│ └── tsconfig.json
└── var
【Golang】Base62 に標準ライブラリで変換する
> Go 言語(以下 Golang)で、**ハッシュ値の HEX 文字列を Base62 でエンコードしたい**。
つまり **Base16(16進数)のハッシュ値を Base62(62進数)の文字列に圧縮する**ことで、なるべくコリジョンを和らげたいのです。
[「”golang” base62 変換」でググって](https://www.google.com/search?q=%22golang%22+base62+%E5%A4%89%E6%8F%9B)も、外部ライブラリを使う方法ばかりだったので自分のググラビリティとして。
– [ハッシュ?コリジョン?BLAKE3?](https://qiita.com/KEINOS/items/c92268386d265042ea16#ts-dr-%E6%9C%80%E9%80%9F%E3%81%AEdb%E3%82%AD%E3%83%BC%E6%A4%9C%E7%B4%A2%E3%82%92%E6%B1%82%E3%82%81%E3%81%A6-with-sqlite3)
##
[Go/gin] GETリクエストに配列でパラメータを渡す方法
# 結論
– Ginコンテキストの`QueryArray()`をつかって受け取る
– `gc.QueryArray(“params[]”)`
– `gc.GetQueryArray(“params[]”)`
– 構造体にバインドするには、下記の通り
“`go
type Req struct {
Params []int `form:”params[]”`
}
“`# 実装
複数ステータスなどの条件で検索したい時に、フロントエンドから配列でパラメータを送れるようになります。
handlerまでのサンプルを載せておきます。“`bash
curl -X GET ‘http://localhost/hoge/path?params[]=1¶ms[]=2’
“`“`go:main.go
package mainimport (
“net/http”“github.com/gin-gonic/gin”
)func main() {
gin.SetMode(“debug”)
e := gin.Default()assignHan
Go開発入門 テーブル駆動テストと並列実行
## はじめに
テーブル駆動テストとは、
インプットとアウトプットのテーブルについて
1行ずつテストを繰り返すことです。テーブル駆動テストには、下記のようなメリットがあります。
– 並列にテストが実行しやすい
– テストケースの変更が容易
– テストが読みやすい
– テストがどこで失敗したのかがわかりやすいhttps://github.com/golang/go/wiki/TableDrivenTests
本記事では、サンプルとして偶数判定のテーブル駆動テストを並列で実行することを体験します。
サンプルでは、go modを使用しています。## 関数を作成
./is_even.go
“`
package is_evenfunc IsEven(number int) bool {
return (number % 2 == 0);
}
“`## テストを作成
./is_even_test.go
“`
// go test github.com/CobaltSato/mock/unit_test/is_even -parallel 2packa
【Go】Go 1.16以降のバージョンで「go get」でのdelveインストール時に「dlv: not found」になる
## 概要
個人的に開発で使っていたGolangのバージョンが少し古かったので、バージョンを上げてみました。バージョンを上げると、デバッグツールの`delve`も再度インストールする必要があったので、`go get`でインストール操作を実行してみたところ`dlv: not found`というエラーになりました。
今回はそのエラーの対応について、メモ書きします。## 対応
teratailの[dlvインストール後にnot foundと表示される件について](https://teratail.com/questions/366377)に、同じエラーでハマってる記事がありました。回答をざっと確認したところ、`go get`によるインストールではなく`go install`に変更になったそう。[delveのREADME](https://github.com/go-delve/delve/tree/master/Documentation/installation)でも、`go install`を使うように記載されています。
なお、[Go1.16からの go get と go instal
AWS Distro for OpenTelemetryのCollectorとGo SDK on Traces Instrumentation
## AWS Distro for OpenTelemetry
OpenTelemetryは、オープンソースのプロジェクトで、
アプリケーション監視用の分散トレースとメトリックを収集するために、
ライブラリ・API・エージェントが提供されています。
AWS Distro for OpenTelemetryはOpenTelemetryをAWSで使うためのディストリビューションです。OpenTelemetry自体については、[freeCodeCamp.orgの動画](https://www.youtube.com/watch?v=r8UvWSX3KA8)が参考になるかと思います。
## AWS Distro for OpenTelemetry Collector
OpenTelemetry Collectorについては[こちら](https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/design.md)が参考になります。こちらのdocker版サンプルを実施します。
https://git
GoでGitHubへpushする前にmakeコマンドでprecommitする方法
### はじめに
:::note warn
こちらはzennの記事の転載となります。
:::平下CTO@sweeepです。Go言語でGitHubなどへpushする前にmakeコマンドでprecommitをする方法をこちらをサンプルに解説します。→ [GoでファイルのValidation方法など](https://zenn.dev/hirac/articles/dc537f0786cae9)
本記事の内容です。
* precommitの内容
* makeコマンドでprecommit一括実行
* 実行結果
* PR時のprecommit checkリスト### precommitの内容
precommit時のそれぞれの整形/linter/チェックについて以下記します。* goimports: Go言語の標準パッケージでパッケージのインポートを整形し、また、gofmtのルールでコードを整形します。
“`
$ find . -print | grep –regex ‘.*\.go’ | xargs goimports -w -local “github.com/hirac
Golang GitHubトレンドデイリーランキング!!【自動更新】
GitHub Trending をキャッチアップする習慣をつけて、強強エンジニアになろう。
この記事では、Golang のGithubのトレンドデイリーランキングを25位まで紹介します。# トレンドデイリーランキング
## 【1 位】 hashicorp/terraform-provider-azurerm
https://github.com/hashicorp/terraform-provider-azurerm? ***3,228*** star
Terraform provider for Azure Resource ManagerAzureResourceManagerのTerraformプロバイダー
## 【2 位】 cloudreve/Cloudreve
https://github.com/cloudreve/Cloudreve? ***13,731*** star
?支持多家云存储的云盘系统 (Self-hosted file management and sharing system, supports multiple st
【Go】パスパラメータを使用するときの注意点やエラーハンドリングなど
# はじめに
前記事からの続きで、パスパラメータのidでcustomerの個別データを取得するAPIを作成しました。
エラーハンドリングなど、以上のケースにおけるAPI作成にあたっての注意点をメモとしてまとめました。
Go初心者の方の参考になれば幸いです。https://qiita.com/suzuki0430/items/6e9d070bb529f4d91500
# 数値以外のパスパラメータをはじく
idとして渡すパスパラメータが数値のみとなるように、正規表現を使用します。“`go:app.go
router.HandleFunc(“/customers/{customer_id:[0-9]+}”, ch.getCustomer).Methods(http.MethodGet)
“`試しにパラメータに数値以外`ddd`を入力してみると、`404 page not found`が表示されます。
【Golang / Gorm】URLのクエリパラメータでレコードをフィルタして取得するにはどうすればいいの?# 導入
最近GolangでDDDに則ったREST APIを作る勉強をしているのですが、
その中で、「DBにあるレコードをFilterするのはどうやるのが正解なんだ?」というのでかなり詰まってしまってしまいました。普段私が使っているPythonのDjangoだと、ActiveRecordパターンが採用されているのもあり、あまり気にする機会がないのですが、
Golangだと勝手がかなり違う部分だし、ネットで探してもそれっぽいものがなかなか見つからなかったので、記事として共有させていただきます。# やりたいこと
やりたいことはいたってシンプルです。
今回はGoのチュートリアルを参考に【アルバム名】【アーティスト名】【価格】の3つのフィールドを持つレコードが存在していて、
それぞれのフィールドについて、URLの?以降の記載を基にフィルターをかけて、その結果をJSONで返してもらいます。使う構造体はこんな感じ ↓
“`go
type Album struct {
gorm.Model
Title string
Artist string
Price f
【Go】Hexagonal Architectureに関するまとめと実装例
# はじめに
Goの勉強も兼ねて、Hexagonal Architectureについてまとめてみました。
他の方がすでにとても詳しい記事を書かれていたのですが、理解のために自分なりのアウトプットをしてみました。https://qiita.com/usk81/items/5fd99c1c84d9a15db583
# Hexagonal Architecture
Hexagonal Architectureは、ドメインロジックを中心に置き、ポート(Ports)経由で外界(DB、外部API、メッセージングサービス、コマンドラインインターフェースなど)とつながるようなアーキテクチャのことをいいます。ポートはPrimary portsとSecondary portsの2種類に区別されます。
– Primary ports:システムを駆動する(例:API、コマンドラインのようなインターフェース)
– Secondary ports:システムによって駆動する(例:DB、メッセージングサービス)ドメインロジックと外界をつなぐためには、ポートだけではなくアダプタ(Adapters)という
GORMを使ったDockerのPostgreSQLへの接続方法
最近 GORM を使った開発をしていて Docker の PostgreSQL への接続に躓いたので、接続方法をまとめました。
GORM のバージョンは v2以降です。
# Dockerfile
docker-compose.yml
“`yml
version: ‘3’services:
server:
…
…db:
…
ports:
– “5332:5432”
…
…
“`データベースのサービス名は db にしてます。
# 接続
docker のデータベースに gorm で接続する際は、host と port に気を付ける必要があります。
host は Docker のサービス名にする必要があります。“`go
dsn := “host=db user=gorm password=gorm dbname=gorm port=5432 sslmode=disable TimeZone=Asia/Tokyo”db, err := gorm.Open(postgres
外部コマンドのstdout/stderrをzapに送る
`exec.Command` 及び `exec.CommandContext` で実行した外部コマンドの標準出力や標準エラー出力を`zap`でログに記録するには、 [`zapio.Writer`](https://pkg.go.dev/go.uber.org/zap@v1.21.0/zapio#Writer)を使うと良い。
“`go
logger, _ := zap.NewDevelopment()
w := &zapio.Writer{
Log: logger,
Level: zap.DebugLevel,
}
defer w.Close()cmd := exec.Command(“echo”, “hello world”)
cmd.Stdout = w
cmd.Stderr = w
cmd.Run()
“`### 参考
– [Possible to set exec.Command Stdout and Stderr to zap?](https://github.com/uber-go/zap/issues/929)