- 1. Golang GitHubトレンドデイリーランキング!!【自動更新】
- 2. GoでGitHubへpushする前にmakeコマンドでprecommitする方法
- 3. Golang GitHubトレンドデイリーランキング!!【自動更新】
- 4. 【Go】パスパラメータを使用するときの注意点やエラーハンドリングなど
- 5. 【Golang / Gorm】URLのクエリパラメータでレコードをフィルタして取得するにはどうすればいいの?
- 6. 【Go】Hexagonal Architectureに関するまとめと実装例
- 7. GORMを使ったDockerのPostgreSQLへの接続方法
- 8. 外部コマンドのstdout/stderrをzapに送る
- 9. golangci-lintでジェネリクスが使えるようになった
- 10. [ビデオエコーのデモあり]GoでもWebTransportがしたい!
- 11. Go1.18で追加された型セットを静的解析する
- 12. Go1.18からtext/templateのand, orが短絡評価されるようになった
- 13. Go言語でWebAssemblyを実装
- 14. [GORM]複合主キーによるDeleteのSQL文
- 15. wailsにEchoを導入したら「blocked by CORS policy」が発生したのでCORS対応する
- 16. GORMでデータベースのレコードが削除されない時の対処法
- 17. compile: version “go *.**” does not match go tool version “go *.**”エラーの解決
- 18. 【GO環境構築】環境構築をしてVSCodeで少し動かすまで
- 19. 初めてGo(Gin)でアプリケーションを作る時に直面した壁とその解決法
- 20. go mod vendorとは何ぞや
Golang GitHubトレンドデイリーランキング!!【自動更新】
GitHub Trending をキャッチアップする習慣をつけて、強強エンジニアになろう。
この記事では、Golang のGithubのトレンドデイリーランキングを25位まで紹介します。# トレンドデイリーランキング
## 【1 位】 Dreamacro/clash
https://github.com/Dreamacro/clash? ***25,075*** star
A rule-based tunnel in Go.## 【2 位】 trustwallet/assets
https://github.com/trustwallet/assets? ***2,417*** star
A comprehensive, up-to-date collection of information about several thousands (!) of crypto tokens.## 【3 位】 Mrs4s/go-cqhttp
https://github.com/Mrs4s/go-cqhttp? ***4,213*** star
cq
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 位】 Dreamacro/clash
https://github.com/Dreamacro/clash? ***25,042*** star
A rule-based tunnel in Go.## 【2 位】 trustwallet/assets
https://github.com/trustwallet/assets? ***2,388*** star
A comprehensive, up-to-date collection of information about several thousands (!) of crypto tokens.## 【3 位】 Mrs4s/go-cqhttp
https://github.com/Mrs4s/go-cqhttp? ***4,209*** star
cq
【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)
golangci-lintでジェネリクスが使えるようになった
golangci-lintが、 `v1.45.0` (投稿時点の最新版)でGo1.18の新構文(ジェネリクスやany等)に対応しました :tada:
これで心おきなくジェネリクスが使えます!https://github.com/golangci/golangci-lint/releases/tag/v1.45.0
早速 [issueでの紹介手順](https://github.com/golangci/golangci-lint/pull/2438) に従ってリンターをかけてみました。
(現在進行形で対応が進んでいるので、最新の状況については ~~この記事より~~ issueでの確認をおすすめします)# 準備
`.golangci.yml` に以下の2行を足すだけです。
“`yaml:.golangci.yml
run:
go: 1.18
“`(ちなみに指定しない場合Go1.17までのモードで起動しクラッシュしました)
“`bash
$ golangci-lint run
ERRO [runner] Panic: unused: package “ma
[ビデオエコーのデモあり]GoでもWebTransportがしたい!
# WebTransportのビデオエコーデモの公開がしたい!
![スクリーンショット 2022-03-20 19.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91710/ea05f41a-0704-0172-4998-36218a1f4b84.png)
(左がカメラ、右がエコーされたもの)画面上で52ミリ秒か。
早い、確かに早い。
ブラウザからエンコードしたchunkデータにタイムスタンプを埋め込み、サーバーにエコーさせてchunkデータが戻ってくるまでわずか41ms
これなら確かによりリアルタイムな何かができるだろう。
しかしこれを実用化するには別の問題があった。安定性だ。781, 772, 763 …
694, 682, 678 …
黒い画面に映し出される数字は数秒毎にじりじりと減っていく。
121, 110, 103, 99
メモリ残量を表す `vmstat` の `free` の値はとうとう残り100MBを切ってしまったことを示していた。92, 106, 1
Go1.18で追加された型セットを静的解析する
## 概要
先日[メルカリの短期インターン](https://mercan.mercari.com/articles/31914/)に参加した際にGo1.18の機能に焦点を当てたOSS開発をする機会があったので、そこで得られた知見をまとめようと思います。3/16にGo1.18がリリースされ、様々な機能が追加されました。その中の一つである型パラメタ(ジェネリクス)について、機能追加に伴い新たに型セット([Type Set](https://github.com/golang/go/issues/45346))という概念も追加されました。
– [Type Parameters Proposal](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md)
– [Type setに関するIssue](https://github.com/golang/go/issues/45346)本記事では、型セットがGoの中でどのようになっているのかを、Goの標準パッケージ
Go1.18からtext/templateのand, orが短絡評価されるようになった
表題の通りです。
`and`, `or` の右辺値で副作用を起こすテンプレートを書いていた場合、Go1.17と1.18で挙動が変わります。Go本体と同じ仕様になったので分かりやすいですね。
“`:テンプレート
{{$d := dict}}
{{or 1 (set $d “msg” “right value is evaluated!”)}}
{{$d}}
“`go1.17: `or` の右辺値も評価されるので、 `$d` にキーが追加されている
“`:go1.17
1
map[msg:right value is evaluated!]
“`go1.18: `or` の左辺値がtruthyなので短絡評価され、 `$d` にキーが追加されない
“`:go1.18
1
map[]
“`# 挙動は何によって変わる?
Go本体のバージョンで決まります。 `go.mod` ファイルのGoディレクティブは関係ありませんでした[^1]。
そのため、`go install` で同じバージョンのバイナリを落としてきても、Go本体のバージョンによって挙動が変わります
Go言語でWebAssemblyを実装
## 簡単なWebAssemblyを実装
モジュールディレクトリの作成と**go.mod**を生成します。
“`sh
mkdir wasm
cd wasm
go mod init example.com/wasm
“`**main.go**を作成します。
“`go
package mainimport “fmt”
func main() {
fmt.Println(“Hello, WebAssembly!”)
}
“`Go言語のビルドコマンドに環境変数**GOOS = js**、**GOARCH = wasm**を設定して、**main.go**をWebAssembly用にコンパイルして**main.wasm**を生成します。
“`sh
GOOS = js GOARCH = wasm go build -o main.wasm
“`**main.wasm**だけでは動かないので、**wasm_exec.js**(JavaScriptサポートファイル)をコピーします。
“`sh
cp “$(go env GOROOT)/misc/wasm/wa
[GORM]複合主キーによるDeleteのSQL文
[GORM](https://gorm.io/ja_JP/)の[Delete()](https://gorm.io/ja_JP/docs/delete.html)のSQL文が、複合主キーの場合に、少しイレギュラーであったため、書き留めました。
+ 環境
“`
go 1.17
mysql 5.7gorm.io/gorm v1.22.0 ( GORM自体のv2に当たる。v1は、jinzhu/gormの方 )
gorm.io/driver/mysql v1.1.2
“`以下のような複合主キーのテーブルの場合に、
“`golang
type Item struct {
Pk1 string `gorm:”primaryKey;autoIncrement:false;”`
Pk2 string `gorm:”primaryKey;autoIncrement:false;”`
Name string
}
“`GORMの[Delete()](https://gorm.io/ja_JP/docs/delete.html)を使うと、
“`golang
item :=
wailsにEchoを導入したら「blocked by CORS policy」が発生したのでCORS対応する
![go-1.17](https://img.shields.io/badge/go-1.17-brightgreen) ![wails-v2 beta](https://img.shields.io/badge/wails-v2.0.0(beta)-brightgreen) ![echo-v4.7.2](https://img.shields.io/badge/echo-v4.7.2-brightgreen)
## 前提
– wailsに別のweb frameworkを用いたい
– wailsにReactとEcho( https://echo.labstack.com/ )を用いてアプリケーションを作ってみた
– CORSのエラーが発生した## 結論
– EchoにCORSの設定を行う
– 勉強目的でWebフレームワークを入れたがwailsでいろいろやってくれているので煩わしい気がする## 事象
wailsにEchoを導入してfetchして見たところ下記エラーが発生しました。![image.png](https://qiita-image-store.s3.ap-nor
GORMでデータベースのレコードが削除されない時の対処法
# はじめに
Gormを使用してデータベースを操作していましたが、レコードを削除した際にアプリ上で見ると消えているもののデータベース上には残っていることに気が付きました。
筆者の場合は、ユーザーのメールアドレスを一意な値にしたことで、「新規登録」→「ユーザー削除」→「同じアドレスで再登録」した際にデータベースでエラーが起きていました。# 対処法
対処前に書いていたユーザー削除のコードは以下になります。“`go
func DbDeleteUser(id int) {
d := db.GormConnect()
d.Delete(&User{}, id)
defer d.Close()
}
“`この書き方だと、論理削除といってレコードがデータベースから物理的に削除されるわけではなく、通常のクエリ系のメソッドで検索できなくなるだけのようです。
https://gorm.io/ja_JP/docs/delete.html
対処後のコードは以下になります。
“`golang
func DbDeleteUser(id int) {
d := db.GormConn
compile: version “go *.**” does not match go tool version “go *.**”エラーの解決
# compile: version “go *.**” does not match go tool version “go *.**”エラー
goの環境構築していてhello worldさせるために、
はりきって` go run hello.go `をしたら上記のエラーがでた。## エラー内容
“`
# unicode/utf8
compile: version “go1.16.2” does not match go tool version “go1.17.8”
# runtime/internal/sys
compile: version “go1.16.2” does not match go tool version “go1.17.8”
# internal/unsafeheader
compile: version “go1.16.2” does not match go tool version “go1.17.8”
# internal/race
compile: version “go1.16.2” does not mat
“`goenvを使って
【GO環境構築】環境構築をしてVSCodeで少し動かすまで
### ゴール
Go言語の基礎が始められる状態にするGo言語の基礎
https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/02.1.html
a tour of Go
https://go-tour-jp.appspot.com/list
### 環境
– mac### 環境構築に必要なこと
– インストール
– コマンド実行 `brew install go`
– 環境変数の設定
– パス追加とGOPATHの設定
– `export GOPATH=$HOME/go`
– `export PATH=$PATH:$GOPATH/bin`– ディレクトリの作成
– 環境変数GOPATH配下「bin」「pkg」「src」のフォルダを作成
– `mkdir -p go/bin`
– `mkdir -p go/pkg`
– `mkdir -p go/src`– VSCodeの設定
初めてGo(Gin)でアプリケーションを作る時に直面した壁とその解決法
初めてGoを使用し、文法もよくわからない状態でWebアプリケーションを開発しようとしたとき、他言語と勝手が違ったり、動的な言語(Perl,PHP,Python,Rubyなど)と違って型があったりして「いつもやっていることができない」となった際の事象や解決法を残しておきたいと思いこの記事を書くに至りました。
## 前提
– 使用したフレームワーク
– Gin
– 動作環境
– Docker20.10.8
– アプリの詳細
– 求人サイト
– 一般的なWebアプリケーションにあるDBからデータを取得して表示する/データを登録するといったことができる## Ginの恩恵を受けた箇所
Goのフレームワークは基本的にフルスタックではないので、なにからなにまでGinのお世話になったわけではなく、通信周り(ルーティング)やセキュリティ周り(セッションなど)が主なGinの出番でした。そのため今回紹介するのはこうした部分がメインとなります。Ginによって楽に実装できたものの、Ginについての情報が少なく、これらの手法を見つけるのに苦労したため、残しておきたいと思
go mod vendorとは何ぞや
## そもそもvendorとは?
vendorは `go get`でダウンロードするモジュールを`GOPATH/pkg/mod`ではなく、プロジェクトのルートディレクトリに置くことができる仕組みのこと。
import時の挙動としては、`GOPATH`よりも優先して`vendor`ディレクトリのモジュールを探しにいく。### なぜvendorが必要?
1つのPCで複数のGoプロジェクトがあるとする。複数のプロジェクトでそれぞれ違うバージョンのモジュールが必要になったとき、昔のGoはvendorを使うしかなかった。つまり、今は不要!(ただ、あると便利)
## go mod vendorとは?
`go mod vendor`は `go get`の後に実行するコマンドで、`GOPATH`にあるモジュールをプロジェクトルートディレクトリにある `vendor`ディレクトリにコピーするコマンドである。## vendorはgitの管理下に置く
こうすることで、`git clone`したらすぐ動作確認ができたり、docker buildやCIで楽をすることができる。
`node_module