Go関連のことを調べてみた

Go関連のことを調べてみた

Goのlog/slogパッケージを使ってみる

## はじめに
今まで、文字列などを出力するときはlogかfmtを使って標準出力か標準エラー出力をしていたが、APIサーバを作るにあたり利用者の行動をファイルに記録する必要があると考えた。そこで、Goの標準パッケージであるlog/slogを用いて、json形式での構造化ロギングを行った。

## 実装
### コード
このコードは、GoのWebフレームワークに一つであるginを用いた簡単なAPIサーバです。エンドポイントへのアクセスが行われたとき、その情報をlog/slogを用いてserver.logに出力します。

https://github.com/Sawawa42/slog-qiita

“`golang:main.go
package main

import (
“github.com/gin-gonic/gin”
“io”
“log”
“log/slog”
“os”
“time”
)

func main() {
// ファイルを開く
file, err := os.OpenFile(“server.log”, os.O_APPEND|os.O_CREA

元記事を表示

Generics: A Boon for Strongly Typed Languages

![Generics_typed_languages_36a2c0a02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778885/058d68b5-b803-9d93-c619-245a68166d0c.png)

> Exciting News! Our blog has a new **[home](https://canopas.com/blog)**!🚀

## Background

Consider a scenario, You have two glasses one with milk and the other with buttermilk. Your task is to identify between milk and buttermilk before drinking it(of course without tasting and touching!).

Hard to admit that, right? Just because they seem sim

元記事を表示

【個人開発】PaPut(パプト)を支える技術

# はじめに
こんにちは、mizukoです!
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut(パプト)](https://paput.io)」のβ版をリリースしました!
サービスについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧ください!

本記事では、PaPutを支える技術について記載していきたいと思います!

# 技術選定の軸
私が技術選定を行う際に軸にしているのは以下です。
– モダンか?
– 情報は多いか?
– 市場価値は高いか?
– 人材確保は容易か?

いくら素晴らしい技術でも、導入や保守が大変だと無駄なコストがかかってしまいます。
他人にも受け入れやすく、できるだけモダンで今後に繋がるような技術を選定するように心がけています。

# フロントエンド
## フレームワーク
フロントエンドには[Next.js](https://github.com/vercel/next.js)を使っています。
開発当初、丁度App Routerが登場したので、

元記事を表示

【個人開発】エンジニアのインプット・アウトプットを加速させるサービス「PaPut(パプト)」β版をリリースしました!🎉

# はじめに
こんにちは、mizukoです!
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut(パプト)](https://paput.io)」のβ版をリリースしました!
新サービスについて、宣伝も兼ねて色々とアウトプットしていきたいと思います!

# 自己紹介
改めて私が何者なのか、自己紹介させていただきます🙏

– 年齢
– 29歳
– 職歴
– 新卒1年間フリーの音楽奏者
– その間独学でプログラミングを勉強
– 勉強して作ったアプリを元にエンジニアへ転職
– 25歳でフリーランスへ

普段はGo、Typescript(Node、React、Next.js)、AWSを軸にフルスタックのフリーランスエンジニアとして活動しています。
お仕事依頼待ってます🫶

# どんなサービスか
PaPutは、「インとアウトをパパッとプット」をコンセプトに、
技術的なナレッジの投稿ハードルを極力下げ、「メモ」という単位で簡単に自分が学んだことをアウトプットでき、Xの様な感覚でメモを閲覧し、簡単にインプットできるサービ

元記事を表示

GolangのYamlパッケージのバグを見つけた話

## 初めに

弊社プロダクトでは設定に関する項目をyamlで記述していてAPI起動時にUnmarshalしているのですが、その結果が期待していたものと異なることが以前発生したので原因は何だったのか、どうやって突き止めたのかをまとめてみました。
とりあえず原因だけ知りたいという方は[こちら](https://github.com/go-yaml/yaml/issues/1035)のissueを見て頂くと良いかと思います。

## 使用環境
[yamlライブラリ](https://github.com/go-yaml/yaml)
“`bash
% go version
go version go1.21.1 darwin/amd64
“`

## バグの詳細
yaml上に書いた一部の設定が構造体に反映されませんでした。
具体的には次のようなyamlを用意した時に、 `merger_val` の値がマッピング先に反映されていませんでした。
“`config.yaml
mergee_param: &mergee
param_key:
keywords: []

merger

元記事を表示

Goのcontextを使ってみる

## WithCancel

WithCancel()でキャンセル用のcontextを作成しておき、2秒待ってから、cancel()を実行して処理を中止するように、longRunningTask()に伝えています。

こうすることで、それ以上実施する必要のない処理を止めることができるようになります。

“`go
package main

import (
“context”
“fmt”
“time”
)

// 長時間かかる処理をシミュレートする関数
func longRunningTask(ctx context.Context) {
select {
case <-time.After(5 * time.Second): // 処理が完了した場合 fmt.Println("Task completed") case <-ctx.Done(): // キャンセルやタイムアウトが発生した場合 fmt.Println("Task canceled:", ctx.Err()) } } func main() { // キャンセル可能なコンテキストを生成

元記事を表示

【Go言語】ジェネリクス

# はじめに

今回はGoのジェネリクスの使い方をまとめました。
スライドもあります。

# any

## anyとは

anyとは空インターフェイス`interface{}`のエイリアスで、どんな型でも保持することが可能。

以下は実際にanyにいろんな型を入れてみた例。

[Go Playground](https://go.dev/play/p/DDtuiq_VxwV)

“`go
func main() {
var i any
i = 42 // int
i = “foo” // string

i = struct {
s string
}{
s: “bar”,
} // struct

i = func() {} //関数

元記事を表示

【初学者はとりあえずこれでOK】とにかく書いてみるGraphQL スキーマ設計3ステップ

## はじめに
この記事が、GraphQL はじめてみたいけど、スキーマ設計とかクライアントライブラリとか、色々な情報が溢れていてわからないといった初学者向けに、まずはこれで書いてみよう!と迷わず実際に触るための一助になれば嬉しいです。

## スキーマファーストとコードファースト

GraphQLを使ったAPIの開発では、**2つの進め方があります。**
GraphQLってなにー??な状態の方はまず[こちらの記事](https://speakerdeck.com/kazukihayase/graphqlkuraiantonoji-shu-xuan-ding-2023dong?slide=14)の前半部分をどうぞ。

進め方1つ目の**スキーマファースト**では、まずGraphQLスキーマ(型定義)をサーバーチーム、フロントチームが一緒に話して作成します。作成したスキーマの設計を基盤として、両チームが実装を並行して進めていくことができます。

2つ目の**コードファースト**は、GraphQLスキーマ(型定義)を、主にサーバーチームが作成します。**まずサーバーのコードを書き、そこか

元記事を表示

Goのテストを書いてみる

## はじめに
Goでテストコードを書いてみました。

## 足し算と引き算をする関数
“`go
package math

func Add(a, b int) int {
return a + b
}

func Sub(a, b int) int {
return a – b
}
“`

## テストコード

1つずつの条件でも書けるし、テーブルドリブンテストで複数条件を構造体に定義して、ループで回すことでテストを分かりやすく書くことができる。

“`go
package math_test

import (
“testing”

“example/math”
)

func TestAdd(t *testing.T) {
want := 3
if got := Add(1, 2); got != 3 {
t.Errorf(“want %d but got %d”, want, got)
}
}

func TestSub(t *testing.T) {
// テーブルドリブンテスト
tests := []struct {
name string

元記事を表示

【Go】地味に嬉しい整形ライブラリ – pretty

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)

今回は複雑な構造体や、ログなどを見やすく整形してくれるGoのライブラリである**pretty**をご紹介します!

# prettyの魅力
こちらの [The Go Playground](https://go.dev/play/p/IiwoGJ79IOb) でも体験できるように、`pretty.Formatter()`を使うことで整形された結果を確認することが出来ます!

“` main.go
package main

import (
“fmt”

“github.com/kr/pretty”
)

func main() {
type myType struct {
a, b int
}
var x = []myType{{1, 2}, {3, 4}, {5, 6}}
fmt.Printf(“%# v\n”, x)
fmt.Printf(“%# v”, pretty.Formatter(x))
}
“`

“` zsh
[]main.myType{main.myType

元記事を表示

Goのプロジェクト構成とパッケージ

# プロジェクト構成

Goでは1つのプロジェクトのレイアウトがある。

https://github.com/golang-standards/project-layout/blob/master/README_ja.md

ただし、このレイアウトを使わないといけないという規制はない。

また、以下のGo moduleのドキュメントも参考になる。

https://go.dev/doc/modules/layout

## project-layoutの主なディレクトリ

以下は、[project-layout](https://github.com/golang-standards/project-layout/blob/master/README_ja.md) のレイアウトの主なディレクトリ。

:::note warn
project-layout は、Go公式のレイアウトではないので、必ずしも守らないといけない規約ではない。
:::

* /cmd : アプリケーションごとにコマンドのmain.goを置く
* /internal : 外部に公開したくないプライベートなコードを

元記事を表示

GoとReact+TypeScriptで筋トレメニュー表を作ろう!

## はじめに
初めましての人もそうでない人もこんにちは!

最近暑くなりすぎて我が家の冷凍庫がアイスの箱で埋め尽くされています!

毎日のようにアイスを食べていたらあらびっくり!
体重がめちゃんこ増えてました!

こんなだらしない体では恥ずかしくて海水浴に行けません!(漢心ピ〜ンチ♂)
かなりやばいのでそろそろ筋トレを始める時期だと思っています!

どうせならプログラミングを駆使して筋トレメニュー表を作ることで技術力向上と夢のマッスルボディの両方を鍛えたいです!

そこで今回は筋トレメニュー表をGoとReactを使って作ってみました!
ぜひ最後までご覧ください!

## 今回使う技術
### フロントエンド
React + TypeScript ・ Css

### バックエンド
Go

## 準備をしよう!
“`
kintore
├─ backend
| └─ main.go
├─ frontend
| └─ src
| └─ App.tsx
| └─ App.css
├─ ・・・
・・・
“`

今回主に使うディレクトリ構成としてはこんな感じです!

まず

元記事を表示

Go言語におけるnilの構造体ポインタの扱い方:フィールドとメソッドのアクセス

Go言語では、`nil` の構造体ポインタにアクセスする際には注意が必要です。
特に、フィールドとメソッドにアクセスする場合の動作は異なるため、それぞれのケースについて詳しく解説します。

## フィールドにアクセスする場合

`nil` の構造体ポインタに対してフィールドにアクセスしようとすると、ランタイムパニックが発生します。

“`go
package main

import “fmt”

type Foo struct {
Name string
}

func main() {
var foo *Foo
fmt.Println(foo.Name) // panic: runtime error: invalid memory address or nil pointer dereference
}

“`

このコードを実行すると `foo` が `nil` であるため、フィールド `Name` にアクセスしようとする際にランタイムパニックが発生します。
このような場合、フィールドにアクセスする前にポインタが `nil` でないことを確認する必要があります。

元記事を表示

learn-go-with-tests スタブ・モック

# スタブ・モック
3からカウントダウンするプログラムを作成するように求められました。各数値を新しい行に表示します(1秒の間隔を置いて)、ゼロに達すると「Go!」と表示します。そして終了します。

“`
3
2
1
Go!
“`

これに取り組むには、Countdownという関数を作成します。この関数をmainプログラム内に配置して、次のようにします。
“`
package main

func main() {
Countdown()
“`
これはかなり簡単なプログラムですが、完全にテストするには、いつものように反復的、テストドリブンのアプローチを取る必要があります。反復とは、できる限り小さなステップを踏んでいることを確認することです。要件をできる限り小さくスライスして、動作するソフトウェアを使用できるようにすることは重要なスキルです。

作業を分割して反復する方法は次のとおりです。

– 表示 3
– 3、2、1 を表示してGo!
– 各行の間で1秒待ちます

## 最初にテストを書く
“`
func TestCountdown(t *testing.T) {

元記事を表示

go言語 メモリ領域

# メモリ領域
Go言語でどのメモリが使用されるのか残しておきたかったので、その記録です。
“`
[低アドレス]
+——————+ 0x00000000
| ブートローダー      | BIOS/UEFIによって最初に実行されるコード
+——————+ 例: 0x00080000
| カーネル | オペレーティングシステムの中心部分
+——————+ 例: 0x00100000
| スタティック初期化領域 |
+——————+ 例: 0x00200000
| *テキスト領域     | プログラムのコード(命令)
+——————+ 例: 0x00400000
| *データ領域    | グローバル変数、静的変数
+——————+ 例: 0x10000000
| バッファ領域      | I/O操作のための一時データ保存
+——————+ 例: 0x200

元記事を表示

[Go / Echo] Middleware におけるエラーハンドリング時の注意点

## 前段
ミドルウェアのエラーログハンドリング周りの処理が複雑で、いくつか問題が発生していました。
その対処を行う過程で自分が得た知見を簡単にご紹介します。

## ミドルウェアの処理順序
まず Echo の Middleware における注意点は、その処理順序です。

仮に、A・B という Middleware があったとします。
それを、下記のように順に呼び出します。

“`
echo := echo.New()
echo.Use(echo.MiddlewareFunc(middlewares.NewA()))
echo.Use(echo.MiddlewareFunc(middlewares.NewB()))
“`
そして、上記 A・B のそれぞれの Middleware の中では下記のように処理しているとします。
“`
func NewA() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context)

元記事を表示

【初LT登壇】「sqlxからpgxへの移行を今はしない判断をするまで」の深堀りをしてみます!

こんにちは。

株式会社HRBrainでバックエンドエンジニアをしているみつです!

この春に新卒として入社し、さまざまな経験を積む中で、「**sqlライブラリの移行**」というタスクに立ち向かう機会がありました。

[**2024.05.20にししとうLT**](https://4410.connpass.com/event/316005/)では、時間の都合上話せなかった詳細について、この記事で補足したいと思います:relaxed:

(ちなみに、ししとうLTは私にとって人生初のLT登壇でした:joy: 記事執筆時点では、社外LTに聞く側でしか参加したことがないので、もし誘っていただけたら嬉しいですw)

– [資料はこちら ▼](#資料はこちら-)
– [`sqlx`から`pgx`への移行までの話](#sqlxからpgxへの移行までの話)
– [出したかったログの種類:writing\_hand:](#出したかったログの種類writing_hand)
– [色々なGoのSQLライブラリを検討:sunny:](#色々なgoのsqlライブラリを検討sunny)
– [`pq`につい

元記事を表示

依存性逆転の原則をGolangを用いて解説(SOLID原則)

## 目次
– [背景](#背景)
– [依存性逆転の原則(DIP)とは](#依存性逆転の原則dipとは)
– [コードを用いた説明](#コードを用いた説明golangでのmodel-view-controllerのケース)
– [従来の構成](#従来の構成)
– [依存性逆転(DIP)構成](#依存性逆転dip構成)
– [まとめ](#まとめ)
– [参考URL](#参考url)

## 背景
インターフェースの意義を調べていく中でSOLID、依存性逆転の原則について理解する必要があったため、これらの調査内容をまとめる。

## 依存性逆転の原則(DIP)とは

[SOLID](https://ja.wikipedia.org/wiki/SOLID)(オブジェクト指向に用いられる原則)の頭文字
S 単一責任の原則 (single-responsibility principle)
O 開放閉鎖の原則(open/closed principle)
L リスコフの置換原則(Liskov substitution principle)
I インターフェース分離の原則 (in

元記事を表示

golangci-lintを使ってみる

## はじめに
goでプログラミングした際に、文法間違いやエラーチェックが抜けている箇所を指摘してくれるgolangci-lintを使ってみます。

## golangci-lint インストール
“`zsh
brew install golangci-lint
brew upgrade golangci-lint
“`

## Goを書く
“`go
package main

import (
“net/http”
)

func middleware1(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“before middleware\n”))
next.ServeHTTP(w, r)
})
}

func middleware2(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.

元記事を表示

Goのnet/httpで、ミドルウェアを書いてみる

## はじめに
Goの標準パッケージを使ったプログラミングに慣れるために、net/httpだけでミドルウェアを書いてみました。

next.ServeHTTP(w, r)の前に書くか、後に書くかで、いつ処理されるかが決まるようです。

“`go
package main

import (
“net/http”
)

func middleware1(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(“before middleware\n”))
next.ServeHTTP(w, r)
})
}

func middleware2(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next.ServeHTTP(w, r

元記事を表示

OTHERカテゴリの最新記事