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

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

go generics の練習

# これは何?

go 1.18 が正式リリースになり。
以前から無くて困っていた generics がようやく入ったので、その練習

# 最大値関数

`math.Max` が `float64` しか受け入れない厳しい世界からようやく脱却。

“`go:go1.18
package main

import (
“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進数)の文字列に圧縮する**ことで、なるべくコリジョンハッシュ値の衝突を和らげたいのです。

– [ハッシュ?コリジョン?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)

## TL; DR (今北産業)

1. Go 標準モジュールの [math/big パッケージ](https://pkg.go.dev/math/big)を使う。

元記事を表示

[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&params[]=2’
“`

“`go:main.go
package main

import (
“net/http”

“github.com/gin-gonic/gin”
)

func main() {
gin.SetMode(“debug”)
e := gin.Default()

assignHan

元記事を表示

Goによる、テーブル駆動テストの並列実行入門

## はじめに

Goによるテーブル駆動テストについて記事に残します。

## テーブル駆動テスト

テーブル駆動テストとは、
インプットとアウトプットの表を予め用意して、
表について繰り返しテストをすることです。
下記のようなメリットがあります。
– 並列にテストが実行しやすい
– テストケースの変更が容易
– テストが読みやすく、どこで失敗したのかがわかりやすい

厳密には、下記で説明されています。
https://github.com/golang/go/wiki/TableDrivenTests

今回、偶数判定のテーブル駆動テストを並列で実行します。
下記ファイルを作成します。

## ./is_even.go

“`
package is_even

func IsEven(number int) bool {
return (number % 2 == 0);
}
“`

## ./is_even_test.go
“`
// go test github.com/CobaltSato/mock/unit_test/is_even -parallel 2

元記事を表示

【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 位】 cosmos/cosmos-sdk
https://github.com/cosmos/cosmos-sdk

🌟 ***3,606*** star
⛓️ A Framework for Building High Value Public Blockchains ✨

## 【2 位】 liamg/traitor
https://github.com/liamg/traitor

🌟 ***4,915*** star
⬆️ ☠️ 🔥 Automatic Linux privesc via exploitation of low-hanging fruit e.g. gtfobins, pwnkit, dirty pipe, +w docker.sock

## 【3 位】 trustwallet/assets
https://gith

元記事を表示

【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

元記事を表示

OTHERカテゴリの最新記事