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

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

[Go] OpenAPI コード自動生成でビジネスロジックに集中する開発へ

# はじめに

今回は Go 言語で OpenAPI のコード自動生成を試してみたいと思います。「コード自動生成って何だ?」という方や「OpenAPI ってそもそも何?」という方にもわかりやすく解説していこうと思います。

まず、OpenAPI でコード自動生成ができると以下の嬉しいことがあります。

* ただの作業になりがちなモデルの作成が自動化できる
* 仕様書通りにモデルや API インターフェースが自動生成されるので、バグが入りにくい
* 仕様書通りのリクエスト・レスポンスかどうかを簡単にバリデーションできる
* その結果、**ビジネスロジックに集中する開発ができる**

です。
今回のサンプルコードはこちらに置いてあります。

https://github.com/Nyanchu/sample-go-echo-openapi

# OpenAPI とは

[OpenAPI](https://swagger.io/specification/) とは、 REST API の定義を記述する仕様のことです。例えば、以下は「`GET /users` API を叩いたら200ステータ

元記事を表示

zapとzerologをlumberjackと組み合わせてログローテーションする

# はじめに
今回の記事では、高速なロギングライブラリであるzap、zerologと豊富なログローテーション機能を持つlumberjackライブラリを組み合わせる方法を紹介しようと思います。

# lumberjackの設定項目

lumberjackでは以下の項目でログローテーションを制御できます。
– ログファイルのパス
– ローテーションサイズ(メガバイト単位)
– 最長保持期間(日単位)
– 最大保持数
– ログの日時情報にローカル時刻を利用するかUTCを利用するか
– ローテーション後にgzipで圧縮するか

https://pkg.go.dev/gopkg.in/natefinch/lumberjack.v2#Logger
“`golang
type Logger struct {
// Filename is the file to write logs to. Backup log files will be retained
// in the same directory. It uses -lumberjack.log in

元記事を表示

AWS SDK for Go V2 を使ってみる

自分用メモです。
なお、Go について詳しいなどではないため、誤りなどがあればご了承ください。

# 環境

+ Mac OS X 12.6.1
+ Go 19.4
+ `aws configure` コマンドを実行し、認証情報は設定済み

# Go のインストール

homebrew を使って入れる

“`
$brew install go

$which go
/usr/local/bin/go

$go version
go version go1.19.4 darwin/amd64
“`

# とりあえず HelloWorld

[サンプルで学ぶ Go 言語:Hello World](https://www.spinute.org/go-by-example/hello-world)

“`
package main
import “fmt”
func main() {
fmt.Println(“hello world”)
}
“`

“`
# 実行
$go run hello-world.go
hello world

# ビルド
$go build hel

元記事を表示

リファクタするのって難しいね

リファクタリングってしていますか?
取り急ぎ動くものを作ったけれど後から見ると色々改善できたりすることあるのではないでしょうか。
簡単に自分のリファクタリング例を載せていきたいと思います。

処理としては、
ユーザーをID検索し、退会済のユーザーであればエラーを出力するようにします。
“`
package main

import (
“fmt”

“golang.org/x/xerrors”
)

// user ユーザー定義
type user struct {
name string
id uint
userType uint
}

// userList ユーザーリスト
type userList []*user

// filterByIDs ユーザーリストからidで対象のユーザー検索
func (list *userList) filterByIDs(ids []uint) userList {
out := userList{}
for _, v := range *list {
for _, id := range ids {

元記事を表示

<AA木じゃねぇ 木のAAさ>

## 序

こんにちは、[42tokyo Advent Calendar 2022](https://qiita.com/advent-calendar/2022/42tokyo) の18日目を担当する、在校生のyokawadaです。
42tokyoでは主にカチコミをしています。

皆様におかれましては、職場で、学校で、あるいはご家庭での「木を可視化したい!」との思いに日々お悩みのことと思います。
本記事が、そのような状況への一助となりましたら幸いです。

## 問題設定

一言でいうと「二分木の構造をAA(アスキーアート)で可視化する」。
たとえばこんな感じに:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102690/c5360109-088b-3905-45d0-d4f179f11bd2.png)

## (二分)木ってそもそも何よ

本題ではないので、ざっとだけ説明する。

– 木
– 「ノード(節点)」同士を「エッジ(辺)」で繋いだ、いわゆるグラフ構造のうち、閉路を持

元記事を表示

Google Go Style Guideを読んでみよう! – Style Decisions編

## はじめに
みなさん、こんにちは!
Go大好きエンジニアの[くろたく](https://twitter.com/TakumaKurosawa)です。

ちょっと前になりますが、GoogleからGoのスタイルガイドが発表されましたね?

元記事を表示

hugo-academicでポートフォリオを作成する

# この記事について
hugo-adcademicにより、Github Pagesを利用してポートフォリオを公開するまでの手順を共有します。
ご参考までに私が作成したWebページは[このような形](https://junffy.github.io/)になっています。

# ポートフォリオを作成する目的
ポートフォリオは自己紹介だけではなく、自身のこれまでの活動やスキルを他者(人事担当者、エンジニア)にすぐに理解してもらえることに役立ちます。
もし、転職を検討している場合、準備して公開しておくことで人事担当者の方の目に付いてご連絡いただく機会を得ることもできます。

また、ポートフォリオの更新は、自分のこれまでについて改めて見つめ直すことや、足りない部分・これからのチャレンジしたいことを発見する良い機会になります。

# 本環境
– Macbook Air 2020
– Intel Processor
– macOS Ventura 13.1
– hugo v0.101.0+extended darwin
– go version go1.19
– Homebrew 3.6.15

元記事を表示

Go ファイル分割

## 初めに
ファイルを分けて管理したい
Nodeみたいに `const hoge = require(“hoge”)`すればよいだけではないらしい
備忘録として残しておく

## 同一package(同じディレクトリ)で分ける
“`go:main.go
package main

func main() {
// 同一packageなのでimportが必要ない
Bar()
}
“`
“`go:bar.go
package main

import (
“fmt”
)

func Bar() { // 外部ファイルで使用する場合、頭文字は大文字
fmt.Println(“bar”)
}
“`
“`shell
# go.modがある場合
# runやbuild時に全てのmain packageを指定する
go run main.go bar.go

# go.modがある場合
go run .
“`

## 別package(ディレクトリ)に分ける
*go.modが必要*
***`go mod init go_test`***
“`
go_test
– ma

元記事を表示

Goのhttp.Clientでリダイレクトを判定して処理を行う方法

# TL;DR

GoでHTTPリクエストを送信送るnet/httpライブラリの`http.Client`はデフォルトだと自動リダイレクトする仕様ですが、`http.Client.CheckRedirect`をオーバーライドすればリダイレクトする前の結果を返すことができます。

# 外部要因でリダイレクトがかかる際にシステムでエラーが起きる

Amazonの商品の分類によって処理を変えるようなシステムを実装していました。
Amazonの商品は「靴」などの分類を「BrowseNodes」という単位で管理しており、こちらはAPIのドキュメントにも書かれています。

https://webservices.amazon.com/paapi5/documentation/use-cases/organization-of-items-on-amazon/browse-nodes.html

メンズスニーカーの場合、「[https://www.amazon.co.jp/b?node=2221112051](https://www.amazon.co.jp/b?node=2221112051)」と

元記事を表示

untyped int の思いがけなかった挙動

# これは何?

先日、untyped int の挙動で驚いたことがあったので書いておく。

Go アドベントカレンダー

https://qiita.com/advent-calendar/2022/go

の カレンダー3 の初日が空いていたので参加してみた。

# コード

こんなコードがある。

“`go:go
const x = 9876543210
log.Printf(“%v”, x) // 32bit 環境ではコンパイルエラー
“`

いつもは 64bit 環境で動かしていたんだけど、久々に 32bit 環境向けのバイナリを作ったらコンパイルエラーになってびっくりした。

x は untyped int。
`log.Printf` で `%v` で受けるんだから、型は何でもいい。
しかし、`log.Printf` には untyped int のままでは渡せない。仕方ないので `int` に変換を試みるもオーバーフローでエラー。

`v …any` に渡したいのに `int` にされるのが、言われてみればまあそうだよねということだけれど、思いがけなかった。

#

元記事を表示

lambda + Goで定期バッチを作成する

この記事はディップ株式会社[Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev) の18日目です

## 概要

私が所属しているチームでは週1回定例があり、[DocBase](https://docbase.io/)という情報提供ツールに議事録を残しています。
議事録は毎週定例実施前にテンプレートを手動で準備していましたが、以下問題点がありました。

#### 新規issueの記入が面倒
議事録には、定例までの期間に新しく作成されたissueを記入をする必要がありますが、所属チームではリポジトリを複数管理しています。
そのため、リポジトリごとにissueを検索 -> md形式に変換 という工程を複数回を行う必要があり、issueの記入に時間がかかりました。

#### 手作業によるミス
人の手で作業を行うため、日付のミス・issue起票のミス・議事録作成忘れなどが稀に発生していました。

これらを解決し業務を効率化させるために、定例議事録の作成をバッチ化させました。

## 詳細

定例バッチの作成

元記事を表示

Golang の Generics で使いたいものは大体 samber/lo にあった話

# はじめに
本記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) の18日目の記事です。

Generics を使った関数でやりたかったことが、[samber/lo](https://github.com/samber/lo) に大体揃ってたという話をします。
すでに自前で書いてた関数もいくつかあったのですが、このライブラリを知り置き換えていったという体験談です。

※結果的に「`samber/lo` のなかでこの辺り使えるかも」というものを私の独断と偏見でピックアップする記事になってます。

# `samber/lo` とは
`samber/lo` は [16日目のアベンドカレンダーの記事](https://qiita.com/sakashin10291029/items/bb16c24bea1399353295) でも取り上げられていまして、そこから説明を引用させていただきました。

> samber/loは,多種多様な便利関数を提供するパッケージです。
JavaScriptのライブラリ

元記事を表示

【GORM】CRUD操作する方法まとめ

この記事は DeNA 23 新卒 Advent Calendar 2022 の18日目の記事です!
さまざまなジャンルの技術に関する記事が投稿されていくので, ぜひご覧ください!??
https://qiita.com/advent-calendar/2022/dena-23-shinsotsu

## 背景
インターン業務のなかで, Go言語のORMである[GORM](https://gorm.io/ja_JP/docs/index.html)を使う機会がありました. その際に, GORMが高機能であるがゆえに, 個人的に次の2つの課題を感じていました.

– 「レコードを取得したい」, 「レコードを更新したい」などの目的に対し, 方法がいくつかあり, どれを使えばいいのかわからない
– DBに関する知識が乏しいため, ドキュメントにある説明だけでは使用方法がわからないことがある

本記事ではこれらの課題を解消すべく, GORMを使った基本的なCRUD操作の方法についてまとめました.
なお, 基本的に[公式ドキュメント](https://gorm.io/ja_JP/docs/inde

元記事を表示

rclgoのhumble対応(中)

# はじめに

すいません,私もこのネタ(includeパス問題)です.

Go言語(以下,golang)はクラウドネイティブな各モジュールと相性が良い.Webサーバ機能がPy○○onなどと違ってテスト用ではなく商用にも耐えられるモノが標準で採用されてる点が大きい.その他諸々からもREST APIファーストな用途には欠かすことが出来ない言語と言える.

そんなgolangをROS2でも利用したい!と考えるのは最早,必然である(?)

2022年現在,目についたrclgo実装は次の通り.

– [https://github.com/tiiuae/rclgo](https://github.com/tiiuae/rclgo)
– [https://github.com/juaruipav/rclgo](https://github.com/juaruipav/rclgo)
– [https://github.com

元記事を表示

【Go/Gin】画像を返すAPI

imagesフォルダにある画像を
(ルートURL)/(任意のパス)/(画像名)
にアクセスすることによって返してくれるAPIを作りました。

## フォルダ構成
“`
root
├ images
├imageA.png
└imageB.png
└main.go
“`

## コーディング
“`Go:main.go
package main

import (
“github.com/gin-contrib/static”
“github.com/gin-gonic/gin”
)

func main() {
router := gin.Default()

//画像を返す
router.GET(“/api/Image/:imageID”, HandlerImage)

router.Run()
}

func HandlerImage(ctx *gin.Context) {
imageID := ctx.Param(“imageID”)

//パスをここで指定
path := “/images/” * imageID + “.png”

元記事を表示

Goで作るインタプリタ/コンパイラ入門!

本記事は[QualiArts Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qualiarts) 18日目の記事です。

プログラミング言語ってどうできているんだろう?自作できたらめっちゃかっこいい!と思って出会った以下2冊の紹介です?‍♂️
– [Writing An Interpreter In Go](https://amzn.asia/d/0wrNAvK)
– tree-walking型インタプリタで動作するプログラミング言語をGoで自作できるようになる
– 邦訳: [Go言語でつくるインタプリタ](https://amzn.asia/d/aIKHG5e)
– [Writing A Compiler In Go](https://amzn.asia/d/gvrVPng)
– ASTから中間表現であるバイトコードを出力するコンパイラとそれを実行する仮想マシンを実装する
– 邦訳版はないので英語を頑張って読んだ? (kindle版で翻訳かければよかった)

元記事を表示

Vue-CLIで作ったページをGo/GINで表示する最短手順

Vue-CLIで作ったフロントエンドをGinのバックエンドで配信する方法が意外と見つからなかったため、記事を書くことにしました。

# 全体的なディレクトリ構成
“`
root
┝ client #フロントエンド、Vue-cliがここに
┝ public
┝ src
(その他)
└ server #バックエンド、Goがここに
┝ main.go
(その他)
“`

# フロントエンドのセットアップ
普通にVue-cliを作るだけ。
“`
###rootディレクトリにて

# clientフォルダ直下にvue-cliプロジェクトを作成
$ vue create client
“`

# フロントエンドのビルド
フロントエンドが書けたら(特に何もしなくともデフォルトでページがあります)、バックエンド側で表示するために下記のコマンドでビルドする必要があります。

フロントエンドを更新したものを反映するには、その度にビルドする必要があります。
“`
$ npm rum build
“`

# バックエンドのセットアップ
こちらも普通にgo、

元記事を表示

Go/Gin Gormでよく使うDB操作 + 簡単なアプリ作成

# Gin勉強の備忘録
Gormの簡単なまとめ + Gormを使用した簡単なWebアプリ作成
## Gormとは
Go言語専用のORMライブラリ。
構造体を引数に渡すことによって簡単にDB操作が可能。
## Gormを使うには
下記のインストールを行う(ファイルgo.modがないとインストール不可)
“`terminal
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
“`

mainやinit内でDBファイル作成&開く
“`go
db, err := gorm.Open(sqlite.Open(DBName), &gorm.Config{})
if err != nil{
log.Fatalln(err)
}
“`

## よく使うCRUD
### レコードの作成
“`go
db.Create(&構造体)
“`
### レコードの更新(単一のカラム)
“`go
db.Model(&構造体{}).Where(“カラム名 = ?”, 検索値).Update(カラム名, 更新値)
“`

### レコード

元記事を表示

Open Match チュートリアルをminikubeでやる場合の落とし穴

「 [Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot) 」 18日目の記事になります。
前日は @smoto-shei さんの [Amazon SageMaker でモデルをデプロイしてみた](https://blog.applibot.co.jp/2022/12/17/amazon-sagemaker-deploy/)という記事でした。

## はじめに
Open Matchとminikube何もわからんという状態からOpen Match チュートリアルをminikube環境で実行する際にハマった箇所を紹介します。
※チュートリアル自体の解説はしません。

## 動作環境
今回、動作確認した環境は下記の通りです。
![Screen Shot 2022-12-17 at 23.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893255/5021acd8-6f8a-7f23-4a57-

元記事を表示

GoでCSVのファイルを読み込んで情報を保存する

この記事は [Howtelevision Advent Calendar 2022](https://qiita.com/advent-calendar/2022/howtelevision) 18日目の記事です。

17日目は [mayuko_okamoto](https://qiita.com/mayuko_okamoto) さんによる[「数字アレルギーのド文系が元エンジニアに教えを乞うてRedash使ってみた」](https://qiita.com/mayuko_okamoto/items/739292b8d36f0416d399) でした。

今月12月にハウテレビジョンに入社しました川原です。主に外資就活ドットコムの開発をしています。
弊社が運営する外資就活ドットコムではバックエンドにGoを採用しています。そこで個人的な練習としてGoを用いてCSVファイルの処理を実装してみました。

## やったこと

あらかじめダウンロードしておいたクレジットカード明細のファイルを用意し、プロジェクト直下のディレクトリで`go run`するとクレジットカードの明細からほしい情報を読み込んで

元記事を表示

OTHERカテゴリの最新記事