Go関連のことを調べてみた2022年03月23日

Go関連のことを調べてみた2022年03月23日
目次

Golang GitHubトレンドデイリーランキング!!【自動更新】

GitHub Trending をキャッチアップする習慣をつけて、強強エンジニアになろう。
この記事では、Golang のGithubのトレンドデイリーランキングを25位まで紹介します。

# トレンドデイリーランキング

## 【1 位】 Dreamacro/clash
https://github.com/Dreamacro/clash

? ***25,165*** star

## 【2 位】 trustwallet/assets
https://github.com/trustwallet/assets

? ***2,475*** star

## 【3 位】 Mrs4s/go-cqhttp
https://github.com/Mrs4s/go-cqhttp

? ***4,228*** star

## 【4 位】 TheAlgorithms/Go
https://github.com/TheAlgorithms/Go

? ***9,300*** star

## 【5 位】 sundowndev/phoneinfoga
https://github.com/

元記事を表示

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

元記事を表示

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 main

import “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.7

gorm.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の設定

元記事を表示

OTHERカテゴリの最新記事